在Docker中尝试Ansible的备忘录
为了什么
我想在docker容器中执行ansible命令,进行EC2的配置。
我在网上查了一下,只找到了”在docker容器中执行ansible命令进行镜像配置”这种选项…
因为我发现dockerhub上提供的选项似乎不太适合日常使用,所以我自己尝试着准备了 https://hub.docker.com/r/ansible/ansible。
本地环境
我使用的是Mac电脑。
# docker -v
Docker version 18.09.1, build 4c52b90
# docker-compose version
docker-compose version 1.23.2, build 1110ad01
docker-py version: 3.6.0
CPython version: 3.6.6
OpenSSL version: OpenSSL 1.1.0h 27 Mar 2018
文件结构
由于是免费试用版本,因此很简洁。
# tree
.
├── Dockerfile
├── docker-compose.yaml
├── hosts
└── operation.yaml
Dockerfile的意思是…
FROM alpine:latest
RUN apk --update add --no-cache \
ansible py3-pip \
openssh
RUN pip3 install --upgrade pip botocore boto3
RUN mkdir /root/.ssh
WORKDIR /home
ENTRYPOINT ["ansible"]
用 Python 3.7-alpine3.8 版本进行固定并没有太深的意义。这是因为通过 apk 安装的 Ansible 使用了 Python 3.6.6,因此在使用上述版本固定时(在下面的试验任务中没有遇到问题的类型),发现了一些问题。我正在更新 Dockerfile 的内容。这个没有意义的决定不是一个好选择。
docker-compose.yaml 可以被改写为 docker-compose.yml
version: '3'
services:
ansible:
build: .
volumes:
- ./:/home
- ~/.ssh/:/root/.ssh/
ansible-playbook:
build: .
entrypoint:
- ansible-playbook
volumes:
- ./:/home
- ~/.ssh/:/root/.ssh/
主办者
[targets]
t3-test
本次使用本地的 ~/.ssh/config 中設定的主機名。
由於卷掛載設定的關係,需要將私鑰放置在 ./ 或 ~/.ssh/ 目錄下。
操作.yaml
- hosts: targets
user: ec2-user
become: yes
tasks:
- file: path=/home/ec2-user/test state=directory owner=ec2-user group=ec2-user mode=0755
只需要创建一个测试文件。
用法
安装完上述的4个文件后,请执行以下命令。
docker-compose run --rm ansible 何某
docker-compose run --rm ansible-playbook 何某
在文件所在的目录上,只需在 docker-compose run –rm 之后以带参数的方式运行常用的 ansible/ansible-playbook 命令,即可正常运行。
# docker-compose run --rm ansible --version
ansible 2.5.5
config file = None
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.6/site-packages/ansible
executable location = /usr/bin/ansible
python version = 3.6.6 (default, Aug 24 2018, 05:04:18) [GCC 6.4.0]
大概就是这个样子吧。
因此,
# docker-compose run --rm ansible-playbook -i hosts operation.yaml -D
PLAY [targets] ******************************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************************
ok: [t3-test]
TASK [file] *********************************************************************************************************************************
--- before
+++ after
@@ -1,6 +1,6 @@
{
- "group": 0,
- "owner": 0,
+ "group": 500,
+ "owner": 500,
"path": "/home/ec2-user/test",
- "state": "absent"
+ "state": "directory"
}
changed: [t3-test]
PLAY RECAP **********************************************************************************************************************************
t3-test : ok=2 changed=1 unreachable=0 failed=0
能够完成。
总结
用docker-compose执行单个命令真是乐趣无穷!我觉得写一篇更加详细的文章可能会更好一点。
技巧 (jì
docker-compose的–rm选项的意思是“在命令执行完后删除容器”。即使忘记添加该选项,容器仍会正常运行,但最终会留下一些处于停止状态的容器。如果忘记添加并留下容器的话,可以使用以下方式进行清理。
docker-compose down