Question

I have a number of environments, that require a bunch of text files to be tailored in order for things like mule to speak to the right endpoints.

For this environment, this works:

ansible-playbook test03.yml

The only difference between an environment (from ansible's perspective) is the information held in ./roles/esb/vars/main.yml.

I've considered using svn to keep a vars/main.yml for each environment, so each time I need to configure an environment I check out roles and then vars/main.yml for that environment, before I run the command above.

To me, not an elegant solution. How can I do this better?

Directory structure

./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 }}
Was it helpful?

Solution

In order to use specific values for different environments all you need to do is move your variables from the role itself to a variables file for that specific enrivonment e.g.

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.

Inside each of the environments' group_vars/servers you could specify variable specific for that environment, e.g.

$ 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'

The Jinja2 template can then remain the same (it doesn't care where the variables come from after all).

You would then execute:

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

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

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

OTHER TIPS

I tackle it this way

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

Then within the prod/qa inventory files, I specify top level groups like so:

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

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

Which allows me to have the following group_var structure, where I keep all the relevant environment variables within these files (including 'env: qa' or 'env: prod', so I can perform operations based on the actual group membership, or based on the value of the env variable. The 'environment' variable is reserved and should not be used. Could also use the variable name 'stage' for this purpose.

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

When I run a playbook, I do it like this:

ansible-playbook appservers.yml -i inv/prod
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top