4 votes

Ansible, with_nested, Comment assigner des variables dynamiques dans une boucle

J'essaie d'itérer à travers le nombre d'entrées dynamiquement dans un tableau et d'utiliser la sortie comme un index.

Je suis presque sûr que je fais quelque chose de mal.

Comment puis-je assigner une variable à la fin de la séquence qui représente le compte de mon tableau actuel ?

ansible-playbook 2.9.6

run.yml :

---
- hosts: localhost

  tasks:
  - name: Import config
    include_vars: 
      file: ./config.yml

  - name: DEBUG
    debug: msg="{{ item[0].team_name }}: {{ item[0].applications.name }}: index: {{ item[1] }}"
    with_nested:
      - "{{ teams }}"
      - "{{ lookup('sequence', 'start=1 end='+(item[0].applications|length))|string }}"

config.yml :

teams:
  - team_name: Name-of-Team_A
    applications:
      - name: app_name_a
      - name: app_name_b
  - team_name: Name-of-Team_B
    applications:
      - name: app_name_c
      - name: app_name_d

Exécution :

ansible-playbook run.yml

PLAY [localhost] ********************************************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************************************************
ok: [localhost]

TASK [Import config] ****************************************************************************************************************************************************************
ok: [localhost]

TASK [DEBUG] ************************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"msg": "'item' is undefined"}

PLAY RECAP **************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

Résultat souhaité :

msg: 'Name-of-Team_A: app_name_a: index: 1' 
msg: 'Name-of-Team_A: app_name_b: index: 2' 
msg: 'Name-of-Team_B: app_name_c: index: 1' 
msg: 'Name-of-Team_B: app_name_d: index: 2'

1 votes

Quel est le résultat attendu ?

4voto

Vladimir Botka Points 3372

R : Par exemple, la tâche ci-dessous

- debug:
    msg: "{{ item.0.team_name }}: {{ item.1.name }}: {{ index1|int + 1 }}"
  with_subelements:
    - "{{ teams }}"
    - applications
  vars:
    team_names: "{{ teams|
                    map(attribute='team_name')|
                    list }}"
    index0: "{{ team_names.index(item.0.team_name) }}"
    applications: "{{ teams|
                      map(attribute='applications')|
                      list }}"
    application_names: "{{ applications[index0|int]|
                           map(attribute='name')|
                           list }}"
    index1: "{{ application_names.index(item.1.name) }}"

donne

  msg: 'Name-of-Team_A: app_name_a: 1'
  msg: 'Name-of-Team_A: app_name_b: 2'
  msg: 'Name-of-Team_B: app_name_c: 1'
  msg: 'Name-of-Team_B: app_name_d: 2'

Cette solution est limitée à des listes uniques.


Une meilleure structure pour ce cas d'utilisation est un dictionnaire. Par exemple, la tâche ci-dessous donne les mêmes résultats

- debug:
    msg: "{{ item.0.key }}: {{ item.1 }}: {{ teams[item.0.key].index(item.1) + 1 }}"
  with_subelements:
    - "{{ teams|dict2items }}"
    - value
  vars:
    teams:
      Name-of-Team_A:
        - app_name_a
        - app_name_b
      Name-of-Team_B:
        - app_name_c
        - app_name_d

Les listes doivent être uniques. La méthode indice trouvera la première correspondance.

0 votes

Mise à jour de la question, excuses

0 votes

Pas de problème. Mise à jour de la réponse.

0 votes

Merci beaucoup Vladimir, je savais que ça allait être compliqué.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X