在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
bannerAds