使用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