在Docker容器中执行Ansible
■首先
这是上一篇文章的续篇。上一篇我们在Azure虚拟机中安装了Docker,并创建了“Jenkins”的Dokerfile来进行构建,并直接通过SSH连接到了每个容器。这次我们将在Docker主机上创建Ansible的Dockerfile,并在容器和主机上分别执行playbook。
另外,根据以下环境,最终我们将访问Azure环境,因此我们也将在Ansible容器中进行连接设置,使其能够连接到Azure环境。
■计划 (yǔ
V1:从Docker安装、Dockerfile(使用Jenkins)创建到启动镜像,直接SSH进入容器
URL:Docker的安装和DockerFile
V2:启动Ansible镜像,设置容器间SSH连接,确认Ansible的运行状态
URL:在容器间使用Ansible进行连接和运行
V3:配置Jenkins(通过Jenkins进行SSH连接),执行任务到远程主机
URL:通过Jenkins在容器间进行连接和任务执行
V4:使用AnsiblePlaybook(创建AZVM和相关资源),确认运行状态(从Jenkins执行)
URL:使用Ansible进行云设施构建(Azure)
■形象

■环境
【Docker主机】
AzureVM:CentOS
主机名:VMDO01
端口:ssh,7033,8033
【容器 1(jenkins 容器)】
容器角色:jenkins
※这是在前一篇文章中创建的容器。
请注意以下要求:
– 必须拥有Azure账户。
– 机器需要可以登录Azure。
■要做的事情
【1】创建Ansible容器
【2】建立SSH连接
【3】确认Ansible运行
■步骤
【1】创建Ansible容器
(1) 登录到Docker主机
(2) 创建用于存储Dockerfile的目录
mkdir -p /doc.file/docansible
(3). 创建Dockerfile(Ansible)
※ 使用这个步骤可以在[Ansible容器]中批量安装和配置所需的软件包。通过创建Dockerfile,只要有Docker在任何环境中都可以使用。
vi /doc.file/docansible/dockerfile
# OS
FROM centos
# SSH,Python,PIP等 pkg install
RUN yum install -y gcc libffi-devel python-devel openssl-devel epel-release
RUN yum install -y openssh-server openssh-clients sshpass
RUN curl -kL https://bootstrap.pypa.io/get-pip.py | python
# Ansible Install
RUN pip install ansible[azure]
# ms azurecli 2.0 public key import
RUN rpm --import https://packages.microsoft.com/keys/microsoft.asc
# azurecli repogistory
RUN sh -c 'echo -e "[azure-cli]\nname=Azure CLI\nbaseurl=https://packages.microsoft.com/yumrepos/azure-cli\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/azure-cli.repo'
# ms azurecli 2.0 install
RUN yum install -y azure-cli
# root password
RUN echo p@ssw0rd | passwd --stdin root
# ssh root login (非推奨)
RUN sed -ri "s/#PermitRootLogin yes/PermitRootLogin yes/g" /etc/ssh/sshd_config
(4). 建立 Dockerfile(Ansible 容器)的构建
[root@VMDO001 docansible]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos/jenkinsbuild latest 0640197d6307 17 hours ago 728.7 MB
docker.io/centos latest ff426288ea90 6 weeks ago 207.2 MB
[root@VMDO001 docansible]#
docker build -t centos/ansiblebuild .
[root@VMDO001 docansible]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos/ansiblebuild latest d76b6362598e 5 minutes ago 713.7 MB
centos/jenkinsbuild latest 0640197d6307 17 hours ago 728.7 MB
docker.io/centos latest ff426288ea90 6 weeks ago 207.2 MB
[root@VMDO001 docansible]#
(5).启动容器(Ansible容器)
docker ps -a
docker exec -it <containerID> /bin/bash
[root@VMDO001 docansible]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f04c65ff3b0 centos/ansiblebuild:latest "/sbin/init" 14 seconds ago Up 12 seconds tiny_aryabhata
30aaa962d65f centos/jenkinsbuild "/sbin/init" 17 hours ago Up 17 hours 0.0.0.0:7033->22/tcp, 0.0.0.0:8033->8080/tcp elated_hawking
[root@VMDO001 docansible]# docker exec -it 1f04c65ff3b0 /bin/bash
[root@1f04c65ff3b0 /]#
确认安装了 Ansible 和 Azure cli。
# Ansible Version check
ansible --version
# AzureCLI
az
[root@1f04c65ff3b0 /]# ansible --version
ansible 2.4.3.0
config file = None
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Aug 4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]
[root@1f04c65ff3b0 /]# az
Welcome to Azure CLI!
---------------------
Use `az -h` to see available commands or go to https://aka.ms/cli.
Telemetry
---------
The Azure CLI collects usage data in order to improve your experience.
The data is anonymous and does not include commandline argument values.
The data is collected by Microsoft.
You can change your telemetry settings with `az configure`.
/\
/ \ _____ _ _ ___ _
/ /\ \ |_ / | | | \'__/ _\
/ ____ \ / /| |_| | | | __/
/_/ \_\/___|\__,_|_| \___|
Welcome to the cool new Azure CLI!
<…>
[root@1f04c65ff3b0 /]#
【2】SSH连接
检查[Jenkins容器]是否可以以root身份通过SSH连接到[主机]。前提条件是双方都安装了SSH服务器和客户端包,并且可以使用[root]进行登录。
由于此处已经在Dockerfile中进行了安装和配置,因此只需要确认设置并进行连接测试即可。
确定设置
[root@1f04c65ff3b0 /]# cat /etc/ssh/sshd_config | grep PermitRootLogin
PermitRootLogin yes
# the setting of "PermitRootLogin without-password".
[root@1f04c65ff3b0 /]#
[root@30aaa962d65f ~]# cat /etc/ssh/sshd_config | grep PermitRootLogin
PermitRootLogin yes
# the setting of "PermitRootLogin without-password".
[root@30aaa962d65f ~]#
(2)连接确认
※要求同时可以从Ansible容器和Jenkins容器中执行。
ssh root@<hostIP>
ssh root@<Container1-IP>
[root@1f04c65ff3b0 /]# ssh root@<hostIP>
The authenticity of host '<hostIP> (<hostIP>)' can't be established.
ECDSA key fingerprint is SHA256:olqZGuW0g+q2EwXoM5bBidy9b1CiEbGMcylPDjuR/Lc.
ECDSA key fingerprint is MD5:4f:ea:fc:31:3e:b9:35:e8:c0:b0:23:04:76:1c:59:66.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '<hostIP>' (ECDSA) to the list of known hosts.
Password: <Password>
Last login: Thu Feb 22 02:15:46 2018 from <接続先(作業端末)IP>
[root@VMDO001 ~]#exit
[root@1f04c65ff3b0 /]#
[root@1f04c65ff3b0 /]#
[root@1f04c65ff3b0 /]# ssh root@<Jenkinsコンテナ-IP>
The authenticity of host '<Jenkinsコンテナ-IP> (<Jenkinsコンテナ-IP>)' can't be established.
ECDSA key fingerprint is SHA256:olqZGuW0g+q2EwXoM5bBidy9b1CiEbGMcylPDjuR/Lc.
ECDSA key fingerprint is MD5:4f:ea:fc:31:3e:b9:35:e8:c0:b0:23:04:76:1c:59:66.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '<Jenkinsコンテナ-IP>' (ECDSA) to the list of known hosts.
Password: <Password>
Last login: Thu Feb 22 02:15:46 2018 from <接続先(作業端末)IP>
【3】. 确认Ansible是否正常运行
在之前的文章中,我們會使用「ansible容器」來對之前建立的「jenkins容器」和「Docker主機(VMDO01)」執行「ansible」。透過成功執行此步驟,我們可以確認Ansible的運作狀態。
【注意】
请注意,对于ansible,连接至Linux时需要使用SSH。如果在清单文件中未进行配置,将需要提供密码。此外,在对ansible容器进行连接时,需要确保sshpath(已在Dockerfile中安装)已经安装,否则会出现错误。
此外,在创建的清单文件中,可以通过指定变量来阻止在执行命令时要求密码的设置。然而,由于该设置计划在“V3”版本中实施,所以本次将在清单文件中不指定变量进行连接确认。
(1)创建清单文件
mkdir /playbook
vi /playbook/hosts
[con]
<Jenkinsコンテナ-IP>
[hostmachine]
<hostIP>
(2)执行Ping(ansible)操作
# for container
# -u <user> : <user>でのAnsibleの実行
# -k : SSHパスワードを自分で入力する
ansible con -i /playbook/hosts -m ping -u root -k
# for hostserver
ansible hostmachine -i /playbook/hosts -m ping -u root -k
[root@1f04c65ff3b0 /]# ansible con -i /playbook/hosts -m ping -u root -k
SSH password:
<Jenkinsコンテナ-IP> | SUCCESS => {
"changed": false,
"ping": "pong"
}
[root@1f04c65ff3b0 /]# ansible hostmachine -i /playbook/hosts -m ping -u root -k
SSH password:
<hostIP> | SUCCESS => {
"changed": false,
"ping": "pong"
}
[root@1f04c65ff3b0 /]#
总结
这次我在Docker容器中安装并运行了Ansible。作为感想,我觉得在容器机器上构建Ansible时需要注意SSH方面的问题。实际上,初始启动时容器中并没有安装SSH。所以我在这次操作中使用了Dockerfile进行安装。
另外,为了运行Ansible,除了需要安装”Open-ssh”的服务器和客户端,还需要安装”sshpath”。如果没有安装”sshpath”,即使成功连接,Ansible也会失败。
由于我们已经成功创建了Jenkins和Ansible的环境,接下来我们希望专注于Jenkins的配置和playbook(用于创建Azure资源)。