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

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?

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

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
  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
  action: get_url url={{ build_url }}lastSuccessfulBuild/artifact/{{ item
}} dest={{ dest }} mode=0440
  with_items:
    - pathA/jarA
    - pathB/jarB
    - pathC/jarC
    - 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!

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

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

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

– Michael

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

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