Saltar al contenido

¿Cómo recorrer este diccionario en Ansible?

Si encuentras algún error en tu código o proyecto, recuerda probar siempre en un entorno de testing antes añadir el código al proyecto final.

Solución:

Cómo es esto

- hosts: localhost
  vars:
    war_files:
      server1:
      - file1.war
      - file2.war
      server2:
      - file1.war
      - file2.war
      - file3.war
  tasks:
    - name: Loop over subelements of the dictionary
      debug:
        msg: "Key= item.0.key  value= item.1 "
      loop: " subelements('value') "

dict2items, subelements Los filtros vienen en Ansible 2.6.

Para su información, si no existe un filtro para su objetivo, puede escribir el suyo propio en python sin tener que recurrir a los trucos de jinja2. Ansible es fácilmente ampliable; filtros en filter_plugins/*.py se buscan de forma predeterminada junto a sus jugadas/roles y se incluyen automáticamente; consulte Desarrollo de complementos para obtener más información.

Ahora Ansible permite esto

- name: add several users
  user:
    name: " item.name "
    state: present
    groups: " item.groups "
  with_items:
    -  name: 'testuser1', groups: 'wheel' 
    -  name: 'testuser2', groups: 'root' 


EDITAR: Al momento de escribir esta respuesta, Ansible 2.6 no estaba disponible. Lea la respuesta proporcionada por @tmoschou, ya que es mucho mejor.


Bueno, no pude encontrar una manera muy fácil de hacerlo, sin embargo, con un poco de jinja2, podemos lograr algo de este tipo:

/tmp ❯❯❯ cat example.yml
---
- hosts: 127.0.0.1
  vars:
    war_files:
      server1:
      - file1.war
      - file2.war
      server2:
      - file1.war
      - file2.war
      - file3.war
  tasks:
  - set_fact:
      war_files_list_of_dicts: |
          % set res = [] -%
          % for key in war_files.keys() -%
             % for value in war_files[key] -%
              % set ignored = res.extend(['Server': key, 'WAR':value]) -%
             %- endfor %
          %- endfor %
           res 

  - name: let's debug the crap out of this
    debug: var=war_files_list_of_dicts

  - name: Servers and their WARs!!!
    debug:
       msg: "Server= item.Server , WAR= item.WAR "
    with_items: " war_files_list_of_dicts "

Y, cuando se ejecuta el libro de jugadas:

/tmp ❯❯❯ ansible-playbook example.yml
 [WARNING]: provided hosts list is empty, only localhost is available


PLAY [127.0.0.1] ***************************************************************

TASK [setup] *******************************************************************
ok: [127.0.0.1]

TASK [set_fact] ****************************************************************
ok: [127.0.0.1]

TASK [let's debug the crap out of this] ****************************************
ok: [127.0.0.1] => 
    "war_files_list_of_dicts": [
        
            "Server": "server1", 
            "WAR": "file1.war"
        , 
        
            "Server": "server1", 
            "WAR": "file2.war"
        , 
        
            "Server": "server2", 
            "WAR": "file1.war"
        , 
        
            "Server": "server2", 
            "WAR": "file2.war"
        , 
        
            "Server": "server2", 
            "WAR": "file3.war"
        
    ]


TASK [Servers and their WARs!!!] ***********************************************
ok: [127.0.0.1] => (item='WAR': u'file1.war', 'Server': u'server1') => 
    "item": 
        "Server": "server1", 
        "WAR": "file1.war"
    , 
    "msg": "Server=server1, WAR=file1.war"

ok: [127.0.0.1] => (item='WAR': u'file2.war', 'Server': u'server1') => 
    "item": 
        "Server": "server1", 
        "WAR": "file2.war"
    , 
    "msg": "Server=server1, WAR=file2.war"

ok: [127.0.0.1] => (item='WAR': u'file1.war', 'Server': u'server2') => 
    "item": 
        "Server": "server2", 
        "WAR": "file1.war"
    , 
    "msg": "Server=server2, WAR=file1.war"

ok: [127.0.0.1] => (item='WAR': u'file2.war', 'Server': u'server2') => 
    "item": 
        "Server": "server2", 
        "WAR": "file2.war"
    , 
    "msg": "Server=server2, WAR=file2.war"

ok: [127.0.0.1] => (item='WAR': u'file3.war', 'Server': u'server2') => 
    "item": 
        "Server": "server2", 
        "WAR": "file3.war"
    , 
    "msg": "Server=server2, WAR=file3.war"


PLAY RECAP *********************************************************************
127.0.0.1                  : ok=4    changed=0    unreachable=0    failed=0   

Si sostienes alguna vacilación y capacidad de refinar nuestro enunciado puedes realizar una nota y con gusto lo interpretaremos.

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



Utiliza Nuestro Buscador

Deja una respuesta

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