Ansible skupiny premennej neurčená v play

0

Otázka

Implementovali sme dynamický inventár pre Ansible, počas jej plnenia definuje skupinu premennej, že som pomocou neskôr v playbook.

V playbook, používam ho dvakrát:

  • pre looping nad jeho obsah:
    tasks:
       - include_tasks: include/restart.yaml
         loop: "{{ host_set | default(['all']) }}"
         loop_control:
           loop_var: h
    
  • a ako prostriedok na nastavenie sériového podmienečne
    serial: "{{ host_set | default(false) | ternary('100%', '5') }}"
    

Správanie som si, že nemôžem vysvetliť je, že host_set premenná je definovaný a vyplnené správne počas úlohou výkon, ale keď sa snaží nastaviť serial to sa zdá byť definované.

Je to očakávané správanie, sú Ansible skupiny premenných neurčená pri nastavení hrať atribúty, ale pop až neskôr, keď úlohou exekúcie pre danú hrať začína?

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

Najlepšiu odpoveď

3

Skupina premenných platia len pre jednotlivých hostí. Hrá sa vyhodnocujú v non-hosť kontexte, tak len premenné, ktoré sú k dispozícii, sú non-host-špecifické premenné, ako tie z --extra-vars.

2021-11-24 01:32:48
1

Keď dôvod tohto správania je dobre, uviedol @flowerysong odpoveď, tam je riešenie, ktoré môžete použiť na dosiahnutie vašich požiadaviek.

Trik je prostredníctvom toho, že si môžete definovať dve hrá vo vnútri playbook, a potom použite premenná je nastavená na hosť(s) prvého hrať.

Takže, čo budeme robiť, je:

  1. Spustiť a hrať na localhost a nastaviť skutočnosti prichádzajú zo základnej skupiny, ktoré sa snažíme cieľ v druhom hrať
  2. Voliteľne: ja tiež definovaný target_hosts premenná v prvom hrať, ak chcete mať istotu, že ak druhý hrať cieľ je upravený, hostiteľskej skupiny premenná je vždy ten, ktorý druhom, hrať sa bude cieľ.
  3. Použitie že premenná v druhom hrať, od localhost"s hostvars

Extra poznámka: nie je účtovníctvo, pre chuť, ale ja dávam prednosť inline, ak na ternary filter, stále, sú prísne ekvivalent.


Takže, vzhľadom na 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: 
  • Keď bežať s host_set: true v nodesskupina:
    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   
    
  • Keď bežať s host_set: false v nodesskupina:
    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

Ďakujem za ďalšie informácie!
Radu Stoenescu

V iných jazykoch

Táto stránka je v iných jazykoch

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