
Следующее задание:
- name: Download Jfrog Artifcats
ansible.windows.win_shell: |
$ENV:JFROG_CLI_OFFER_CONFIG="false"
jfrog rt download ...
when: ???
следует запускать только для машин, которые находятся center
в appservers
группе
---
all:
children:
root:
children:
center:
children:
appservers:
hosts:
vm1.domain.com:
qservers:
hosts:
vm2.domain.com:
dbservers:
hosts:
vm3.domain.com:
mobilefarms:
hosts:
children:
gateways:
hosts:
south:
children:
brooklyn:
hosts:
vm4.domain.com:
children:
clients:
hosts:
vm5.domain.com:
vm6.domain.com:
north:
children:
new_york:
hosts:
vm8.domain.com:
children:
clients:
hosts:
vm9.domain.com:
Что мне следует ввести в качестве условия, when
чтобы это осуществить? Также, каков принцип, лежащий в основе этой опции конфигурации?
решение1
Чтобы использовать членство в группе в условном выражении для задачи, воспроизведения или блока, следует использовать следующий формат:
when: inventory_hostname in groups["<group name>"]
Конкретно по Вашему первоначальному вопросу:
when: inventory_hostname in groups["appservers"]
Чтобы охватить все машины в домене north
, вам просто нужно изменить его на:
when: inventory_hostname in groups["north"]
Что касается вашего последующего разъяснения (указания группы в определенном «местоположении»), поскольку имена групп должны быть уникальными в Ansible, нет необходимости различатькоторый appservers
группа, о которой вы говорите, appservers
может находиться только в одном месте.
Если вы попытаетесь создать две appservers
группы, только первая из них будет фактически проанализирована движком ansible; любая последующая группа с тем же именем будет проигнорирована. Таким образом, если вы планировали (в будущем) иметь группу appservers
под north
и appservers
группу под south
, вы обнаружите, что будут включены только члены первой группы.
В ansible, как мы этого достигнем (мое предположение о том, что выможетхотите в будущем), то наиболее приемлемый способ продолжить — добавить хосты в несколько групп, например, так, и соответствующим образом настроить лимит или условие:
all:
children:
north:
hosts:
a.domain.com:
b.domain.com:
south:
hosts:
y.domain.com:
z.domain.com:
appservers:
hosts:
a.domain.com:
y.domain.com:
dbservers:
hosts:
b.domain.com:
z.domain.com:
В этом примере, если вы хотитевсесерверы приложений, вы просто нацелитесь на appservers
. Если вы хотите только appservers
в north
регионе, то вы должны установить ограничение на воспроизведение на north:&appservers
, или в качестве альтернативы использовать условный
when:
- inventory_hostname in groups["appservers"]
- inventory_hostname in groups["north"]
В любом случае, я думаю, вам, возможно, понадобится освежить в памяти, как структурирован инвентарь в Ansible, для этого я бы рекомендовалгид пользователя; также на различных обучающих сайтах есть несколько замечательных ресурсов, которые могут дать гораздо более подробную информацию.
Для получения дополнительной информации о более сложном таргетинге с использованием нескольких групп (комбинаций, объединений, исключений и т. д.) предлагаю вам ознакомиться с этим другимгид пользователя.
Лично я изначально считал эту настройку утомительной и ограниченной, но по мере того, как я все больше привыкал к ней, я нахожу ее более динамичной, чем альтернативные варианты.