使用Docker在本地环境中验证Ansible的运行

大家好,我是@niisan-tokyo。

这次我写了一篇关于我们公司使用的基础架构管理工具Ansible的文章,也同时作为自己的学习之用。

自动化部署工具

在“基础设施即代码”(infra as code)的理念下开发的基础设施配置管理工具中,有类似的工具如Chef、Itamae和Pappet等。请参考https://www.ansible.com/。

如果创建一个名为playbook的基础架构配置文件,Ansible可以通过一条命令连接到目标环境并按照配置文件设置来设置环境。这个的好处是,一旦完成设置,就可以创建无数个相同配置的基础架构。
当然,在完成配置文件之前,可能需要多次重试。
在这种情况下,考虑到可以方便地丢弃和重新生成验证环境,我想使用Docker来创建验证环境。

顺便说一下,我还创建了一个安装了Ansible的Docker镜像,以便即使在主机上没有安装Ansible,也可以立即进行验证。

实验环境

本次在OSX 11.10.5上,使用docker toolbox引入的环境进行验证。

建立验证环境

本次验证将使用在Ubuntu上安装的Ansible来模拟设置CentOS机器环境的情况。为此,我们将准备两个Docker镜像,一个是安装了Ansible的机器镜像,另一个是用于验证的CentOS机器镜像。

安装 Ansible 的计算机

使用ansible/Dockerfile来定义安装了Ansible的机器。

FROM ubuntu

RUN apt-get update && apt-get install -y software-properties-common && \
apt-add-repository ppa:ansible/ansible && apt-get update && apt-get install -y ansible

CMD /bin/bash

CentOS验证机

接下来,我们使用以下的Dockerfile(centos/Dockerfile)来定义CentOS的验证机器。

FROM centos:6.8

RUN yum -y install openssh-server

RUN ssh-keygen -f /etc/ssh/ssh_host_rsa_key -N '' -t rsa
RUN ssh-keygen -f /etc/ssh/ssh_host_ecdsa_key -N '' -t ecdsa

RUN sed -ri 's/^#PermitEmptyPasswords no/PermitEmptyPasswords yes/' /etc/ssh/sshd_config
RUN echo "root:" | chpasswd

EXPOSE 22

CMD ["/usr/sbin/sshd", "-D"]

详细地启动SSHD的原因是因为如果没有它,Ansible将无法连接。

将以下内容用中文表达,只需要一种选项:

docker-compose.yml 文件

我们可以分别构建上述两个Dockerfile,然后通过连接进行连接,但为了更好的可视化,可以准备以下docker-compose.yml文件,并进行相应的docker-compose设置来实现协作。

ersion: '2'
services:
    ansible:
        build: ansible
        volumes:
            - .:/var/data

    target:
        build: centos

确认行动

让我们启动以下的验证环境试试看。

$ docker-compose build
$ docker-compose up -d
$ docker-compose run ansible

通过这个,我认为你已经启动了Ansible容器,并进入了终端。

$ ansible --version
ansible 2.1.0.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides

现在已经可以使用Ansible这样的方式了
接下来,我们要确保可以通过ssh连接到用于验证的CentOS上。

root@75f8e4c375b5:/# ssh target
[root@80fbcbf5d857 ~]# exit
root@75f8e4c375b5:/#

成功了。

用于验证Ansible功能的测试。

用Ansible直接执行命令

接下来,让我们使用Ansible在CentOS验证环境中尝试打入命令。
首先,为了连接设置,我们准备以下文件(hosts)。

[target]
target

[target:vars]
ansible_user=root

让我们在命令行中尝试输入以下命令。

$ cd /var/data
$ ansible -i hosts target -vvvv -m ping
(略)
target | SUCCESS => {
    "changed": false,
    "invocation": {
        "module_args": {
            "data": null
        },
        "module_name": "ping"
    },
    "ping": "pong"
}

是的,因为出现了”SUCCESS”,所以是成功的。
-i指定了包含主机信息的文件位置。
-vvvv是用于记录详细日志的选项。
-m是指模块名称,表示Ansible提供的操作。
尽管是ping,但它的行为与我们通常使用的ping不同呢。

尝试安装 Vim

在CentOS验证环境中,默认情况下没有安装Vim。

$ ssh target
$ vim
-bash: vim: command not found
$ exit

所以,让我们通过 ansible 来尝试安装。

$ ansible -i hosts target -vvvv -m yum -a name=vim
$ ssh target
$ vim hoge

确实已经安装好了呢。
在这里,yum 是 Ansible 准备的模块名,实际上会执行 yum install -y。
-a 是传递给模块的参数。在这个例子中,指定了要安装的软件包名称为 name=vim。

尝试使用playbook

请在退出ansible环境之后,使用docker-compose删除CentOS验证环境的容器,并重新建立一个新的容器。

$ docker-compose stop
$ docker-compose rm target
$ docker-compose up -d
$ docker-compose run ansible
$ ssh target
$ vim
-bash: vim: command not found
$ exit

通过重新创建容器,回到了安装vim之前的状态。
可以像这样随意丢弃并更新验证环境。

最后,让我们使用playbook来运行Ansible。
准备以下文件。

- hosts: target
  tasks:
  - name: Install Vim
    yum: name=vim

所以,让我们尝试使用playbook执行命令。

$ ansible-playbook -i hosts playbook.yml

一会儿后处理将完成(可以使用-vvvv输出详细日志)

让我们最后确认一下

$ ssh target
$ vim hoge

可以确认已安装了vim。

总结

由于使用Ansible进行环境搭建越来越流行,因此我也跟风尝试了一下。
由于工作需要,我一直在创建验证环境,不知道你觉得如何呢?
嗯,虽然Vagrant也可以,但是如果不小心的话会一下子压满电脑硬盘,所以我选择了可以轻松删除的Docker。
那么,我就在这里告辞了。

请提供文本,以便我能够翻译。

阳平每天精进的XP
安装Ansible
Ansible yum模块
Ansible playbook

广告
将在 10 秒后关闭
bannerAds