Ejecución de Ansible en un contenedor Docker

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:

  1. Definir el contendor con el servicio SSH
  2. 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