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.