miércoles, 28 de mayo de 2014

Bootstrap con Ansible

La semana pasada en el grupo DevOps de Madrid, hubo una magnífica charla introductoria de Maykel Moya sobre Ansible. Parte de lo que explico en este post lo contó con una demo en directo.

Estuve hablando con Javier Vidal sobre el tema y al día siguiente me comento en twitter



Y en lugar de compartirselo sólo a Javi, he creado esta entrada en el blog :)

Para ello, he separado el role de bootstraping de nuestra instalación de Teowaki en un proyecto independiente y lo he configurado con Vagrant, para poder probarlo en local sin problemas.

El proyecto está disponible en github.

Los pasos para probarlo son:

Instalar Vagrant en local (previamente debe estar instalado VirtualBox). He optado por instalarlo a partir del .deb en lugar de a partir de apt porque la opción apt me instalaba los paquetes de ruby 1.9, y ruby ya lo tengo instalado en local con RVM.

$ wget https://dl.bintray.com/mitchellh/vagrant/vagrant_1.6.2_x86_64.deb
$ sudo dpkg -i vagrant_1.6.2_x86_64.deb
$ vagrant -v
Vagrant 1.6.2
$ vagrant init ubuntu/trusty64
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

Una vez instalado, simplemente con vagrant up levantamos el servidor, que escucha por defecto por ssh en el puerto 2222 en localhost

Más información sobre la instalación en las páginas de Vagrant y Ansible.

El siguiente paso es configurar el servidor en Ansible, que es tan simple como definir en un fichero hosts los datos de conexión al servidor. En mi caso he definido un grupo de servidores 'development' que incluye al servidor dev

[development]
dev ansible_ssh_host=127.0.0.1 ansible_ssh_port=2222

Por otra parte configuro la conexión a vagrant en ansible.cfg, de forma que no hay que escribirla en cada conexión desde ansible

[defaults]
hostfile = hosts
private_key_file=~/.vagrant.d/insecure_private_key
remote_user = vagrant

Y probamos que la conexión al servidor desde ansible funciona

$ ansible dev -m ping
dev | success >> {
    "changed": false, 
    "ping": "pong"
}

Sin el fichero de configuración la instrucción habría sido:

$ ansible dev -i hosts --private-key=~/.vagrant.d/insecure_private_key -u vagrant -m ping

Una vez comprobado que conectamos, cambiamos el fichero development.yml con la configuración local y ya podemos instalar el servidor


$ ansible-playbook bootstrap.yml

Por último, las tareas incluídas en el role son:
  • Instalación y actualización de paquetes de ubuntu
  • Copia de ficheros de configuración, en este caso solo /etc/environment
  • Configuración del locale
  • Creación de usuarios, asignando grupos y clave pública
  • Configuración de seguridad, instalando Fail2ban y cambiando ssh para que no permita ni acceso SSH de root ni acceso con contraseña (sólo por clave pública)
  • Instalación y configuración de Nullmailer y Mandrill. El motivo de uso lo explique en mi anterior post
  • Instalación de la monitorización de servidores de NewRelic


  • Para que funcione correctamente la instalación se debe actualizar el fichero development.yml con la configuración local (usuarios y sus claves públicas, emails, dominio, claves de acceso a Mandrill y NewRelic, ...) tal y como cuento en el README del proyecto.