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