How to use conditions in Playbook itself

232 views
Skip to first unread message

Suraj

unread,
Jan 21, 2015, 11:48:55 AM1/21/15
to ansible...@googlegroups.com
Hi Folks,

I am trying to create single playbook for every service we have. So here we need to deploy multiple roles on different service instance.
What I want is that, I want to just define variable in different group vars files and depending upon that variable, playbook should run the roles like:

if we have service A which has variable like:
roles:
- common
- roleA

and service B has:
roles:
- common
- roleB

now single playbook should run use these variables and depending upon value it should sun respective roles on respective service instances like:

playbook.yml

....

roles:
  - { role : "{{ item }}" }
with_items:
  - roles

But it is not working as I want, it give me error:
"ERROR: with_items is not a legal parameter at this level in an Ansible Playbook"

Any Ideas how can I achieve the same using conditions in playbook??

Best Wishes,
Suraj

Jonathan Davila

unread,
Jan 21, 2015, 12:05:28 PM1/21/15
to ansible...@googlegroups.com
Seems to be sort of an anti-pattern to do it this way. Referencing: https://groups.google.com/forum/#!msg/ansible-project/CPAE8_0YXMg/Az3Etfz7mP8J  

It sounds like a similar issue at the end.

Suraj

unread,
Jan 21, 2015, 12:14:40 PM1/21/15
to ansible...@googlegroups.com
I think with this I am still setting every configuration related to one service in single var file so this way I am maintaining state of the service at one place and every common thing for all the services will be written in single playbook.

Suraj

unread,
Jan 29, 2015, 4:18:40 AM1/29/15
to ansible...@googlegroups.com
Can somebody please help me on this one??

Chip Selden

unread,
Feb 4, 2015, 7:38:01 PM2/4/15
to ansible...@googlegroups.com
Suraj,

I've been trying to find a way to do this as well, with no luck so far.

Ideally, I'd be able to use a loop (either with_items, or with_dict) to run multiple and differing roles on a per-host basis. But, alas, this is not a feature and from what I can find from older posts, will not be a feature. Passing in a list variable to "roles:" is a good idea, but it doesn't seem like Ansible can use variables (even extra-vars from the ansible-playbook command) to determine which roles are to be used.

I realize that this may not be considered "best practice", but looping through roles and/or include statements would be a MUCH welcome feature.

Chip

Giovanni Tirloni

unread,
Feb 5, 2015, 5:31:49 AM2/5/15
to ansible...@googlegroups.com
On Wed, 04 Feb 2015 16:38 -0800, Chip Selden <chips...@gmail.com>
wrote:
> Suraj,
>
> I've been trying to find a way to do this as well, with no luck so far.
>
> Ideally, I'd be able to use a loop (either with_items, or with_dict) to
> run
> multiple and differing roles on a per-host basis. But, alas, this is not
> a
> feature and from what I can find from older posts, will not be a feature.
> Passing in a list variable to "roles:" is a good idea, but it doesn't
> seem
> like Ansible can use variables (even extra-vars from the ansible-playbook
> command) to determine which roles are to be used.

If I understand it, there is a need to run a playbook and it would apply
a different set of roles to different set of roles, right?

My suggestion is to define many plays per playbook. You'd not be
defining a "roles" variable to be imported and, sure, there is more
typing involved but it's clean and works:


---
- name: Provision web layer
hosts: webservers
sudo: yes
roles:
- common
- nginx

- name: Provision db layer
hosts: dbservers
sudo: yes
roles:
- common
- mariadb


The reason defining a list somewhere else (say, group_vars/webservers)
does not work is because it's becomes a dictionary ("web_roles -> {
roleA, roleB }") and the "roles" parameter in a play expects a list.

Just so I understand this better, would there be any issue with defining
multi-play playbooks? What's exactly the use case in your scenario?
People with access to change only vars files or perhaps the need to feed
the role list dynamically? What are you trying to achieve? :)

Giovanni

Chip Selden

unread,
Feb 5, 2015, 10:56:55 AM2/5/15
to ansible...@googlegroups.com
Giovanni, 

Thanks for joining in. 

Having multiple plays in a playbook is obviously the easiest solution. Especially when there's only a handful of combinations/groups. However, what happens when you have 20 or 30 different combinations? And what happens when the combinations of roles for a group frequently change? It becomes very cumbersome to maintain the playbook and edit it on a per-run basis. 

Dynamic inventory allows for this sort of flexibility with assigning variables to groups and/or hosts that define which roles are applicable. It's difficult to account for these playbooks on the playbook side without looping through roles. I'd like to do something like this:
---
- name: Apply roles to hosts
  hosts: all
  roles:
    - { role: “{{item.value.rolename}}”, somevar: “{{item.value.someval}}”, with_dict: host_roles }

Where each host has its own hostvars with something like what is shown below:
---
host_roles:
  foo:
    rolename: foo
    someval: 123
  bar:
    rolename: bar
    someval: 456

Thanks
Chip
Reply all
Reply to author
Forward
0 new messages