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"] }
Другие вопросы по тегам