使用 Ansible 管理 Docker 容器:开关机、定时开关机及 VNC 控制
在实际运维中,我们常常需要对服务器进行 开机关机、定时开关机以及远程桌面控制(VNC)。如果你的受控节点是 Docker 容器,传统的 shutdown
命令在容器里无法使用,因为容器没有完整的 systemd 系统。
本文介绍一种 基于 Ansible + Docker 的简单实现方式,轻松实现容器开关机和管理。
1️⃣ 准备环境
1. 控制节点
- 安装 Ansible
- 安装 Docker,并确保能正常操作容器
- 安装 Ansible Docker 集合:
ansible-galaxy collection install community.docker
2. 受控节点
- 这里是 Docker 容器,不依赖 SSH 或 systemd
- 容器名称示例:
node1
2️⃣ 清单文件(inventory.ini)
[myhosts]
172.17.0.2[mydocker]
node1 ansible_host=127.0.0.1 ansible_port=2222 ansible_user=root ansible_password=201jq ansible_connection=ssh
[mydocker]
组用于 Docker 容器操作- 可以通过
ansible_host
和ansible_port
指定容器的 SSH 端口(可选,容器方式推荐直接操作 Docker)
3️⃣ 剧本文件(power_manage.yml)
- name: 服务器电源管理(Docker 容器方式)hosts: localhost # 控制节点直接操作 Dockergather_facts: novars:# 可选参数:shutdown(停止容器)、startup(启动容器)、reboot(重启容器)power_action: "shutdown" # 默认停止容器,可通过 --extra-vars 覆盖container_name: "node1" # 受控容器名称tasks:- name: 停止 Docker 容器community.docker.docker_container:name: "{{ container_name }}"state: stoppedwhen: power_action == "shutdown"- name: 启动 Docker 容器community.docker.docker_container:name: "{{ container_name }}"state: startedwhen: power_action == "startup"- name: 重启 Docker 容器community.docker.docker_container:name: "{{ container_name }}"state: restartedwhen: power_action == "reboot"
🔹 模块说明
-
community.docker.docker_container
:Ansible Docker 模块,用于管理容器状态 -
state
可选值:started
→ 启动容器stopped
→ 停止容器restarted
→ 重启容器
-
when
控制条件,根据传入变量执行不同操作
4️⃣ 使用方式
4.1 停止容器(模拟关机)
ansible-playbook -i inventory.ini power_manage.yml --extra-vars "power_action=shutdown"
输出示例:
TASK [停止 Docker 容器] ************************************************
changed: [localhost]TASK [启动 Docker 容器] ************************************************
skipping: [localhost]TASK [重启 Docker 容器] ************************************************
skipping: [localhost]
✅ 表示容器已成功停止。
4.2 启动容器(模拟开机)
ansible-playbook -i inventory.ini power_manage.yml --extra-vars "power_action=startup"
- 容器启动,输出会显示
changed: [localhost]
4.3 重启容器
ansible-playbook -i inventory.ini power_manage.yml --extra-vars "power_action=reboot"
- 容器会重启,输出同样显示
changed: [localhost]