Możliwa grupa zmienna nie jest zdefiniowana w grze

0

Pytanie

Osiągnąłem dynamiczny asortyment dla Ansible, podczas jego wykonania określa grupę, do zmiennej, którą używam później w tutorialu.

W samouczku używam go dwa razy:

  • do pętli na jego zawartość:
    tasks:
       - include_tasks: include/restart.yaml
         loop: "{{ host_set | default(['all']) }}"
         loop_control:
           loop_var: h
    
  • i jako środek ustawić seryjnym zawieszeniu
    serial: "{{ host_set | default(false) | ternary('100%', '5') }}"
    

Zachowanie, które dostaję, której nie potrafię wyjaśnić, polega na tym, że host_set zmienna zdefiniowana i jest wypełniony poprawnie w czasie wykonywania zadania, ale podczas próby zainstalowania serial to wydaje się niepewna.

Czy jest to oczekiwane zachowanie, czy są zmienne grupy Ansible niepewne podczas konfiguracji atrybutów gry, ale pojawiają się później, gdy rozpoczyna się wykonywanie zadania dla tej konkretnej gry?

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

Najlepsza odpowiedź

3

Grupowe zmienne stosuje się tylko do poszczególnych hostów. Gry są oceniane w kontekście, nie odnoszące się do hosta, dlatego dostępne są tylko zmienne, nie związane z internetem, takie jak zmienne z --extra-vars.

2021-11-24 01:32:48
1

Gdy przyczyna takiego zachowania jest doskonale przedstawione w odpowiedzi @flowerysong, istnieje obejście, które można wykorzystać do realizacji swoich wymagań.

Sztuczka polega na tym, że można określić dwa kawałki wewnątrz zbioru dramatów, a następnie użyć zmiennej, zainstalowany na hoście (- ach) pierwszej sztuki.

Tak więc to, co mamy zamiar zrobić, to:

  1. Uruchom sztukę na localhost i zainstaluj fakt, pochodzące z grupy przyjmującej, na który celujemy w drugiej grze
  2. Opcjonalnie: ja również określił target_hosts zmienna w pierwszej grze, aby być pewnym, że jeśli celem drugiej gry zostanie zmieniona, zmienna grupy hostów zawsze będzie tą, na którą nastawiona jest druga gra.
  3. Użyj tej zmiennej w drugiej grze, począwszy od localhost'zhostvars

Uwaga dodatkowa: brak ewidencji smaku, ale ja wolę wbudowane "jeśli" ternary filtr, jednak nie są one ściśle równoważne.


Tak więc, biorąc pod uwagę scenariusz:

- 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: 
  • Po uruchomieniu z host_set: true w nodesGrupa:
    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   
    
  • Po uruchomieniu z host_set: false w nodesGrupa:
    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

Dziękuję za dodatkowe informacje!
Radu Stoenescu

W innych językach

Ta strona jest w innych językach

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