Индивидуальные роли в окружении

У меня есть несколько сред, для которых требуется набор текстовых файлов для того, чтобы такие вещи, как mule, разговаривали с правильными конечными точками.

Для этой среды это работает:

ansible-playbook test03.yml

Единственная разница между окружающей средой (с точки зрения восприятия) - это информация, содержащаяся в. /roles/esb/vars/main.yml.

Я рассмотрел использование svn для сохранения vars/main.yml для каждой среды, поэтому каждый раз, когда мне нужно настраивать среду, я проверяю роли, а затем vars/main.yml для этой среды, прежде чем запускать команду выше.

Для меня это не изящное решение. Как я могу сделать это лучше?

Структура каталогов

./test03.yml
./roles/esb/vars/main.yml
./roles/esb/tasks/main.yml
./roles/esb/templates/trp.properties.j2

./test03.yml

---
- hosts: test03-esb
  gather_facts: no
  roles:
    - esb

./роли/ESB/вары/main.yml

---
  jndiProviderUrl: 'jnp://mqendpoint.company.com:1099'
  trp_endpoint_estask: 'http://tmfendpoint.company.com:8080/tmf/estask'
  trp_endpoint_builderQ: 'jnp://mqendpoint.company.com:1099'

./роли/ESB/задачи/main.yml

---
  - name: replace variables in templates
    template: src=trp.properties.j2  dest=/path/to/mule/deploy/conf/trp.properties

./роли/ESB/шаблоны/trp.properties.j2

trp.endpoint.estask={{ trp_endpoint_estask }}
trp.endpoint.builderQ={{ trp_endpoint_builderQ }}

Ответ 1

Чтобы использовать определенные значения для разных сред, все, что вам нужно сделать, - это переместить ваши переменные из самой роли в файл переменных для этого конкретного ресурса, например.

production
|- group_vars
  |- servers
|- inventory
staging
|- group_vars
  |- servers
|- inventory
development
|- group_vars
  |- servers
|- inventory
roles
|- esb
  |- tasks
     |- main.yml
  |- templates
     |- trp.properties.j2
etc.

Внутри каждой среды group_vars/servers вы можете указать переменную, специфичную для этой среды, например

$ cat production/group_vars/servers
---
jndiProviderUrl: 'jnp://mqendpoint.company.com:1099'
trp_endpoint_estask: 'http://tmfendpoint.company.com:8080/tmf/estask'
trp_endpoint_builderQ: 'jnp://mqendpoint.company.com:1099'

$ cat staging/group_vars/servers
---
jndiProviderUrl: 'jnp://staging.mqendpoint.company.com:1099'
trp_endpoint_estask: 'http://staging.tmfendpoint.company.com:8080/tmf/estask'
trp_endpoint_builderQ: 'jnp://staging.mqendpoint.company.com:1099'

$ cat development/group_vars/servers
---
jndiProviderUrl: 'jnp://dev.mqendpoint.company.com:1099'
trp_endpoint_estask: 'http://dev.tmfendpoint.company.com:8080/tmf/estask'
trp_endpoint_builderQ: 'jnp://dev.mqendpoint.company.com:1099'

Затем шаблон Jinja2 остается таким же (ему все равно, откуда все переменные появляются).

Затем вы выполните:

# Provision production
$ ansible-playbook $playbook -i production/inventory

# Provision staging
$ ansible-playbook $playbook -i staging/inventory

# Provision development
$ ansible-playbook $playbook -i development/inventory

Ответ 2

Я решаю это таким образом

-inv
|
---prod
|
---qa

Затем в файлах инвентаризации prod/qa я указываю такие группы верхнего уровня, как:

#inv/prod
[prod:children]
#all the rest of prod groups

#inv/qa
[qa:children]
#all the qa groups

Это позволяет мне иметь следующую структуру group_var, где я сохраняю все соответствующие переменные среды в этих файлах (в том числе env: qa или env: prod), поэтому я могу выполнять операции, основанные на фактическом членстве в группе, или на основе значения переменной env. Переменная 'environment' зарезервирована и не должна использоваться. Для этой цели также можно использовать имя переменной 'stage'.

inv
|
|
--group_vars
    |
    |
     ---qa
    |
     ---prod

Когда я запускаю playbook, я делаю это вот так:

ansible-playbook appservers.yml -i inv/prod