J'essaie d'utiliser ansible pour parcourir une liste de listes pour installer certains packages. Mais {{item}} renvoie tous les éléments des sous-listes plutôt que la sous-liste elle-même. J'ai un fichier yaml qui provient d'une liste de manifestes de l'extérieur ansible et il ressemble à ceci:
---
modules:
- ['module','version','extra']
- ['module2','version','extra']
- ['module3','version','extra']
Ma tâche ressemble à ceci:
task:
- include_vars: /path/to/external/file.yml
- name: install modules
yum: name={{item.0}} state=installed
with_items: "{{ modules }}"
Quand je cours, je reçois:
fatal: [localhost]: FAILED! => {"failed": true, "msg": "ERROR! int object has no element 0"}
Quand j'essaye:
- debug: msg="{{item}}"
with_items: "{{module}}"
il imprime chaque élément (module, version, extra, etc.), pas seulement la sous-liste (ce à quoi je m'attendrais)
Malheureusement, c'est le comportement souhaité. Veuillez voir ceci discussion avec with_tems et listes imbriquées
Une autre façon de résoudre ce problème consiste à utiliser un élément complexe au lieu d'une liste de liste. Structurez vos variables comme ceci:
- modules:
- {name: module1, version: version1, info: extra1}
- {name: module2, version: version2, info: extra2}
- {name: module3, version: version3, info: extra3}
Ensuite, vous pouvez toujours utiliser with_items
, comme ça:
- name: Printing Stuffs...
Shell: echo This is "{{ item.name }}", "{{ item.version }}" and "{{ item.info }}"
with_items: "{{modules}}"
@helloV a déjà répondu que vous ne pouvez pas le faire en utilisant with_items
, je vais vous montrer comment utiliser votre structure de données actuelle avec with_nested
pour obtenir la sortie souhaitée.
Voici un exemple de playbook:
---
- hosts:
- localhost
vars:
- modules:
- ['module1','version1','extra1']
- ['module2','version2','extra2']
- ['module3','version3','extra3']
tasks:
- name: Printing Stuffs...
Shell: echo This is "{{ item.0 }}", "{{ item.1 }}" and "{{ item.2 }}"
with_nested:
- modules
Vous obtiendrez maintenant les éléments suivants sous la forme stdout_lines
:
This is module1, version1 and extra1
This is module2, version2 and extra2
This is module3, version3 and extra3
Remplacer with_items: "{{ modules }}"
avec:
dans Ansible 2.5 et versions ultérieures (reportez-vous à with_list
guide de portage ):
loop: "{{ modules }}"
dans Ansible 2.0 et versions ultérieures:
with_list: "{{ modules }}"
dans n'importe quel Ansible pré-2.0:
with_items:
- "{{ modules }}"
De cette façon, vous auriez trois niveaux de listes imbriquées et le comportement par défaut n'en aplatit que deux.