Возможная групповая переменная, не определенная в игре

0

Вопрос

Я реализовал динамический инвентарь для Ansible, во время его выполнения он определяет групповую переменную, которую я использую позже в учебнике.

В учебнике я использую его дважды:

  • для зацикливания на его содержимом:
    tasks:
       - include_tasks: include/restart.yaml
         loop: "{{ host_set | default(['all']) }}"
         loop_control:
           loop_var: h
    
  • и как средство установить серийный условно
    serial: "{{ host_set | default(false) | ternary('100%', '5') }}"
    

Поведение, которое я получаю, которое я не могу объяснить, заключается в том, что host_set переменная определена и заполнена правильно во время выполнения задачи, но при попытке установить serial это кажется неопределенным.

Является ли это ожидаемым поведением, являются ли переменные группы Ansible неопределенными при настройке атрибутов игры, но появляются позже, когда начинается выполнение задачи для этой конкретной игры?

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

Лучший ответ

3

Групповые переменные применяются только к отдельным хостам. Игры оцениваются в контексте, не относящемся к хосту, поэтому доступны только переменные, не относящиеся к хосту, такие как переменные из --extra-vars.

2021-11-24 01:32:48
1

Когда причина такого поведения прекрасно изложена в ответе @flowerysong, существует обходной путь, который вы можете использовать для выполнения своих требований.

Хитрость заключается в том, что вы можете определить две пьесы внутри сборника пьес, а затем использовать переменную, установленную на хосте (- ах) первой пьесы.

Итак, что мы собираемся сделать, так это:

  1. Запустите пьесу на localhost и установите факт, исходящий от принимающей группы, на который мы нацелены во второй игре
  2. Необязательно: я также определил target_hosts переменная в первой игре, чтобы быть уверенным, что, если цель второй игры будет изменена, переменная группы хостов всегда будет той, на которую нацелена вторая игра.
  3. Используйте эту переменную во второй игре, начиная с localhosthostvars

Дополнительное примечание: нет учета вкуса, но я предпочитаю встроенное "если" ternary фильтр, тем не менее, они строго эквивалентны.


Итак, учитывая сценарий:

- 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: 
  • При запуске с host_set: true в nodes Группа:
    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   
    
  • При запуске с host_set: false в nodes Группа:
    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

Спасибо вам за дополнительную информацию!
Radu Stoenescu

На других языках

Эта страница на других языках

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