2016-09-06 1 views
1

Je suppose qu'il n'est pas possible, respectivement utile, d'effectuer des tests ansible-playbook dans une instance de docker, lorsqu'ils intègrent des tests "service enabled" qui reposent sur un système init en cours, dans ce cas de centos 7 cela serait systemd. Pour être clair: Les tests visent à montrer que le playbook ansible fonctionne correctement sur un ensemble d'instances de système d'exploitation donné, qu'il doit prendre en charge, et que les scripts ansible seront déployés sur des machines virtuelles/bare metal. Par exemple, le test de cet extrait nginx yaml simple incorpore une déclaration service: state: started.Test de lisibilité ansible avec les services systemd dans docker

# ./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 

en utilisant les Dockerfile donné:

$ cat Dockerfile 
FROM ansible/centos7-ansible:stable 

WORKDIR /provision 

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

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

échoue avec l'erreur ici:

$ 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 

Quelle serait un moyen de tester les scripts Ansible qui utilisent systemd (parce qu'ils seront exécutés sur baremetal/vm) en utilisant docker sur différentes versions de l'OS?

Répondre

1

Sur la base de cette blog posthttp://developers.redhat.com cela pourrait fonctionner pour le test basé sur Docker:

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

J'utilise personnellement Vagrant avec Virtualbox beaucoup pour les tests, ce qui est bien sûr aussi une option. Mais dans votre cas, je voudrais (non testé) Dockerfile au-dessus d'une chance.

+1

Il ne devrait y avoir qu'une seule directive 'CMD' et devrait être' CMD ["/ usr/sbin/init"] '. Et avec cette image docker vous pouvez essayer 'docker run -d - nom foo foo && sleep 10 && docker exec -ti foo ansible-playbook/provision/deploy.yml' pour démarrer le playbook. –

+0

Merci, cela semble plausible. J'ai édité ma réponse. –

1

En fait, je teste beaucoup les playbooks Ansible avec un conteneur docker comme hôte cible - l'astuce consiste à rediriger les appels vers systemctl "systemctl" ... vers un autre script qui fait juste le dur travail de démarrage/arrêter les services. Mon docker-systemctl-replacement va inspecter les fichiers * .service autour ... il peut également fonctionner comme le processus d'initialisation CMD si vous le souhaitez.