Ansible es una herramienta open source, gestor de configuración, despliegue y orquestación. Su objetivo es automatizar tareas de IT para aumentar la productiviidad en tareas de configuración y despliegue. El mecanismos utilizado es la definición de playbooks con la declaración de las tareas.
Docker es un proyecto open source que permite el despliegue de aplicaciones en contenedores software en múltiples sistemas operativos.
Para trabajar con Ansible desplegando en un contenedor Docker es necesario definir un contenedor con un servicio SSH para que Ansible se pueda conectar y ejecutar los playbooks que se definen. Para realiizar esta tarea, necesitamos lo siguiente:
- Definir el contendor con el servicio SSH
- Configurar y definir el playbook de Ansible.
Docker
Lo primero que debemos de realizar es definir una Dockerfile con la configuración de la imagen del contenedor que contenga un servidor SSH. Para ello, nos basaremos en la documentación existente en la documentación de docker.
La modificación a realizar es insertar el valor de la password del usuario root. El resultado del fichero es el siguiente:
FROM ubuntu:16.04 RUN apt-get update && apt-get install -y openssh-server RUN mkdir /var/run/sshd RUN echo 'root:root' | chpasswd RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config # SSH login fix. Otherwise user is kicked off after login RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd ENV NOTVISIBLE "in users profile" RUN echo "export VISIBLE=now" >> /etc/profile EXPOSE 22 CMD ["/usr/sbin/sshd", "-D"]
Para realizar la construcción de la imagen, debemos de ejecutar el siguiente comando:
docker image build -t alvaroms/ubuntu-serverssh:v1 .
Para arrancar el contenedor con la imagen creada anteriormente, ejecutamos el siguiente comando:
docker container run -d --name dockerssh -p 50022:22 alvaroms/ubuntu-serverssh:v1
Una vez arrancado el contenedor, debemos de obtener la IP asignada; para ello, debemos de inspeccionar la configuración del contenedor para obtener la IP del Gateway; esta operación, la realizamos con el siguiente comando:
docker container inspect dockerssh | grep Gateway
Suponiendo que la Ip obtenida es la 172.17.0.1, la conexión ssh la realizamos con el siguiente comando:
ssh -p 50022 root@172.17.0.1
Para completar la operación, deberemos de introducir la password definida en el fichero Dockerfile.
Ansible
Para trabajar con Ansible he definido un usuario con nombre Ansible y los permisos adecuados.
En el fichero /home/ansible/inventory inserto las siguiente líneas:
[all:vars] ansible_connection=ssh ansible_user=root ansible_ssh_pass=root [...] [dockers] ubuntu-sshserver ansible_port=50022 ansible_host=172.17.0.1
Con estas modificaciones definimos las credenciales de conexión al contenedor Docker y definimos la configuración del contenedor para utilizarla en los playbook.
Definimos una playbook con el cual nos permite instalar Git. El playbook es el siguiente:
--- # install git on target host - hosts: ubuntu-sshserver become: yes tasks: - name: install git yum: name: git state: latest
Para la ejecución del playbook ejecutamos el siguiente comando:
ansible-playbook -i /home/ansible/inventory ./git-setup.yml
Para verificar la correcta instalación, nos conectamos al contenedor por SSH y obtenemos la versión de git los comandos son:
ssh -p 50022 root@172.17.0.1 docker>git --version