为环境量身定制ansible角色

时间:2013-12-30 10:39:39

标签: roles ansible

我有很多环境,需要定制一堆文本文件才能让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

./角色/ 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 }}

2 个答案:

答案 0 :(得分:26)

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

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

答案 1 :(得分: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',因此我可以根据实际的组成员身份执行操作,或者基于env变量的值.'environment'变量是保留的,不应该使用。也可以使用变量名'stage'来实现此目的。

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

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

ansible-playbook appservers.yml -i inv/prod