2016-09-06 98 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。