# various questions about using ansible - inventory, sharing handlers, lists and maps

**URL:** <https://forum.ansible.com/t/various-questions-about-using-ansible-inventory-sharing-handlers-lists-and-maps/14643>\
**Category:** Ansible Project\
**Created:** [February 24, 2014, 7:45pm UTC](https://forum.ansible.com/t/various-questions-about-using-ansible-inventory-sharing-handlers-lists-and-maps/14643 "2014-02-24T19:45:19Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Mark\_Butler](https://avatars.discourse-cdn.com/v4/letter/m/47e85d/32.png) [@Mark\_Butler](https://forum.ansible.com/u/Mark_Butler)\
**Post date:** [February 24, 2014, 7:45pm UTC](https://forum.ansible.com/t/various-questions-about-using-ansible-inventory-sharing-handlers-lists-and-maps/14643/1 "2014-02-24T19:45:19Z")

</div>

Hello team,

I am getting started with ansible but I have a number of questions. Apologies in advance for the rather noob questions:

1. In my inventory, is there anyway I can specify a single domain for all the hosts e.g.

[myhosts]  
hostA  
hostB

rather than

[myhosts]  
[hostA.example.com](http://hostA.example.com)  
[hostB.example.com](http://hostB.example.com)

Given the requirement that I might be run tests from outside the domain?

1. Many of my roles need to call supervisor when they have finished so they all use the same handler:

---

<div class="post-metadata">

**Author:** ![Michael\_DeHaan1](https://avatars.discourse-cdn.com/v4/letter/m/5e9695/32.png) [@Michael\_DeHaan1](https://forum.ansible.com/u/Michael_DeHaan1)\
**Post date:** [February 24, 2014, 7:55pm UTC](https://forum.ansible.com/t/various-questions-about-using-ansible-inventory-sharing-handlers-lists-and-maps/14643/2 "2014-02-24T19:55:21Z")

</div>

> Hello team,
> 
> I am getting started with ansible but I have a number of questions.  
> Apologies in advance for the rather noob questions:
> 
> 1. In my inventory, is there anyway I can specify a single domain for all  
> the hosts e.g.
> 
> [myhosts]  
> hostA  
> hostB
> 
> rather than
> 
> [myhosts]  
> hostA.example.com  
> hostB.example.com
> 
> Given the requirement that I might be run tests from outside the domain?

There is not a way to set the domain name suffix on a group all together.

OS mechanisms on short filenames (i.e. resolv.conf) will apply

> 2. Many of my roles need to call supervisor when they have finished so  
> they all use the same handler:
> 
> ---  
> - name: restart supervisor  
> &nbsp;&nbsp;service: name=supervisor state=restarted
> 
> However at the moment I have the same duplicated handler file for each  
> role - how can I avoid this and have a single handler file?

Yes, you can define the handler in a common role and just use it once.

It's ok if the role doesn't have a tasks file too.

> 3. Is it possible to create strings from list?
> 
> I need to create a classpath variable - this is how I do it currently:
> 
> classpath: "{{ dest }}jarA.jar:{{ dest }}jarB.jar:{{ dest }}jarC.jar:{{  
> dest }}jarD.jar"

Yes! See the "set\_fact" module in the module docs, or just define a  
variable like so anywhere else in Ansible.

Variables are lazy-evaluated at the time of use.

> In Python I could use a loop to do this. Is there any way to do this in  
> Ansible?
> 
> 4. Do map style structures exist?
> 
> Similarly, when I am getting these jars I use a list like this - ideally  
> it would be better to use a map, then generate the list from the map to  
> avoid configuration duplication. Is there any way to achieve this?
> 
> - name: my service | Get jars  
> &nbsp;&nbsp;action: get\_url url={{ build\_url }}lastSuccessfulBuild/artifact/{{ item  
> }} dest={{ dest }} mode=0440  
> &nbsp;&nbsp;with\_items:  
> &nbsp;&nbsp;&nbsp;&nbsp;- pathA/jarA  
> &nbsp;&nbsp;&nbsp;&nbsp;- pathB/jarB  
> &nbsp;&nbsp;&nbsp;&nbsp;- pathC/jarC  
> &nbsp;&nbsp;&nbsp;&nbsp;- pathD/jarD

So what you have above works.

What would be in your map/dictionary? You can definitely iterate across a  
list of dictionaries and hopefully I can help explain further -- just need  
a bit more context.

Thanks!

---

<div class="post-metadata">

**Author:** ![Mark\_Butler](https://avatars.discourse-cdn.com/v4/letter/m/47e85d/32.png) [@Mark\_Butler](https://forum.ansible.com/u/Mark_Butler)\
**Post date:** [February 24, 2014, 8:09pm UTC](https://forum.ansible.com/t/various-questions-about-using-ansible-inventory-sharing-handlers-lists-and-maps/14643/3 "2014-02-24T20:09:56Z")

</div>

Hi Michael,

Sorry about the SO mix-up.

The reason I don’t want to define it at the inventory or group level is it isn’t associated with them - it’s associated with the role - because the service wherever it runs will use the same jars - and because the jars often have version numbers in that will change slowly with release - so it doesn’t make sense to pass them in every time but also it makes sense to have them in a config so they can be changed without breaking the template.

Actually, it turns out it’s easy and I was being stupid because the “best practice” document does say that I can create vars at the role level (as Leucos pointed out, thanks!). My next question was going to be if roles can share vars but I am guessing by your reply above they can via the common task just like handlers.

For the list and map, this is how I would do it Python - I’m just keen to avoid duplicate config values.

build\_server\_path = ‘[http://builderserver/path](http://builderserver/path)’  
dest\_path = ‘/dest/path/’  
jars = {‘pathA’:‘jarA’, ‘pathB’: ‘jarB’, ‘pathC’: ‘jarC’}

# jars have path on build server because they come from different modules

urls = [build\_server\_path + k + ‘/’ + jars[k] for k in jars]

# but for service execution put them one directory and generate classpath to simplify things

dest\_jars = [‘/dest/path/’ + jars[k] for k in jars]  
classpath = ‘:’.join(dest\_jars)

download(urls, dest\_path)  
set\_classpath(classpath)

Thanks,

Mark

---

<div class="post-metadata">

**Author:** ![Mark\_Butler](https://avatars.discourse-cdn.com/v4/letter/m/47e85d/32.png) [@Mark\_Butler](https://forum.ansible.com/u/Mark_Butler)\
**Post date:** [February 24, 2014, 11:44pm UTC](https://forum.ansible.com/t/various-questions-about-using-ansible-inventory-sharing-handlers-lists-and-maps/14643/4 "2014-02-24T23:44:37Z")

</div>

Hi Michael, Team,

One more question I am afraid - is there any way I can share templates between roles?

I tried putting my template in common/templates but it didn’t work?

Thanks!

Mark

---

<div class="post-metadata">

**Author:** ![Michael\_DeHaan2](https://avatars.discourse-cdn.com/v4/letter/m/da6949/32.png) [@Michael\_DeHaan2](https://forum.ansible.com/u/Michael_DeHaan2)\
**Post date:** [February 25, 2014, 12:07am UTC](https://forum.ansible.com/t/various-questions-about-using-ansible-inventory-sharing-handlers-lists-and-maps/14643/5 "2014-02-25T00:07:39Z")

</div>

You can …/…/common/templates/foo.j2 in the src=

– Michael

---

<div class="post-metadata">

**Author:** ![Alexander\_Litnitskiy](https://avatars.discourse-cdn.com/v4/letter/a/258eb7/32.png) [@Alexander\_Litnitskiy](https://forum.ansible.com/u/Alexander_Litnitskiy)\
**Post date:** [July 15, 2015, 11:53am UTC](https://forum.ansible.com/t/various-questions-about-using-ansible-inventory-sharing-handlers-lists-and-maps/14643/6 "2015-07-15T11:53:51Z")

</div>

Regarding first question I do it myself like:

[myhosts]  
hostA  
hostB

group\_vars/all

ansible\_ssh\_host: “{{inventory\_hostname}}.{{domain}}”

group\_vars/myhosts:  
domain: [example.com](http://example.com)

In my case each group/host must define “domain” variable.
