es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Manipulación de datos en Ansible – Transformación de listas

Necesito transformar una lista simple en una compleja.

La lista simple se ve así:

customers:
  - customer01-node01.private.foo.it
  - customer02-node01.private.foo.it
  - customer04-node03.private.foo.it
  - customer03-node02.private.foo.it
  - customer05-node02.private.foo.it
  - customer01-node04.private.foo.it
  - customer02-node04.private.foo.it
  - customer04-node06.private.foo.it
  - customer03-node05.private.foo.it
  - customer05-node05.private.foo.it

Estoy tratando de encontrar una forma de obtener una lista compleja, agrupando los nodos por cliente.
El resultado final que estoy buscando es el siguiente:

customers_list:
  - customer: customer01
    nodes:
      - node01.private.foo.it
      - node04.private.foo.it
  - customer: customer02
    nodes:
      - node01.private.foo.it
      - node04.private.foo.it
  - customer: customer03
    nodes:
      - node02.private.foo.it
      - node05.private.foo.it
  - customer: customer04
    nodes:
      - node03.private.foo.it
      - node06.private.foo.it
  - customer: customer05
    nodes:
      - node02.private.foo.it
      - node05.private.foo.it
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para transformar la lista simple en una más compleja, puedes utilizar Ansible y las plantillas Jinja2. Aquí están los pasos que puedes seguir:

    1. Define una variable para la lista de clientes en tu playbook:
      vars:
       customers:
         - customer01-node01.private.foo.it
         - customer02-node01.private.foo.it
         - customer04-node03.private.foo.it
         - customer03-node02.private.foo.it
         - customer05-node02.private.foo.it
         - customer01-node04.private.foo.it
         - customer02-node04.private.foo.it
         - customer04-node06.private.foo.it
         - customer03-node05.private.foo.it
         - customer05-node05.private.foo.it
      
    2. Define una plantilla Jinja2 para transformar la lista en el formato deseado:
      {% set customers_dict = {} %}
      {% for item in customers %}
       {% set customer, node = item.split('-') %}
       {% if customer not in customers_dict %}
         {% set customers_dict[customer] = [] %}
       {% endif %}
       {% set customers_dict[customer] = customers_dict[customer] + [node] %}
      {% endfor %}
      
      customers_list:
      {% for customer, nodes in customers_dict.items() %}
       - customer: {{ customer }}
         nodes:
         {% for node in nodes %}
           - {{ node }}
         {% endfor %}
      {% endfor %}
      
    3. Utiliza el módulo template en Ansible para renderizar la plantilla y guardarla como una variable:
      - name: Transformar lista simple en compleja
       template:
         src: customers.j2
         dest: /tmp/customers.yml
       register: customers_result
      
    4. La variable customers_result contendrá la lista transformada en el campo stdout, que puedes utilizar en tu playbook según sea necesario. Por ejemplo, puedes imprimirlo utilizando el módulo debug:
      - name: Imprimir lista transformada
       debug:
         var: customers_result.stdout
      

    ¡Y eso es todo! Con este enfoque, puedes transformar fácilmente una lista simple en una más compleja utilizando Ansible y las plantillas Jinja2.

Comments are closed.