Saltar al contenido

Agregar a listas o agregar keys a diccionarios en Ansible

Necesitamos tu ayuda para difundir nuestras reseñas acerca de las ciencias de la computación.

Solución:

Solución 1:

Desde Ansible v2.x puedes hacer esto:

# use case I: appending to LIST variable:

      - name: my appender
        set_fact:
          my_list_var: 'my_list_myvar + new_items_list'

# use case II: appending to LIST variable one by one:

      - name: my appender
        set_fact:
          my_list_var: 'my_list_var + [item]'
        with_items: 'list'

# use case III: appending more keys DICT variable in a "batch":

      - name: my appender
        set_fact:
          my_dict_var: 'my_dict_var'

# use case IV: appending keys DICT variable one by one from tuples
      - name: setup list of tuples (for 2.4.x and up
        set_fact:
          lot: >
            [('key1', 'value1',), ('key2', 'value2',), ..., ('keyN', 'valueN',)],
      - name: my appender
        set_fact:
          my_dict_var: 'my_dict_var'
        with_items: 'lot'
# use case V: appending keys DICT variable one by one from list of dicts (thanks to @ssc)

  - name: add new key / value pairs to dict
    set_fact:
      my_dict_var: " combine(item.key: item.value) "
    with_items:
    -  key: 'key01', value: 'value 01' 
    -  key: 'key02', value: 'value 03' 
    -  key: 'key03', value: 'value 04' 

todo lo anterior está documentado en: http://docs.ansible.com/ansible/playbooks_filters.html

Solución 2:

Puede fusionar dos listas en una variable con +. Di que tienes un group_vars archivo con este contenido:

---
# group_vars/all
pgsql_extensions:
  - ext1
  - ext2
  - ext3

Y se usa en una plantilla. pgsql.conf.j2 me gusta:

#  ansible_managed 
pgsql_extensions=% for item in pgsql_extensions % item , % endfor %

Luego puede agregar extensiones a los servidores de la base de datos de prueba de esta manera:

---
# group_vars/testing_db
append_exts:
  - ext4
  - ext5
pgsql_extensions: " pgsql_extensions + append_exts "

Cuando el rol se ejecuta en cualquiera de los servidores de prueba, se agregarán las extensiones adicionales.

No estoy seguro de que esto funcione también para los diccionarios, y también tenga cuidado con los espacios y con dejar una coma colgando al final de la línea.


Solución 3:

necesitas dividir el bucle en 2

--- 
- hosts: localhost
  tasks: 
    - include_vars: stacks
    - set_facts: roles=stacks.Roles 
    - include: addhost.yml
      with_items: "roles"

y addhost.yml

- set_facts: groupname=item
- set_facts: ips=stacks[item]
- local_action: add_host hostname=item groupname=groupname
  with_items: ips

Si te ha sido útil este artículo, te agradeceríamos que lo compartas con el resto desarrolladores así nos ayudas a dar difusión a nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *