Ansible: выполнять роль только для некоторых хостов
Допустим, у меня есть одна книга с некоторыми ролями для установки сервера приложений, и мне нравится применять одну и ту же книгу на рабочих и тестовых серверах.
И производственный, и тестовый серверы имеют одинаковый список ролей, за исключением одной, которую следует применять только на производственных серверах.
Можно ли как-то указать, что эта роль будет применяться только к рабочим серверам, использующим одну и ту же пьесу?
Например, если книга воспроизведения:
---
- hosts: appserver
roles:
- { role: mail, tags: ["mail"] }
- { role: firewall, tags: ["firewall"] }
- { role: webserver, tags: ["webserver"] }
- { role: cache, tags: ["cache"] }
и у меня есть два инвентаря: один для производства и один для тестирования.
Когда я запускаю книгу с использованием инвентаря тестирования, я не хочу, чтобы выполнялась роль "брандмауэр".
Моя идея состоит в том, чтобы сделать что-то вроде установки переменной в "производственном" инвентаре и использовать что-то вроде "если установлено , затем выполнить роль" брандмауэр ""... Я не знаю, возможно ли это, и если это есть, как это сделать?
3 ответа
- { role: firewall, tags: ["firewall"], when: MyVar }
См. Раздел "Когда" для ролей и включений.
Вы можете определить переменную, например production_environment
в файлах инвентаря назначьте true
или же false
ценить и использовать when
условно в пьесе:
---
- hosts: appserver
roles:
- { role: mail, tags: ["mail"] }
- { role: firewall, tags: ["firewall"], when: production_environment }
- { role: webserver, tags: ["webserver"] }
- { role: cache, tags: ["cache"] }
Или вы можете получить доступ inventory_file
переменная напрямую. Например, если вы используете -i production
:
---
- hosts: appserver
roles:
- { role: mail, tags: ["mail"] }
- { role: firewall, tags: ["firewall"], when: inventory_file == "production" }
- { role: webserver, tags: ["webserver"] }
- { role: cache, tags: ["cache"] }
Какой путь вы выберете, является административным решением. Второй метод использует меньше шагов, но требует, чтобы имя файла инвентаризации было жестко закодировано в книге воспроизведения.
Почему бы вам просто не использовать группы инвентаря? Сделайте две инвентаризации:
тестирование:
[application]
my-dev-server
производство:
[application]
company-prod-server
[firewall]
company-prod-server
И измените свою пьесу следующим образом:
---
- hosts: firewall
roles:
- { role: firewall, tags: ["firewall"] }
- hosts: application
roles:
- { role: mail, tags: ["mail"] }
- { role: webserver, tags: ["webserver"] }
- { role: cache, tags: ["cache"] }