#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
), и это отлично сработало