Skip to main content

Ansible

Introducción al Ansible

Ansible es una herramienta de administración remota que permite definir estados ( está instalado un software o que exista una interfaz de red concreta) y que es capaz de llevar a los equipos a dichos estados realizando las operaciones necesarias.

Ficheros Ansible

Dentro de ansible tenemos varios ficheros que debemos controlar, para saber en qué máquina o grupo de máquinas vamos a ejecutar las diferentes operaciones, que operaciones vamos a realizar y cómo las vamos a realizar.

/etc/ansible/hosts

En este fichero tenemos los grupos de trabajo y sus máquinas dentro. Cuando queramos introducir una máquina nueva, primero deberemos introducirla en un grupo, aunque esta operación no está del todo necesaria ya que también podemos ejecutar una acción sobre una máquina en concreto.
Ejemplo:
[grupo_uno]
1.1.1.1.
1.1.1.2
1.1.1.3
[grupo_dos]
10.20.11.10

/etc/ansible/host_vars/fichero máquina

Cada vez que queramos añadir una máquina a ansible, aparte de añadirla al archivo “hosts” debemos crear su propio archivo y guardarlo en /host_vars. El contenido de este fichero es simple:
ansible_host: 85.91.25.41
ansible_hostname: hostWeb11
master: yes #De momento Solo en cool-ad11,el resto: no


/etc/ansible/config_files/ Dentro de esta carpeta tenemos todos los ficheros preparados para las instalaciones. Los tenemos separados por grupos. Por ejemplo en su interior tenemos el fichero nginx.tar.gz que usaremos para la instalación de nginx.

/etc/ansible/groups_vars/fichero_grupo

Variables de grupo. En este fichero guardamos las variables generales para ese grupo, es decir, en un grupo algunas instalaciones serán las mismas para todas las máquinas (nrpe - nginx - o lo que sea), aquí tenemos definidas estas  opciones generales. Por ejemplo para la instalación de nginx en el grupo definimos las siguientes variables:

ariables Nginx

nginx_version: 1.14.0
nginx_configure: --prefix=/usr/local/nginx-Plantilla:Nginx version --user=devel --group=devel --with-http_ssl_module --with-http_realip_module --with-http_stub_status_module --with-http_perl_module
config_nginx: nginx.tar.gz
server_origen_nginx: ad05
dominio_nginx: xjh37.com
Definimos la versión a instalar.
Definimos los parámetros del configure
server_origen_nginx. Esta variable define el nombre de donde se sacó el fichero de configuración, se crea para a posteriori utilizarla para reemplazar el nombre del fichero de configuración.
Dominio_nginx. Igual que la anterior, tenemos el nombre del dominio del archivo original.


/etc/ansible/roles Podemos definir un rol como un listado de acciones que debe hacer. Ahora mismo en nuestro caso tenemos los siguientes roles identificados:

cassandra  
initInstall  
nginx  
nodejs  
personalizar  
redis  
spark

Cada uno en su interior tiene las opciones para proceder con la instalación (en este caso) de los diferentes servicios. En nuestro caso principalmente solo hemos tenido que utilizar la carpeta tasks, que es donde se define todo el proceso. Vamos a ver el ejemplo de nginx:

Para la instalación de nginx seguiríamos los siguientes pasos: verificar - descargar - descomprimir - instalar - configurar. Vamos a entender uno de estos procesos, el de instalación estará bien.

        1. Instalacion NGINX
 - name: Instalar Nginx
   command: chdir=/usr/local/src/nginx-Plantilla:Nginx version Plantilla:Item
   with_items:
     - ./configure Plantilla:Nginx configure
     - make
     - make install
   when: verif_nginx_inst.stat.isdir is not defined
-  name : Nombre del proceso que vamos a ejecutar
   command: En esta caso cambia al directorio especificado.

Las variables nginx-version y nginx_configure las coje del fichero creado en groups_vars, en cambio la variable item la coje de la propia tarea. Esta variables item siempre tendrá que ser generada dentro de la propia tarea, en este caso no son más que las acciones a realizar:

Para entender el parámetro when primero debemos ver el proceso de verificación, lanzado el primero en este archivo task

- name: Verificamos si hay alguna instalación anterior NGINX vPlantilla:Nginx version.
   stat:
     path: /usr/local/src/nginx-Plantilla:Nginx version
   register: verif_nginx_inst

Este proceso comprueba un path en concreto y guarda el estado en la variable o objeto stat.

Posteriormente podemos ver que en el parámetro when se le pregunta al objeto stat si dicho directorio no existe. Le estamos diciendo a ansible que haga la acción siempre y cuando la carpeta no exista ya.

Otro ejemplo del parámetro when:

 - name: Copiamos fichero de configuracion local para Master
   copy:
     src: "rc.local.master"
     dest: /etc/rc.d/rc.local
   when: master == "yes"

Dentro de cada fichero de máquina, el en directorio hosts_vars, tenemos declarada la variable master, esta variable puede contenter un “yes” o un “no”.... Dependiendo de su valor haremos o no una copia de fichero. Esto lo hacemos porque tenemos ficheros que van al mismo directorio en cada instalación pero su valor cambia en función si es un server maestro (Node y Spark) o es un esclavo

/etc/ansible/yamls-varios Bien ya sabemos cómo generamos máquinas nuevas, como crear tareas nuevas, pero ¿como las lanzamos o como llamamos a los diferentes procesos que queremos realizar en nuestra red de máquinas?

Para la acción final tenemos el fichero install.yml dentro de la carpeta yamls-varios: - hosts: host_webINicial

 become: yes
 become_method: sudo
 vars:
   - nagios_server: 45.65.25.145
 roles:
     - initInstall
     - nginx
     - nodejs
     - cassandra
     - redis
   - spark


Explicación:

  • hosts - Grupo donde queremos trabajar
  • become
  • become_method
  • vars: En este fichero también podemos definir variables, aquí se definirán variables que no tienen carácter general y que para ejecución diferentes podría variar.
  • roles: los procesos que queremos ejecutar en la instalación, en este caso solo se lanzaría el proceso spark.

Comandos útiles

  • ansible-playbook install.yml
Usando el ejemplo anterior inicializará la instalación de spark en el grupo de máquinas cool_ads_us
  • ansible imp_rtb_bcn -a “ls /etc/”
Lanzaría el comando ls en la carpeta /etc/ de todas las máquinas del grupo imp_rtb_bcn
  • ansible -m copy -a "src=scripts_init dest=/root" cool-ad11
Copia el contenido de la carpeta scripts_init en /root de la máquina cool-ad11
  • ansible blockchain
Inserta un trozo de texto en el fichero especificado de la máquina o grupos especificados.