Как пропустить хост Ansible, если он член группы

#ansible #ansible-awx

#ansible #ansible-awx

Вопрос:

Я работаю над сборником пьес (для использования в AWX) для обработки некоторой серверной обработки для одного из наших веб-приложений. Одна из дополнительных переменных, переданных в playbook через REST-вызов AWX, используется для передачи хостов
в playbook

 hosts: {{target}}
  

целью может быть один сервер или список серверов.
Вопрос: как я могу использовать шаблоны, чтобы пропустить хост, если он не является членом группы инвентаря
, например, если я хочу, чтобы playbook пропустил сервер, если он находится в промежуточной группе в инвентаре
Я попробовал следующее:

 hosts: "{{target}}:!staging"
  

это работает только в том случае, если в качестве целевого var отправляется только один сервер, однако при вызове со списком происходит сбой.

Комментарии:

1. Как вы target выглядите, когда у вас несколько хостов?

2. @Benoit спасибо за ваш ответ. изменение списка хостов на использование двоеточий вместо запятых сработало. Я обновил свой сборник пьес, чтобы заменить запятые в хосте hosts: "{{target|replace(',', ':')}}:!staging"

3. Обновление: мне просто пришлось изменить свой разделитель на все двоеточия или все запятые, теперь это работает, если вызывается мой playbook со списком серверов, разделенных запятыми {{ target }},!staging) Спасибо @Benoit и @Zeitounator за вашу помощь в этом

Ответ №1:

Это должно сработать, если вы используете : в качестве разделителя для своих хостов, а не , .


Синтаксис host1:host2:host3:!staging работает, но host1,host2,host3:!staging , с другой стороны, выдает предупреждение

[ПРЕДУПРЕЖДЕНИЕ]: Не удалось сопоставить предоставленный шаблон хоста, игнорируя: host3:!staging

и это вполне может быть проблемой, с которой вы тоже сталкиваетесь.
Здесь описаны два синтаксиса

Учитывая инвентарь:

 all:
  hosts:
    host1:
    host2:
    host3:

  children:
    staging:
      hosts:
        host2:
  

И сборник пьес:

 - hosts: host1:host2:host3:!staging
  gather_facts: no
      
  tasks:
    - debug:
        msg: "{{ inventory_hostname  }}"
  

Это приводит к повторению:

 PLAY [host1:host2:host3:!staging] *********************************************************************************

TASK [debug] ******************************************************************************************************
ok: [host1] => {
    "msg": "host1"
}
ok: [host3] => {
    "msg": "host3"
}

PLAY RECAP ********************************************************************************************************
host1                      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host3                      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
  

И это дает точно такое же резюме при использовании playbook:

 - hosts: "{{ target }}:!staging"
  gather_facts: no
      
  tasks:
    - debug:
        msg: "{{ inventory_hostname  }}"
  

Запуск через:

 ansible-playbook play.yml -i inventory.yml -e "target=host1:host2:host3"
  

Комментарии:

1. Это абсолютно не ошибка: вы либо используете coma, либо двоеточие в качестве разделителя, но вы не можете смешивать оба. Обратите внимание, что использование coma везде также устраняет вашу проблему (т. Е. {{ target }},!staging ), и что смешивание разделителей наоборот снова все нарушает (т. Е. {{target|replace(',', ':')}},!staging )

2. Спасибо @Zeitounator, я изменил все это на использование ‘,’ ( {{ target }},!staging ), и это отлично сработало