2016-09-06 16 views
1

ドッカーのインスタンスで、実行中のinitシステムに依存する "サービスが有効"なテストを組み込んだ場合、playbookテストを実行することは、 centos 7の場合、これはシステム化されるでしょう。dockerでsystemdサービスを使って可能なプレイブッブをテストする

明確にする:このテストでは、特定のOSインスタンスに対して不可能なプレイプレーンが正しく動作し、サポートする必要があり、ベアメタル/仮想マシンに展開できることを示します。

たとえば、この単純なnginx yamlスニペットをテストすると、service: state: started宣言が組み込まれています。

与えられたDockerfileを使用して
# ./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 

$ 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)で異なるOSバージョンのドッカーを使用していますか?

答えて

1

このblog posthttp://developers.redhat.comに基づき、これはドッカーに基づいて、テストのために働くかもしれませんが:

Dockerfile

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

私は個人的である、テストのためにVirtualbox多いVagrantを使用しますもちろんオプションもあります。しかし、あなたの場合、私は(テストされていない)Dockerfileをチャンス以上にしています。

+1

間違いなく 'CMD'指示文が1つだけで、' CMD ["/ usr/sbin/init"] 'でなければなりません。そして、このドッカー画像を使って、あなたは「docker run -d --name foo foo && sleep 10 && docker exec -ti foo ansible-playbook/provision/deploy.yml'を試して、プレイブックを開始することができます。 –

+0

ありがとうございます。私は私の答えを編集しました。 –

1

実際に私は、ターゲットホストとしてドッカーコンテナで非常に多くのAnsoftプレイブックをテストしています - そのトリックは、SystemDの "systemctl"への呼び出しを迂回することです...ちょうどスタートのハードワークを行う他のスクリプト/サービスを停止する。私のdocker-systemctl-replacementは、周りの* .serviceファイルを検査します...あなたが望むならば、CMD init-processとしても働くことができます。

関連する問題