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

310 views
Skip to first unread message

Mark Butler

unread,
Feb 24, 2014, 2:45:19 PM2/24/14
to ansible...@googlegroups.com
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]

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


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?


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"

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


Thanks in advance,

Mark


Michael DeHaan

unread,
Feb 24, 2014, 2:55:21 PM2/24/14
to ansible...@googlegroups.com
On Mon, Feb 24, 2014 at 2:45 PM, Mark Butler <markhen...@gmail.com> wrote:
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]

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!



Thanks in advance,

Mark


--
You received this message because you are subscribed to the Google Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To post to this group, send email to ansible...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/58e4fa83-8ce3-41fc-a6f6-48e8c2f52f3a%40googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Mark Butler

unread,
Feb 24, 2014, 3:09:56 PM2/24/14
to ansible...@googlegroups.com
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


--
You received this message because you are subscribed to a topic in the Google Groups "Ansible Project" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/ansible-project/7N9qqACa3lI/unsubscribe.
To unsubscribe from this group and all its topics, send an email to ansible-proje...@googlegroups.com.

To post to this group, send email to ansible...@googlegroups.com.

Mark Butler

unread,
Feb 24, 2014, 6:44:37 PM2/24/14
to ansible...@googlegroups.com
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

Michael DeHaan

unread,
Feb 24, 2014, 7:07:39 PM2/24/14
to ansible...@googlegroups.com
You can ../../common/templates/foo.j2 in the src=

-- Michael

Alexander Litnitskiy

unread,
Jul 15, 2015, 8:30:40 AM7/15/15
to ansible...@googlegroups.com
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.
Reply all
Reply to author
Forward
0 new messages