Docker 实战系列(六):用最小化 Ansible 镜像一键批量部署 Nginx
在上一期中,我们构建了一个只有几十 MB 的 Ansible 轻量化镜像,可以直接作为自动化运维的基础环境。
今天我们将直接用它来完成一个常见的运维任务:一键批量部署 Nginx。
一、目标
- 用我们上篇的
ansible-minimal镜像 - 部署 Nginx 到多台远程服务器
- 全过程只需 一条 Docker 命令
- 部署过程可复用(可扩展成任意服务安装)
二、准备条件
- 几台可以 SSH 登录的测试服务器(云主机或本地 VM)
- 已配置好 SSH 公钥免密登录(Ansible 免密执行任务更流畅)
- 上一篇构建好的
ansible-minimal:1.0镜像
Tips: 公钥免密登录(配置过可忽略此步骤)
ssh-keygen -t rsa -b 2048 -N '' -f ~/.ssh/id_rsa
ssh-copy-id $IPs #$IPs为所有节点地址包括自身,按照提示输入yes 和root密码
如果你的 Ansible 容器固定在某台具体的操作机上,你可以将主机的公私钥挂载到容器中,容器使用主机的公钥和私钥,简化配置:-v /root/.ssh:/root/.ssh
三、项目结构
ansible-nginx/
├── hosts
└── site.yml
hosts(Ansible inventory 文件):
[webservers]
192.168.10.21
192.168.10.22
192.168.10.23
site.yml(Playbook 文件):
---
- hosts: webservers
become: true
tasks:
- name: 安装 Nginx
ansible.builtin.package:
name: nginx
state: present
- name: 启动并启用 Nginx
ansible.builtin.service:
name: nginx
state: started
enabled: yes
四、执行部署
用 Docker 启动 Ansible 容器,映射当前目录进去:
docker run --rm \
-v $(pwd):/ansible \
ansible-minimal:1.0 \
ansible-playbook site.yml -i hosts
以上配置可以增加 -v /root/.ssh:/root/.ssh 来挂载主机的私钥:
[root@ip-172-31-6-116 ansible-docker]# ls /root/.ssh/* -l
-rw-------. 1 root root 992 Aug 12 10:42 /root/.ssh/authorized_keys
-rw-------. 1 root root 1876 Aug 12 10:42 /root/.ssh/id_rsa
-rw-r--r--. 1 root root 434 Aug 12 10:42 /root/.ssh/id_rsa.pub
执行结果:
PLAY [webservers] *********************************************************************
TASK [Gathering Facts] ****************************************************************
ok: [192.168.10.21]
ok: [192.168.10.22]
ok: [192.168.10.23]
TASK [安装 Nginx] ********************************************************************
changed: [192.168.10.21]
changed: [192.168.10.22]
changed: [192.168.10.23]
TASK [启动并启用 Nginx] **************************************************************
ok: [192.168.10.21]
ok: [192.168.10.22]
ok: [192.168.10.23]
PLAY RECAP ****************************************************************************
192.168.10.21 : ok=3 changed=1 unreachable=0 failed=0
192.168.10.22 : ok=3 changed=1 unreachable=0 failed=0
192.168.10.23 : ok=3 changed=1 unreachable=0 failed=0
五、验证部署结果
在任意一台目标服务器上运行:
curl -I http://localhost
输出:
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: ...
表示 Nginx 已正常运行。
六、这样做的好处
| 传统方式 | 容器化 Ansible 方式 |
|---|---|
| 先在宿主机安装 Ansible,再执行 Playbook | 直接运行 Docker 镜像,无需安装 |
| 可能受宿主机环境影响(Python 版本、依赖) | 镜像内依赖固定,环境一致 |
| 执行环境不可复用 | 镜像可在任意地方拉取复用 |
七、进阶扩展
这个 Playbook 可以轻松扩展:
- 添加 Nginx 配置模板渲染(
template模块) - 配置 HTTPS 证书(
copy模块 +openssl生成) - 部署其他 Web 服务(PHP、Node.js 等)
- 集成到 CI/CD 管道(如 GitLab CI、Jenkins)
八、小结
到这里,我们就用上一篇的 Ansible 轻量化镜像,实现了一个真实的运维任务:批量部署 Nginx。
整个过程 无需在宿主机安装 Ansible,执行环境高度一致,非常适合团队协作和持续交付场景。
📬 如果你喜欢这类深入浅出的技术解析,欢迎点赞 + 收藏 + 转发支持我继续创作!欢迎留言,我们下期见!
📣 更多原创内容、技术干货,欢迎关注「键上江湖」公众号,与你一键相逢!
1207

被折叠的 条评论
为什么被折叠?



