使用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 相关选项或者编译并安装的方式来减小大小呢?

 

因为我对容器镜像的减肥没有那么大的兴趣,所以我暂时就结束这次讨论吧。

广告
将在 10 秒后关闭
bannerAds