Inventory file - different groups with same variables but not the same value

Hello,

after reading this post :
https://groups.google.com/forum/#!topic/ansible-project/XbVNoUED2cU
http://docs.ansible.com/intro_inventory.html

I have a similar question with inventory file,

I want to provisionning on the same host two tomcat using same role, but http port, path must be different.

Example:

In my inventory file prod.hosts
[tomcat1]
host1

[tomcat2]
host1

[tomcat1:vars]
product_dir=‘/home/produit/tomcat1’
[tomcat2:vars]
product_dir=‘/home/produit/tomcat2’

In site.yml

  • hosts: tomcat1
    user: root
    pre_tasks:

  • debug: msg={{product_dir}}

  • hosts: tomcat2
    user: root
    pre_tasks:

  • debug: msg={{product_dir}}

playbook:

PLAY [tomcat1] ****************************************************************

GATHERING FACTS ***************************************************************
ok: [host1]

TASK: [debug msg={{product_dir}}] *********************************************
ok: [srv-vid-tux48] => {
“msg”: “/data/produits/tomcat1”
}

PLAY [tomcat2] ****************************************************************

GATHERING FACTS ***************************************************************
ok: [srv-vid-tux48]

TASK: [debug msg={{product_dir}}] *********************************************
ok: [srv-vid-tux48] => {
“msg”: “/data/produits/tomcat1”
}

ansible version 1.6.1

What’s your question?

Thanks.

Hello ,
Sorry I forget to ask you why the variables in group tomcat1 apply to tomcat2 ? whereas I have two groups with different value of variables for tomcat’s path ?

“Sorry I forget to ask you why the variables in group tomcat1 apply to tomcat2 ?”

Because the host is in both groups.

Groups may cover things such as purpose, geographic location, hardware type, what team owns them, and more.

The “hosts:” directive merely selects what hosts are going to be targetted in the given play, and the variables come from all groups, with subgroups being able to override those of their parents (for instance, a north_carolina server may specify time.nc.example.com for NTP while a united_states server might set a default of time.ny.example.com)

Thank you for your answer ,

If I want to use tomcat’s role for two instances on same host is better to use group_vars than the inventory file ?

"If I want to use tomcat’s role for two instances on same host is better to use group_vars than the inventory file ? "

group_vars and inventory variables are the same thing expressed two different ways.

If you want to use the role twice on the same box, this is a different pattern, which are parameterized roles:

Click http://docs.ansible.com/playbooks_roles.html#roles and scroll down and it will talk about parameterized roles.

You can pass different parameters to the same role, applied twice, to the same server or set of servers.

Hello

Thank you for your answers, parameterized roles is a solution, but it’s actually not as simple as that when you have two environments . After reading your link I use vars_files for the distinction made by environment

example site.yml:

`

  • hosts: tomcat1-hosts

user: root

vars_files:

  • [‘vars/tomcat1_{{ env }}.yml’]

pre_tasks:

  • debug: msg={{product_dir }}

roles:

  • { role: tomcat, tags: tomcat }

  • hosts: tomcat2-hosts

user: root

vars_files:

  • [‘vars/tomcat2_{{ env }}.yml’]

pre_tasks:

  • debug: msg={{product_dir }}

roles:

  • { role: tomcat, tags: tomcat }
    `

My invetory file:
`
[tomcat1-hosts]
tux1

[tomcat2-hosts]
tux1

[all:children]
tomcat1-hosts
tomcat2-hosts

[all:vars]
env=‘prod’

`

Playbook:

`

PLAY [tomcat1-hosts] **********************************************************

GATHERING FACTS ***************************************************************

TASK: [debug msg={{product_dir}}] *********************************************

ok: [tux1] => {
“msg”: “/data/produits/tomcat1”
}

PLAY [tomcat2-hosts] *********************************************************

GATHERING FACTS ***************************************************************

TASK: [debug msg={{product_dir}}] *********************************************

ok: [tux1] => {
“msg”: “/data/produits/tomcat2”
}

`

So I can deploy to different environments, the same application with different value for tomcat path, tomcat port. Thanks ansible for that :wink:

If you’re doing vars_files per environment, I’d highly recommend making the environment a group in inventory. This way it will automatically be loaded by group_vars without the extra step of the parameterized vars_file.