在wercker上自动执行Ansible和Severspec

到了2016年,由于wercker的规格变更,这将不能运行。

简介

每次将代码推送到Github时,我们已经在wercker上配置了自动执行Ansible Playbook和Serverspec测试。
这是为了配合我的ansible-Redmine v3.0.2版本进行的。
以前我们是通过启动Vagrant来进行确认,但现在每次推送到Github时都会自动执行,这样会更加方便。

在制作过程中,我参考了以下条目。

使用CircleCI在Docker容器中使用ansible并进行serverspec测试。
使用[drone] OSS版Drone在Docker容器中使用ansible并进行serverspec测试。

和俄文表明不同,这里有以下三个方面不同之处。

    • wercker以外の別のDockerホストの環境でも使いやすいことを目指した。

 

    • AnsibleとServerspec専用のコンテナを用意した。

 

    Ansibleの実行先に専用のコンテナを用意することで、実行先の設定を予め固定するなど実際の環境になるべく近いようにした。

我已经在ansible-Redmine中设置了wercker.yml,并且使用wercker – ANSIBLE-REDMINE进行了执行。
如果将wercker.yml改写为shell脚本,我认为可以在其他Docker主机上轻松执行。

wecker_and_docker.png

volanja/docker-ruby2.2.0容器

這是基於 CentOS6 的容器,已經安裝了 Ruby2.2.0。
由於每次安裝 Redmine 都需要安裝 Ruby 而時間不夠,我們提前準備好了。

我使用Docker的自动构建功能创建了这个。
Docker Hub – volanja/docker-ruby2.2.0
SSH密钥在每次构建时都会创建,并使用卷进行传递。
启动后将进行SSH公钥的配置等操作。

docker run -d -P --cap-add=NET_ADMIN --hostname=cadence -v `pwd`/ssh:/var/tmp:rw --name target volanja/docker-ruby2.2.0
echo 'service sshd restart; mkdir /root/.ssh/ ; cat /var/tmp/authorized_keys >> /root/.ssh/authorized_keys' | /usr/local/bin/docker-enter target

在Docker容器上进行的iptables设置

Docker Hub – 关于volanja/docker-ruby2.2.0的注意事项。

在 Ansible 的 playbook 中,我们会对 iptables 的配置文件(/etc/sysconfig/iptables)进行修改,并重新启动 iptables。但在 Docker 上存在两个问题,我们已经做出了相应的处理。

    • /etc/sysconfig/iptablesがない。

 

    • centos:centos6にはファイルがありません。

 

    • そこで、Dockerコンテナのビルド時にCOPYすることで対応しました。

 

    • iptablesの再起動が出来ない。

 

    • dockerコンテナのビルド時にecho ‘IPTABLES_MODULES_UNLOAD=no’ >> /etc/sysconfig/iptables-configを行うと共に、docker runの実行時に–cap-add=NET_ADMINを付加することで対応しました。

 

    • 次のエントリを参考にさせて頂きました。

 

    Dockerコンテナ内で service iptables stop/status をエラーにしない

卷杜克/安装剂容器

这是一个基于CentOS 6的容器,安装了Ansible和Serverspec。
我们使用Docker的Automated Build来创建它。
在每次构建中,我们都会生成SSH密钥,并使用volume来传递。
我们还使用volume来传递Ansible Playbook。
在设置SSH密钥之后,我们会执行Ansible Playbook和Serverspec的运行。

docker run -d -P --name serv --link target:dest -v `pwd`:/root:rw -v `pwd`/ssh:/var/tmp:rw -t volanja/docker-ansible
echo 'env; mkdir ~/.ssh; cp /var/tmp/id_rsa_docker ~/.ssh/id_rsa ; chmod 600 ~/.ssh/id_rsa ' | /usr/local/bin/docker-enter serv
echo 'cd /root; ansible-playbook site_wercker.yml -i hosts_wercker' | /usr/local/bin/docker-enter serv
echo 'cd /root; rake serverspec:Install_Redmine' | /usr/local/bin/docker-enter serv

Docker-ansible和docker-ruby2.2.0之间的通信

Docker 链接

利用Docker中的“Links”机制在两个容器之间进行通信。这允许仅使用容器进行通信。

首先启动docker-ruby2.2.0容器。

# (必要な部分のみ抜粋)
docker run -d -P --name target volanja/docker-ruby2.2.0

接下来,我们将以将docker-ansible容器链接到docker-ruby2.2.0容器的方式启动。
如果使用links选项,则指定容器名称:别名。我们将别名设置为dest。

# (必要な部分のみ抜粋)
docker run -d -P --name serv --link target:dest -t volanja/docker-ansible

在docker-ansible容器中,docker-ruby2.2.0容器的IP地址和端口信息将被写入环境变量和/etc/hosts中。在Ansible的hosts信息中,指定了dest。

/usr/local/bin/docker-enter serv
env |grep DEST
DEST_PORT=tcp://172.17.0.8:22
DEST_PORT_22_TCP=tcp://172.17.0.8:22
DEST_PORT_80_TCP=tcp://172.17.0.8:80
DEST_PORT_22_TCP_ADDR=172.17.0.8
DEST_PORT_80_TCP_ADDR=172.17.0.8
DEST_ENV_RUBY_VERSION=2.2.0
DEST_PORT_22_TCP_PORT=22
DEST_PORT_80_TCP_PORT=80
DEST_NAME=/serv/dest
DEST_PORT_22_TCP_PROTO=tcp
DEST_PORT_80_TCP_PROTO=tcp
cat /etc/hosts |grep dest
172.17.0.8  dest

我参考了下面的条目:
关于Docker容器之间的link和database.yml的写法。

SSH密钥共享

使用docker-ansible与docker-ruby2.2.0建立SSH连接。
SSH密钥将在每次wecker上创建,并通过共享目录传递给各个容器。

创建SSH密钥

mkdir `pwd`/ssh
ssh-keygen -f `pwd`/ssh/id_rsa_test -N ''
cat `pwd`/ssh/id_rsa_test.pub >> `pwd`/ssh/authorized_keys

使用Docker时的注意事项

wercker的Docker不支持使用docker exec。

编写wercker.yml时需要注意的要点。

Docker的版本太旧,无法使用docker exec。作为替代方案,我们安装并使用jpetazzo/nsenter的docker-enter。

$ docker -v
Docker version 1.2.0, build fa7b24f

以上

bannerAds