2016-09-06 100 views
1

我想在docker实例中进行ansible-playbook测试是不可能的,这些测试在依赖依赖运行的init系统的“启用服务”测试时,在这种情况下,这将是systemd。使用docker中的systemd服务测试ansible playbook

要清楚:测试的目的在于证明在一组给定的操作系统实例上,正确的操作系统能够正常工作,它必须支持,并且将在裸机/虚拟机上部署可执行的脚本。

因此,例如,测试这个简单的nginx yaml片段合并了一个service: state: started声明。

# ./ansible-nginx/tasks/install_nginx.yml 

- name: NGINX | Installing NGINX repo rpm 
    yum: 
    name: http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm 

- name: NGINX | Installing NGINX 
    yum: 
    name: nginx 
    state: latest 

- name: NGINX | Starting NGINX 
    service: 
    name: nginx 
    state: started 

使用Dockerfile给出:

$ cat Dockerfile 
FROM ansible/centos7-ansible:stable 

WORKDIR /provision 

COPY hosts /etc/ansible/ 
COPY ansible-nginx /provision 

CMD ["ansible-playbook", "deploy.yml"] 

失败,出现错误的位置:

$ docker run -it foo 

PLAY [localhost] *************************************************************** 

TASK [setup] ******************************************************************* 
ok: [localhost] 

TASK [NGINX | Installing NGINX repo rpm] *************************************** 
changed: [localhost] 

TASK [NGINX | Installing NGINX] ************************************************ 
changed: [localhost] 

TASK [NGINX | Starting NGINX] ************************************************** 
fatal: [localhost]: FAILED! => {"changed": false, "failed": true, "msg": "no service or tool found for: nginx"} 

NO MORE HOSTS LEFT ************************************************************* 
[WARNING]: Could not create retry file 'deploy.retry'.   [Errno 2] No such file or directory: '' 


PLAY RECAP ********************************************************************* 
localhost     : ok=3 changed=2 unreachable=0 failed=1 

会是一个什么方式来测试使用systemd(因为它们将被执行ansible脚本在baremetal/VM)在不同的操作系统版本上使用码头?

回答

1

在此基础上blog posthttp://developers.redhat.com这可能基于泊坞测试工作:

FROM ansible/centos7-ansible:stable 

RUN yum -y update; yum clean all 
RUN yum -y install systemd; yum clean all; \ 
(cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i ==  systemd-tmpfiles-setup.service ] || rm -f $i; done); \ 
rm -f /lib/systemd/system/multi-user.target.wants/*;\ 
rm -f /etc/systemd/system/*.wants/*;\ 
rm -f /lib/systemd/system/local-fs.target.wants/*; \ 
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \ 
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \ 
rm -f /lib/systemd/system/basic.target.wants/*;\ 
rm -f /lib/systemd/system/anaconda.target.wants/*; 
VOLUME [ "/sys/fs/cgroup" ] 
CMD ["/usr/sbin/init"] 

docker run -d --name foo foo && sleep 10 && docker exec -ti foo ansible-playbook /provision/deploy.yml

Dockerfile我个人使用VagrantVirtualbox很多关于测试,这是当然也是一种选择。但在你的情况下,我会(未经测试的)Dockerfile超过一个机会。

+1

绝对应该只有一个'CMD'指令,它应该是'CMD [“/ usr/sbin/init”]'。通过这个docker映像,你可以尝试'docker run -d -name foo foo && sleep 10 && docker exec -ti foo ansible-playbook/provision/deploy.yml'来启动剧本。 –

+0

谢谢,这似乎是合理的。我编辑了我的答案。 –

1

实际上,我正在测试Ansible剧本相当多的一个码头容器作为目标主机 - 诀窍是将呼叫转移到SystemD的“systemctl”...转移到另一个脚本,只是做了艰苦的工作开始/停止服务。我的docker-systemctl-replacement将检查* .service文件,如果您愿意,它也可以作为CMD init-process。