1
votes

Vérifier si la variable imbriquée est définie dans l'instruction when

Les structures de données imbriquées sont accessibles soit par indexation à l'aide du nom de la clé, soit par la syntaxe du point avec le nom de la clé - https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#accessing-complex-variable-data

Mais je Je ne peux pas accéder à la structure de données imbriquée à partir des variables de l'instruction when. Voici un exemple minimal pour illustrer le problème

ansible-playbook play.yml                                                                                             (livingstone-dev/monitoring)
 [WARNING]: No inventory was parsed, only implicit localhost is available

 [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'


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

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

TASK [Check if variable is defined] **************************************************************************************************************************
skipping: [localhost] => (item=parent) 
failed: [localhost] (item=parent.child1) => {"ansible_loop_var": "item", "changed": false, "item": "parent.child1", "msg": "mandatory variable parent.child1 not passed as extra args when invoking playbook"}
failed: [localhost] (item=parent.child2) => {"ansible_loop_var": "item", "changed": false, "item": "parent.child2", "msg": "mandatory variable parent.child2 not passed as extra args when invoking playbook"}

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

Voici l'exemple de sortie

# cat play.yml                                                                                                         
- hosts: localhost   
  vars:
    parent:
      child1: true   tasks:
  - name: "Check if variable is defined"
    fail:
      msg: "mandatory variable {{ item }} not passed as extra args when invoking playbook"
    when: item not in vars
    loop:
    - parent
    - parent.child1
    - parent.child2

Toute idée de comment je peux avoir variables imbriquées dans ansible when instructions. Voici quelques choses que j'ai déjà essayées et qui n'ont pas fonctionné:

  1. Utilisation de la notation pointée pour accéder aux variables
  2. Modification de l'instruction when en "item is not defined" sans les guillemets


0 commentaires

3 Réponses :


1
votes

Le code ci-dessous a fonctionné pour moi. Vous devez fournir les valeurs en boucle dans "{{}}"

  -  name: "Check if variable is defined"
     fail:
      msg: "mandatory variable {{ item }} not passed as extra args when invoking playbook"
     loop:
      - "{{parent.child1}}"
      - "{{parent}}"
      - "{{parent.child2}}"
     when: item is not defined



1 commentaires

J'ai essayé votre suggestion. Cela fonctionne mais ne donne pas le message d'erreur correspondant. La tâche entière échoue sans même exécuter la boucle avec le message d'erreur suivant: {"msg": "'objet dict' n'a pas d'attribut 'enfant2'"}. Mais cela m'a aidé à arriver à la solution. Merci. Je l'afficherai comme réponse.



0
votes

Voici le manuel de travail. Merci à @smily de m'avoir orienté dans la bonne direction. Étant donné que l'élément de variable de boucle doit être évalué avant l'évaluation de la condition when, j'ai dû développer l'élément de variable. Je l'ai fait en englobant toute la condition when entre guillemets et en développant simplement la variable de boucle d'élément.

$ ansible-playbook play.yml                                                                                             (livingstone-dev/monitoring)
 [WARNING]: No inventory was parsed, only implicit localhost is available

 [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'


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

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

TASK [show variable] *****************************************************************************************************************************************
ok: [localhost] => {
    "parent": {
        "child1": true
    }
}

TASK [Check if variable is defined] **************************************************************************************************************************
 [WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: {{item}} is not defined

skipping: [localhost] => (item=parent) 
skipping: [localhost] => (item=parent.child1) 
failed: [localhost] (item=parent.child2) => {"ansible_loop_var": "item", "changed": false, "item": "parent.child2", "msg": "mandatory variable item not passed as extra args when invoking playbook"}

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

Voici la sortie du playbook.

$ cat play.yml                                                                                                          (livingstone-dev/monitoring)
- hosts: localhost
  vars:
    parent:
      child1: true
  tasks:
  - name: show variable
    debug:
      var: parent
  - name: "Check if variable is defined"
    fail:
      msg: "mandatory variable item not passed as extra args when invoking playbook"
    when: "{{item}} is not defined"
    loop:
    - parent
    - parent.child1
    - parent.child2


0 commentaires

1
votes

Pour obtenir le même résultat sans avertissement, remplacez

when: not vars|json_query(item)

par

when: "{{item}} is not defined"


2 commentaires

J'ai essayé votre suggestion. Obtention de cette erreur pour tous les éléments de la boucle. "msg": "Options non valides pour échec: quand" Cela fonctionne-t-il pour vous? Est-ce que j'ai râté quelque chose?


J'ai corrigé la condition.