Ansible groupe de variable non définie dans le jeu

0

La question

J'ai mis en place un inventaire dynamique pour Ansible, au cours de son exécution, il définit une variable de groupe que je suis en utilisant plus tard dans un playbook.

Dans le playbook, je l'utilise deux fois:

  • pour boucler sur son contenu:
    tasks:
       - include_tasks: include/restart.yaml
         loop: "{{ host_set | default(['all']) }}"
         loop_control:
           loop_var: h
    
  • et comme un moyen de définir série conditionnellement
    serial: "{{ host_set | default(false) | ternary('100%', '5') }}"
    

Le comportement-je que je ne peux pas l'expliquer, c'est que l' host_set la variable est définie et correctement renseignées lors de l'exécution de la tâche, mais lorsque vous tentez de définir serial il semble être indéfini.

Est-ce le comportement attendu, sont Ansible groupe de variables non défini lors de la configuration d'un jeu d'attributs, mais les pop-up plus tard, lors de l'exécution de la tâche pour que le jeu ne commence?

ansible
2021-11-23 21:48:17
2

La meilleure réponse

3

Les variables de groupe s'appliquent uniquement aux hôtes individuels. Joue sont évaluées dans un non-hôte contexte, de sorte que les seules variables disponibles sont non-spécifiques de l'hôte variables, comme ceux de la --extra-vars.

2021-11-24 01:32:48
1

Lorsque la raison de ce comportement est parfaitement indiqué par @flowerysong de réponse, il y a une solution que vous pouvez utiliser pour obtenir votre exigence.

L'astuce est d'utiliser le fait que vous pouvez définir deux pièces de théâtre à l'intérieur d'un playbook et, ensuite, utiliser la variable définie sur l'ordinateur hôte(s) de la première pièce.

Donc, ce que nous allons faire, c'est:

  1. Exécuter un jeu sur localhost et de définir un fait à venir à partir de l'hôte de groupe que nous cherchons à cibler dans le deuxième jeu
  2. En option: j'ai également défini une target_hosts variable dans la première pièce, à être sûr que, si le deuxième jeu de la cible est modifiée, le groupe hôte variable est toujours le même que le deuxième jeu est d'aller à la cible.
  3. Utilisez cette variable dans la seconde pièce, à partir de localhost's hostvars

Note: il n'y a pas de comptabilité pour le goût, mais je préfère le inline si à l' ternary le filtre, quand même, ils sont strictement équivalentes.


Donc, compte tenu de la playbook:

- hosts: localhost
  gather_facts: no

  tasks:
    - set_fact:
        target_hosts: nodes
        
    - set_fact:
        host_set: "{{ hostvars[groups[target_hosts].0].host_set }}"

- hosts: "{{ hostvars.localhost.target_hosts }}"
  gather_facts: no
  serial: "{{ '100%' if hostvars.localhost.host_set else '1' }}"
  
  tasks:
    - debug: 
  • Lors de l'exécution avec host_set: true dans le nodesgroupe:
    PLAY [localhost] *******************************************************************************************************************
    
    TASK [set_fact] ********************************************************************************************************************
    ok: [localhost]
    
    TASK [set_fact] ********************************************************************************************************************
    ok: [localhost]
    
    PLAY [nodes] ***********************************************************************************************************************
    
    TASK [debug] ***********************************************************************************************************************
    ok: [node1] => 
      msg: Hello world!
    ok: [node2] => 
      msg: Hello world!
    ok: [node3] => 
      msg: Hello world!
    
    PLAY RECAP *************************************************************************************************************************
    localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    node1                      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    node2                      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    node3                      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    
  • Lors de l'exécution avec host_set: false dans le nodesgroupe:
    PLAY [localhost] *******************************************************************************************************************
    
    TASK [set_fact] ********************************************************************************************************************
    ok: [localhost]
    
    TASK [set_fact] ********************************************************************************************************************
    ok: [localhost]
    
    PLAY [nodes] ***********************************************************************************************************************
    
    TASK [debug] ***********************************************************************************************************************
    ok: [node1] => 
      msg: Hello world!
    
    PLAY [nodes] ***********************************************************************************************************************
    
    TASK [debug] ***********************************************************************************************************************
    ok: [node2] => 
      msg: Hello world!
    
    PLAY [nodes] ***********************************************************************************************************************
    
    TASK [debug] ***********************************************************************************************************************
    ok: [node3] => 
      msg: Hello world!
    
    PLAY RECAP *************************************************************************************************************************
    localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    node1                      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    node2                      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    node3                      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    
2021-11-24 11:14:59

Merci pour les infos supplémentaires!
Radu Stoenescu

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................