Ansible skupiny nedefinovaná proměnná ve hře

0

Otázka

Jsem implementoval dynamické zásob pro Ansible, během jejího plnění definuje skupinu proměnných, které jsem pomocí později v sestavě.

V učebnici, používám ho dvakrát:

  • pro smyčkování přes jeho obsah:
    tasks:
       - include_tasks: include/restart.yaml
         loop: "{{ host_set | default(['all']) }}"
         loop_control:
           loop_var: h
    
  • a jako prostředek pro nastavení sériové podmíněně
    serial: "{{ host_set | default(false) | ternary('100%', '5') }}"
    

Chování chápu, že nemůžu vysvětlit, je to, že host_set proměnná je definována a naplněna správně během provádění úlohy, ale když se snaží nastavit serial to se zdá být nedefinovaná.

Je to očekávané chování, jsou Ansible skupina nedefinované proměnné při nastavení play atributy, ale pop-up později při plnění úkolu pro konkrétní hra začíná?

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

Nejlepší odpověď

3

Skupina proměnných, které se vztahují pouze na jednotlivé hostitele. Hry jsou hodnoceny v non-host kontextu, takže pouze proměnné, které jsou k dispozici jsou non-host-specifické proměnné, jako ty z --extra-vars.

2021-11-24 01:32:48
1

Když důvod tohoto chování je dobře uvedl @flowerysong odpověď, tam je řešení, které můžete použít k dosažení vašeho požadavku.

Trik je pomocí skutečnost, že můžete definovat dvě hry uvnitř playbook a pak použít proměnnou nastavit na hostitele(s) z první hry.

Takže, co budeme dělat, je:

  1. Spuštění hra na localhost a nastavit skutečnost, pocházející z hostitelské skupiny, že naším cílem je cíl v druhém hrát
  2. Volitelně: také jsem definoval target_hosts proměnné v první hře, být jisti, že, pokud druhá hra je cíl je upravený, skupiny hostitelů proměnná je vždy ten, že druhá hra bude cíl.
  3. Pomocí této proměnné v druhé hře, od localhost's hostvars

Další poznámka: není účetnictví pro vkus, ale já dávám přednost inline-li k ternary filtr, přesto, že jsou naprosto rovnocenné.


Takže, vzhledem k 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: 
  • Při spuštění 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   
    
  • Při spuštění 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

Děkuji za další info!
Radu Stoenescu

V jiných jazycích

Tato stránka je v jiných jazycích

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