可否使用预装Ansible的Docker镜像实现对另一Docker容器的配置
该方案完全可行,是本地测试Ansible Playbook的主流轻量化方案,效率远高于准备独立物理机/虚拟机的测试方式。
绝大多数教程要求使用独立机器,是因为这类教程多面向生产部署场景教学,生产环境的被管理节点普遍为独立服务器/虚拟机,才会采用该类示例,并不代表容器化测试方案不可用。
1. 构建Ansible控制端镜像
创建控制端Dockerfile,内容如下:
# 基于轻量Python镜像构建 FROM python:3.11-slim # 安装依赖和Ansible RUN apt update && apt install -y openssh-client && \ pip install --no-cache-dir ansible && \ apt clean && rm -rf /var/lib/apt/lists/* # 设置工作目录 WORKDIR /playbooks
执行构建命令:docker build -t ansible-controller .
2. 准备被管理端容器
Ansible默认通过SSH连接节点,因此被管理容器需要预装openssh-server服务,创建被管理端Dockerfile示例:
FROM ubuntu:22.04 # 安装SSH服务 RUN apt update && apt install -y openssh-server sudo && \ # 配置允许root登录,设置测试密码(生产环境请勿使用该配置) echo 'root:test123' | chpasswd && \ sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && \ sed -i 's/UsePAM yes/UsePAM no/' /etc/ssh/sshd_config && \ apt clean && rm -rf /var/lib/apt/lists/* # 暴露SSH端口 EXPOSE 22 # 启动SSH服务 CMD ["/usr/sbin/sshd", "-D"]
构建并启动被管理容器,首先创建专用Docker网络方便容器间通信:docker network create ansible-test-net
构建被管理端镜像:docker build -t ansible-node -f Dockerfile.node .
启动被管理容器:docker run -d --name ansible-node --network ansible-test-net ansible-node
3. 执行Ansible配置管理
首先在本地创建inventory配置文件inventory.ini,内容如下:
[nodes] ansible-node ansible_user=root ansible_ssh_pass=test123
将Playbook文件和inventory文件放在本地playbooks目录下,启动控制端容器执行配置命令:docker run --rm -v $(pwd)/playbooks:/playbooks --network ansible-test-net ansible-controller ansible-playbook -i inventory.ini your_playbook.yml
- 生产环境Playbook测试建议使用SSH密钥代替明文密码配置,将本地SSH公钥内置到被管理端镜像中即可
- 无需将被管理端SSH端口映射到宿主机,同Docker网络下的容器可直接通过容器名通信,安全性更高
- 测试完成后可直接删除两个容器和自定义网络,不会在本地残留任何环境垃圾
内容的提问来源于stack exchange,提问作者Mark Gargan

