在Docker容器中运行Ansible
Ansible容器
需要在离线环境下构建Ansible,但是收集和创建所有必要的软件包非常麻烦。要不把它们全部扔到Docker中如何?因此,我将Ansible基于Python的Docker容器化了。
顺便提一下,Official有一个叫做ansible/ansible的容器映像,它是作为Ansible自身的测试环境而提供的,里面并不包含Ansible。
Ansible/Ansible
用于自动化测试Ansible的镜像。它们不包含Ansible,也不适用于终端用户。
代码库
我已经在以下存储库上注册:
satken2/ansible – Docker Hub
Dockerfile:冷运输档案
这个内容非常简单。
为了在Ansible中使用SSH密码认证,需要先安装sshpass。
另外,根据要使用的模块不同,可能还需要安装额外的pip包,但由于无法一一列举,故未在此处提及。
FROM python:3.7.6-stretch
RUN pip install pip --upgrade
RUN pip install ansible
RUN apt-get update -y && \
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
sshpass
WORKDIR /work
执行Playbook
只要在保存Playbook的目录中执行以下命令,就可以运行Playbook。
docker run -v "${PWD}":/work:ro -v ~/.ansible/roles:/root/.ansible/roles -v ~/.ssh:/root/.ssh:ro --rm satken2/ansible ansible-playbook <YAML_FILENAME>
与通常的Ansible一样,ansible-playbook 是一样的。
命令说明
–删除选项
由于该容器并不是用来保持开机状态的,为了不污染环境,会在执行完毕后将其删除。
绑定
在此命令中定义了以下绑定。
$pwd
/work
ホストマシンのPlaybookをコンテナ内から読めるようにします~/.ansible/roles
/root/.ansible/roles
Ansible GalaxyでインストールしたRoleを永続化するためです~/.ssh
/root/.ssh
コンテナ内からターゲットマシンにSSH認証を通すため、ホストマシンの認証情報を共有します$pwd <-> /work 的翻译如下:
由于将Playbook复制到容器文件系统内并使用它们很麻烦,我们使用绑定来直接读取主机系统中的Playbook。
通过将主机的${PWD}绑定到容器内的工作目录/work,可以在执行命令时从容器内看到当前目录。
这是为了持久化安装在Ansible Galaxy上的Role而设立的。如果不使用Galaxy,则不需要这个目录。
按照Ansible的规范,通过Galaxy安装的Role将会被保存在以下目录中以供使用。~/.ansible/roles
-
- ~/.ansible/roles
-
- /usr/share/ansible/roles
- /etc/ansible/roles
这次请确保进入到~/.ansible/roles的最上层目录。
直接执行容器时,容器内的SSH客户端没有目标机器的身份验证信息,因此无法连接。
通过共享主机机器的.ssh目录,可以使容器内也能访问目标机器。
从Galaxy安装Role
在任意目录下执行以下命令,即可使用Ansible Galaxy安装角色。
docker run -v ~/.ansible/roles:/root/.ansible/roles --rm satken2/ansible ansible-galaxy install <ROLE_NAME>
一般情况下,与Ansible中的`ansible-galaxy install `相同。
命令说明
–删除选项
和之前一样,使用完后会删除。
绑定
将之前的Playbook执行和~/.ansible/roles的设置进行配合,使角色存储在/root/.ansible/roles中。
Bash别名
如果您将上述介绍的命令或其他常用命令注册为别名,您几乎可以在Docker上运行时无需意识到,就能使用Ansible。
注册
#!/bin/bash
alias ansible='docker run -v "${PWD}":/work:ro --rm satken2/ansible ansible'
alias ansible-playbook='docker run -v "${PWD}":/work:ro -v ~/.ansible/roles:/root/.ansible/roles -v ~/.ssh:/root/.ssh:ro --rm satken2/ansible ansible-playbook'
alias ansible-galaxy='docker run -v ~/.ansible/roles:/root/.ansible/roles --rm satken2/ansible ansible-galaxy'
alias ansible-vault='docker run -v "${PWD}":/work:ro --rm satken2/ansible ansible-vault'
使用时
可以像平常使用Ansible一样使用。
但请注意,在使用ansible-playbook时,必须确保先cd到Playbook目录,否则无法正常运行。
$ ansible -m ping
$ ansible-playbook site.yml