Experimentos portables (II) – «Recetas» para VMs

gorrococinaEn el post anterior conocimos Vagrant, una herramienta que nos puede ayudar a gestionar la creación de máquinas virtuales. En este post nos centraremos en otra herramienta llamaba Ansible. Se basa en el concepto de roles: sobre cada máquina virtual se instalarán una serie de roles específicos. Por ejemplo, vamos a crear 3 roles, uno que instalará Docker, y otros dos adicionales que descargarán y ejecutarán una aplicación sobre contenedores de Docker.

Comencemos por el rol de Docker. Un rol se compone de una serie de tareas a ejecutar, en nuestro caso, descargar Docker del repositorio e instalarlo. Dichas tareas se especifican en un fichero .yaml.

- name: anyadir repositorio docker
yum_repository:
name: docker
description: Docker Repository
baseurl: https://yum.dockerproject.org/repo/main/centos/7/
gpgcheck: yes
gpgkey: https://yum.dockerproject.org/gpg
enabled: yes

- name: instalar docker-engine
yum: name=docker-engine state=present

De forma similar, crearemos el rol «data_serving_client», la parte cliente de nuestra aplicación Data Serving (un benchmark de cloud). Para ello, definiremos dos tareas, una que descarga la imagen del repositorio y otra que arrancará el contenedor.

#file: main.yaml - data_serving_client role
- name: get image
shell: docker pull cloudsuite/data-serving:client

- name: start data server
shell: docker run --name cassandra-client --net serving_network cloudsuite/data-serving:client [...]

El componente servidor de nuestra aplicación se creará bajo el rol «data_serving_server». No incluimos el contenido del main.yml, ya que es muy similar al anterior. Una vez definidos los roles, ahora indicaremos las máquinas virtuales. O mejor dicho, una «receta», que será un compendio de roles. En Ansible, cada receta se denomina «playbook». Todo ello se define en el fichero ansible.yaml. Aquí se pueden ver las dos «recetas», la «cliente-sansible», que ejecutará los roles «docker» y «data_serving_client», y la «receta» «servidor-ansible» que reutilizará el rol «docker» y además el de «data_serving_server»:

# file: ansible.yml
- hosts: cliente-ansible
become: yes
become_method: sudo
gather_facts: no
roles:
- docker
- data_serving_client

- hosts: servidor-ansible
become: yes
become_method: sudo
gather_facts: no
roles:
- docker
- data_serving_server

Podemos combinar fácilmente Vagrant y Ansible de la siguiente forma mediante el fichero VagrantFile: para cada Máquina virtual indicaremos la ruta al fichero ansible.yaml y al fichero inventory.

Vagrant.configure(2) do |config|
# Máquina virtual cliente
config.vm.define 'cliente' do |client|
cliente.vm.box = 'centos/7'
cliente.vm.hostname = 'nombre.midominio.es'
cliente.vm.network 'mi_red', ip: "192.168.50.3"
cliente.vm.provider 'virtualbox' do |vb|
vb.memory = '1024'
vb.cpus = 1
end
cliente.vm.provision "ansible" do |ansible|
ansible.inventory_path = 'ansible/environment/inventory'
ansible.verbose = 'vvv'
ansible.playbook = 'ansible/anomaly.yml'
end
end

# Máquina virtual servidora
config.vm.define 'servidor' do |server|
[..]
end
end

Como podemos ver, en Vagrant hemos definido 2 máquinas virtuales de nombres «cliente» y «servidor». Con Ansible tenemos dos «recetas»: cliente-ansible y servidor-ansible. Nos quedaba por ver el fichero de inventario de Ansible, en el cual definimos la relación entre máquina virtual de Vagrant y la «receta» de Ansible:

[client-ansible]
cliente

[servidor-ansible]
servidor

Combinando Ansible y Vagrant tendremos un entorno de experimentación fácilmente reproducible. Docker además nos permite reutilizar imágenes de aplicaciones existentes en el repositorio. Como nota final, Vagrant nos da la opción de crear un «snapshot» de cada máquina virtual, que guardará su estado actual para futuras ejecuciones.

Tania Lorido
Acerca de
Investigadora de DT
Expertise: Machine learning, Cloud computing, Big data