14

我有许多环境,需要定制一堆文本文件,以便像 mule 这样的东西与正确的端点对话。

对于这种环境,这有效:

ansible-playbook test03.yml

环境之间的唯一区别(从 ansible 的角度来看)是 ./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

./roles/esb/vars/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'

./roles/esb/tasks/main.yml

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

./roles/esb/templates/trp.properties.j2

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

2 回答 2

27

为了在不同的环境中使用特定的值,您需要做的就是将变量从角色本身移动到该特定环境的变量文件中,例如

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
于 2013-12-31T15:57:04.780 回答
4

我这样处理

-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',以便我可以根据实际的组成员身份或基于环境变量的值。“环境”变量是保留的,不应使用。也可以为此目的使用变量名“阶段”。

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

当我运行剧本时,我会这样做:

ansible-playbook appservers.yml -i inv/prod
于 2014-01-07T23:17:02.720 回答