使用Dockerfile和Docker Compose构建Ansible执行环境
首先
我修改了许多人发布的docker-compose.yml文件,并使用它,但我从未自己从头开始创建Dockerfile和docker-compose.yml文件。因此,作为学习Docker的一部分,我进行了一些实验,准备了Ansible的执行环境。我在这里记下来作为备忘录。
达成目标
-
- Dockerfile, docker-compose.ymlを自分で最初から作成する。勉強目的なので、そこまで内容は凝らない
-
- Dockerで作成するのはAnsible実行環境とする(自分の知識の中でちょうどいいのがこれだった)
- 実行時の手間を削減するためAnsible実行時はコンテナ内に入らずdocker execで実行できるようにする
目录结构
.
`-- ansible
|-- Dockerfile
|-- ansible_dir
| |-- conf
| | |-- ansible.cfg
| | |-- ansible.cfg.org
| | `-- hosts
| `-- playbook
| `-- ping.yml
`-- docker-compose.yml
Dockerfile 的意思是:
FROM alpine
RUN apk --update-cache --no-cache add py3-pip openssh sshpass \
&& pip3 install ansible
操作系统是轻量级容器镜像的Alpine Linux。
使用pip安装Ansible。因此根据pip的安装和Ansible执行时显示的错误消息安装openssh和sshpass。
顺便提一下,加上或不加上–no-cache选项会有大约2MB的差异。
–update-cache似乎是执行apk update的选项。由于没有确认,真实性不确定。
docker-compose.yml -> Docker组合.yml
version: '3'
services:
ansible:
build:
context: .
dockerfile: Dockerfile
image: ansible:latest
container_name: ansible
environment:
- ANSIBLE_CONFIG=/opt/conf/ansible.cfg
volumes:
- ./ansible_dir:/opt/
working_dir: /opt/playbook
command: tail -f /dev/null
通过环境变量ANSIBLE_CONFIG指定ansible.cfg文件的路径,并通过编辑ansible.cfg文件来设置参数。为了避免每次都进入容器来编辑ansible.cfg、hosts文件和playbook的麻烦,我们将其存放在主机的ansible_dir目录下,并使用绑定挂载的方式,使得可以在容器中进行修改。通过将working_dir设置为playbook的存放位置,当尝试在./ansible_dir/playbook/目录下执行ansible-playbook命令时,指定playbook变得更加方便。使用command可以避免容器停止的问题,也可以将其写入Dockerfile中。
以下是一个Ansible的执行示例。
测试文件
库存文件
[test]
192.168.1.8
[all:vars]
ansible_user=<user name>
ansible_password=<password>
配置Ansible
[defaults]
inventory = /opt/conf/hosts
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
由于每次指定库存文件都很麻烦,所以请先指定。
在首次访问或重新创建服务器时,由于指纹相关的错误很麻烦,所以请参考以下内容设置ssh选项。
据说,启用ControlMaster和ControlPersist选项可以加快Ansible的处理速度,因此我参考并直接复用了这些选项。
测试用playbook
因为只是为了测试,所以只需要ping模块。
- hosts: all
gather_facts: true
tasks:
- name: ping test
ping:
考试 shì)
我已经执行了ansible和ansible-playbook命令。我确认两者都可以正常运行。
[root@docker ansible]# docker exec -it ansible ansible 192.168.1.8 -m ping
192.168.1.8 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
[root@docker playbook]# docker exec -it ansible ansible-playbook -l 192.168.1.8 ping.yml
PLAY [all] **************************************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************************************
ok: [192.168.1.8]
TASK [ping test] ********************************************************************************************************************************************
ok: [192.168.1.8]
PLAY RECAP **************************************************************************************************************************************************
192.168.1.8 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
最后
简单的东西,但是我成功地创建了 Dockerfile 和 docker-compose.yml 文件。
这次使用 Alpine Linux 来创建 Ansible 的容器镜像,大小为 457MB,但是看到下面的存储库,似乎可以缩小到 367MB。因为我是使用 pip 安装的,所以是否可以通过重新审视 pip 相关选项或者编译并安装的方式来减小大小呢?
因为我对容器镜像的减肥没有那么大的兴趣,所以我暂时就结束这次讨论吧。