web-dev-qa-db-fra.com

ansible liste des listes with_items aplatit

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)

14
Neybar

Malheureusement, c'est le comportement souhaité. Veuillez voir ceci discussion avec with_tems et listes imbriquées

6
helloV

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}}"
13
gameweld

@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
4
heemayl

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.

4
techraf