2016-10-13 4 views
3

Предположим, у меня есть одна пьеса с некоторыми ролями для установки сервера приложений, и мне нравится применять одну и ту же playbook на обоих производственных и тестовых серверах.Ansible: выполнить роль только для некоторых хостов

Оба сервера производства и тестирования имеют один и тот же список ролей, за исключением одного, который должен применяться только на рабочих серверах.

Можно ли каким-то образом указать, что эта роль будет применяться только к производственным серверам, использующим один и тот же учебник?

Например, если сборник пьес является:

--- 
- hosts: appserver 
    roles: 
    - { role: mail, tags: ["mail"] } 
    - { role: firewall, tags: ["firewall"] } 
    - { role: webserver, tags: ["webserver"] } 
    - { role: cache, tags: ["cache"] } 

и у меня есть два запасов: один для производства и один для тестирования.

Когда я запускаю playbook с использованием инвентаря тестирования, я не хочу, чтобы роль «брандмауэр» выполнялась.

Моя идея сделать что-то вроде установки переменной в «производства» инвентаре и использовать что-то вроде «если < вар> установлен, то выполнить роль„межсетевой экран“» ... Я, если это не знаю возможно, и если да, то как это сделать?

ответ

5

Вы можете определить переменную, например 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"] } 

Какой путь вы идете административное решение. Второй метод использует меньше шагов, но требует, чтобы имя файла инвентаря было «жестко запрограммировано» в учебнике.

+0

ответ Оба Gilė и ваши мы я точно понял, что я искал (я только что принял ответ gile, потому что он опубликовал его первым :)) Спасибо за вашу помощь! – tvs

+1

@tvs Я добавил еще один способ, который лучше подходит вашему делу. – techraf

5

Почему бы вам просто не использовать группы инвентаря? Делают два кадастры:

испытание:

[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"] } 
+0

хороший вариант! могу ли я использовать в инвентаре «производство» что-то вроде этого? '[приложение] компания-прод-сервер [брандмауэров: дети] приложение ' что путь избежать указания всех серверов в два раза, не так ли? (это очень важно для меня, потому что у меня есть несколько серверов в каждой категории) – tvs

+0

@tvs да, это должно работать так, как вы ожидаете. –

Смежные вопросы