GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo usar bucles en Ansible Playbook

En el curso de la ejecución de tareas en el libro de jugadas de Ansible , es posible que te encuentres con algunas tareas que son repetitivas por naturaleza. Estas son tareas que requieren que crees múltiples jugadas, algo que puede ser bastante tedioso. Al igual que con cualquier lenguaje de programación, los bucles en Ansible brindan una forma más fácil de ejecutar tareas repetitivas usando menos líneas de código en un libro de jugadas.

Al crear bucles, Ansible proporciona estas dos directivas:loop y con_* palabra clave.

La palabra clave loop se agregó recientemente a Ansible 2.5 . La palabra clave loop generalmente se usa para crear bucles simples y estándar que iteran a través de varios elementos.

El con_*  La palabra clave se usa con una serie de complementos de búsqueda al iterar a través de los valores. Los complementos de búsqueda permiten a Ansible acceder a información de fuentes externas, como almacenes de datos externos, sistemas de archivos, etc. El with_* la búsqueda todavía está muy en uso y aún no ha quedado obsoleta.

Veamos ahora cómo puede implementar bucles en Ansible.

Iterando sobre bucles simples 

Considere un Playbook que agrega un nuevo usuario en el sistema de destino usando el módulo de usuario como se muestra:

---
- hosts: ubuntu_webserver
  tasks:
    - name: Create new user john
      user:
        name: john
        state: present

Esto se ve bien. Pero, ¿qué pasa si tenemos varios usuarios para agregar al sistema de destino? ¿Cómo haríamos eso? Una forma sería duplicar las tareas como se muestra en el siguiente ejemplo donde estamos agregando 3 usuarios.

---
- hosts: ubuntu_webserver
  tasks:
    - name: Create new user john
      user:
        name: john
        state: present

    - name: Create new user mike
      user:
        name: mike
        state: present

    - name: Create new user andrew
      user:
        name: andrew
        state: present

Como puede parecer, esto requiere mucha duplicación y repetición.

Para facilitar las cosas, se puede escribir el mismo libro de jugadas utilizando la directiva de bucle. La directiva loop ejecuta la misma tarea varias veces. Almacena el valor de cada artículo en una variable llamada artículo .Entonces, en lugar de especificar los nombres de los usuarios que se agregarán, simplemente especifique una variable llamada elemento encerrada entre llaves dobles como se muestra.

nombre:'{{ elemento }}'

Por lo tanto, cada uno de los elementos dentro del ciclo será referenciado por la variable.

Como puede ver, nuestro libro de jugadas ahora está mucho más organizado con duplicaciones/repeticiones innecesarias.

$ vi create_users.yaml
---
- hosts: ubuntu_webserver
  tasks:
    - name: Create new users
      user:
        name: '{{ item }}'
        state: present
      loop:
        - john
        - mike
        - andrew

Además, puede usar el with_items directiva en lugar de la directiva loop. Ambos darán el mismo resultado.

---
- hosts: ubuntu_webserver
  become: yes
  tasks:
    - name: Create new users
      user:
        name: '{{ item }}'
        state: present

      with_items:
        - john
        - mike
        - andrew

Ahora puede ejecutar el libro de jugadas para crear los usuarios usando el libro de jugadas ansible. comando como se muestra a continuación:

$ ansible-playbook -i inventory.txt create_users.yaml

Iterando sobre una lista de Diccionarios

En el primer ejemplo, observamos un bucle estándar simple en el que la matriz era una lista de valores de cadena que representaban a los usuarios que se agregarían al objetivo remoto.

Pero, ¿qué pasa si necesitamos agregar el uid al bucle de modo que cada elemento ahora tiene dos valores:el nombre de usuario y uid . ¿Cómo pasarías 2 valores en una matriz?

En este escenario, tendrá que pasar una matriz de diccionarios, cada uno con 2 pares clave-valor, como se muestra. Las claves serían el nombre y el uid mientras que los valores serán el nombre de usuario y el ID de cada usuario.

En las 'tareas ', ya no puede definir el elemento variable como antes. Como tenemos 2 valores, esto se traducirá en dos variables:item.name &elemento.uid .

El libro de jugadas completo se muestra a continuación:

$ vi create_users.yaml
---
- hosts: ubuntu_webserver
  become: yes
  tasks:
    - name: Create new users
      user:
        name: '{{ item.name }}'
        uid: '{{ item.uid }}'
        state: present

      loop:
        - name: john
          uid: 1020
        - name: mike
          uid: 1030
        - name: andrew
          uid: 1040

La matriz de diccionarios también se puede representar en formato JSON.

loop:
  - { name: john , uid: 1020 }
  - { name: mike , uid: 1030 }
  - { name: andrew , uid: 1040}

Cuando se ejecute, obtendrá el siguiente resultado:

$ ansible-playbook -i inventory.txt create_users.yaml

Ansible Loops con índices

De vez en cuando, es posible que desee realizar un seguimiento de los valores de índice dentro de su conjunto de elementos. Para esto, use el 'with indexed_items ' buscar. El valor del índice comienza desde 0 mientras que el índice del bucle comienza desde item.0 y el valor de item.1

Considere el libro de jugadas a continuación:

$ vi indexes.yaml
---
- hosts: ubuntu_webserver
  tasks:
  - name: Indexes with Ansible loop
    debug:
      msg: "The car at {{ item.0 }} is {{ item.1 }}"
    with_indexed_items:
      - "Nissan"
      - "Mercedes"
      - "Toyota"
      - "Mazda"
      - "BMW"

Cuando se ejecuta, el libro de jugadas muestra el valor de índice de cada elemento en la lista de arreglos.

$ ansible-playbook -i inventory.txt indexes.yaml

Condicionales en Ansible Loops

En los bucles de Ansible, puede usar la declaración condicional cuando desee controlar el bucle en función de la naturaleza de las variables o los hechos del sistema. Considere el libro de jugadas a continuación, donde tenemos una lista de paquetes que deben instalarse.

Hemos especificado una matriz llamada 'paquetes ‘ que contiene una lista de paquetes que deben instalarse. Cada uno de los elementos de la matriz contiene el nombre del paquete que se instalará y la propiedad denominada "requerido ' que se establece en 'Verdadero ' para 2 paquetes y 'Falso ‘ por un paquete.

$ vi install-packages.yaml
---
- name: Install software
  become: yes
  hosts: all
  vars:
    packages:
      - name: neofetch
        required: True

      - name: cpu-checker
        required: True

      - name: screenfetch
        required: False
  tasks:
    - name: Install "{{ item.name }}" on Ubuntu
      apt:
        name: "{{ item.name }}"
        state: present

      when:
        - item.required == True
        - ansible_facts['distribution'] =="Ubuntu"

      loop: "{{ packages }}"

El 'cuándo ' declaración condicional busca instalar los paquetes de software con la propiedad 'requerido ' establecido en 'Verdadero ' en los sistemas de destino que son distribuciones de Ubuntu. A continuación se muestra el resultado del libro de jugadas cuando se ejecuta.

La salida detallada muestra claramente los paquetes que se están instalando y el que se ignora según la declaración condicional.

Y esto nos lleva al final de este tema. Esperamos que tenga una comprensión adecuada de Loops en los libros de jugadas de Ansible. Siéntase libre de comunicarse para cualquier aclaración.

Lea también :Cómo usar la plantilla Jinja2 en Ansible Playbook


Linux
  1. Cómo uso Ansible y Anacron para la automatización

  2. Cómo usar Ansible para configurar el monitoreo del sistema con Prometheus

  3. Cómo usar la declaración condicional if else en Bash Script

  4. Cómo instalar y usar Ansible en Debian 11

  5. Cómo crear un libro de jugadas de Ansible

Cómo crear roles de Ansible y usarlos en Playbook

Cómo crear y usar datos personalizados en Ansible

Cómo definir y usar controladores en Ansible Playbooks

Cómo usar la plantilla Jinja2 en Ansible

Cómo usar Ansible para configurar Vim

Cómo usar Ansible para enviar un correo electrónico usando Gmail