Ansible - Variables

Las variables en los libros de jugadas son very similara usar variables en cualquier lenguaje de programación. Le ayuda a usar y asignar un valor a una variable y usarlo en cualquier parte del libro de jugadas. Se pueden poner condiciones en torno al valor de las variables y, en consecuencia, utilizarlas en el libro de jugadas.

Ejemplo

- hosts : <your hosts> 
vars:
tomcat_port : 8080

En el ejemplo anterior, hemos definido un nombre de variable tomcat_port y asignó el valor 8080 a esa variable y puede usarlo en su libro de jugadas donde sea necesario.

Ahora tomando una referencia del ejemplo compartido. El siguiente código es de uno de los roles (install-tomcat):

block: 
   - name: Install Tomcat artifacts 
      action: > 
      yum name = "demo-tomcat-1" state = present 
      register: Output 
          
   always: 
      - debug: 
         msg: 
            - "Install Tomcat artifacts task ended with message: {{Output}}" 
            - "Installed Tomcat artifacts - {{Output.changed}}"

Aquí, la salida es la variable utilizada.

Repasemos todas las palabras clave utilizadas en el código anterior:

  • block - Sintaxis Ansible para ejecutar un bloque determinado.

  • name - Nombre relevante del bloque: se utiliza en el registro y ayuda a depurar lo que todos los bloques se ejecutaron correctamente.

  • action- El código junto a la etiqueta de acción es la tarea a ejecutar. La acción nuevamente es una palabra clave de Ansible usada en yaml.

  • register - La salida de la acción se registra utilizando la palabra clave register y Output es el nombre de la variable que contiene la salida de la acción.

  • always - Nuevamente una palabra clave de Ansible, indica que a continuación siempre se ejecutará.

  • msg - Muestra el mensaje.

Uso de variable - {{Salida}}

Esto leerá el valor de la variable Salida. Además, como se usa en la pestaña msg, imprimirá el valor de la variable de salida.

Además, también puede utilizar las subpropiedades de la variable. Como en el caso de comprobar {{Output.changed}} si la salida se modificó y utilizarla en consecuencia.

Manejo de excepciones en Playbooks

El manejo de excepciones en Ansible es similar al manejo de excepciones en cualquier lenguaje de programación. A continuación, se muestra un ejemplo del manejo de excepciones en el libro de jugadas.

tasks: 
   - name: Name of the task to be executed 
      block: 
         - debug: msg = 'Just a debug message , relevant for logging' 
         - command: <the command to execute> 
      
      rescue: 
         - debug: msg = 'There was an exception.. ' 
         - command: <Rescue mechanism for the above exception occurred) 
      
      always: 
         - debug: msg = "this will execute in all scenarios. Always will get logged"

A continuación se muestra la sintaxis para el manejo de excepciones.

  • rescue y always son las palabras clave específicas para el manejo de excepciones.

  • Bloque es donde se escribe el código (cualquier cosa que se ejecute en la máquina Unix).

  • Si el comando escrito dentro de la función de bloque falla, entonces la ejecución llega al bloque de rescate y se ejecuta. En caso de que no haya ningún error en el comando bajo la función de bloqueo, no se ejecutará el rescate.

  • Always se ejecuta en todos los casos.

  • Entonces, si comparamos lo mismo con Java, entonces es similar intentar, capturar y finalmente bloquear.

  • Aquí, Block es parecido a try block donde se escribe el código a ejecutar y rescue es parecido a catch block y always es parecido a finally.

Bucles

A continuación se muestra el ejemplo para demostrar el uso de Loops en Ansible.

Las tareas son copiar el conjunto de todos los archivos war de un directorio a la carpeta tomcat webapps.

La mayoría de los comandos utilizados en el siguiente ejemplo ya se han tratado anteriormente. Aquí, nos concentraremos en el uso de bucles.

Inicialmente en el comando 'shell' hicimos ls * .war. Entonces, listará todos los archivos war en el directorio.

La salida de ese comando se toma en una variable denominada salida.

Para hacer un bucle, se está utilizando la sintaxis 'with_items'.

with_items: "{{output.stdout_lines}}" -> output.stdout_lines nos da la salida línea por línea y luego hacemos un bucle en la salida con el comando with_items de Ansible.

Adjuntando la salida de ejemplo solo para que uno entienda cómo usamos stdout_lines en el comando with_items.

--- 
#Tsting 
- hosts: tomcat-node 
   tasks: 
      - name: Install Apache 
      shell: "ls *.war" 
      register: output 
      args: 
         chdir: /opt/ansible/tomcat/demo/webapps 
      
      - file: 
         src: '/opt/ansible/tomcat/demo/webapps/{{ item }}' 
         dest: '/users/demo/vivek/{{ item }}' 
         state: link 
      with_items: "{{output.stdout_lines}}"

Bloques

El libro de jugadas en su totalidad está dividido en bloques. La parte más pequeña de los pasos a ejecutar se escribe en bloque. Escribir la instrucción específica en bloques ayuda a segregar la funcionalidad y manejarla con manejo de excepciones si es necesario.

El ejemplo de bloques se cubre en el uso de variables, manejo de excepciones y bucles anteriores.

Condicionales

Los condicionales se utilizan cuando es necesario ejecutar un paso específico en función de una condición.

--- 
#Tsting 
- hosts: all 
   vars: 
      test1: "Hello Vivek" 
   tasks: 
      - name: Testing Ansible variable 
      debug: 
         msg: "Equals" 
         when: test1 == "Hello Vivek"

En este caso, Equals se imprimirá ya que la variable test1 es igual como se menciona en la condición when. when se puede utilizar con una condición lógica OR y lógica AND como en todos los lenguajes de programación.

Simplemente cambie el valor de la variable test1 de Hello Vivek para decir Hello World y ver el resultado.