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