Hi,

Apologies for not being clearer. The third example I posted as an example 
of a potentially nicer way of structuring playbooks/roles if Ansible had 
the ability to function in that way, i.e: by 'roles:' supporting lists or 
with_items.

> You also can't stick an "include" and "vars" together in the same item.

My mistake.

Thanks,

Rob



On Monday, 11 August 2014 10:02:22 UTC+1, Rob Zissou wrote:
>
> Hi All,
>
> I've been trying to work out the best layout for our playbooks and roles. 
> I've been attempting to conform to DRY principles but trying to leave 
> things as loosely coupled as possible.
>
> Our infrastructure involves many similar apps that have minor differences 
> which is why I've been looking specifically at how it might be possible to 
> parameterise playbooks/roles to avoid many very similar files.
>
> Initially I had something like this:
>
> ## apps described in 'meta roles' (roles with only meta/main.yml that 
> include other roles)
>
> # app1.yml
> roles:
>  - app1
>
> # app2.yml
> roles:
>  - app2
>
> # roles/app1/meta/main.yml
> dependencies:
>  - { role: pre_deploy_common_stuff }
>
>  - { role: deploy_app_1 }
>
>  - { role: deploy_other_stuff }
>
>  - { role: post_deploy_common_stuff }
>
> # roles/app2/meta/main.yml
> dependencies:
>  - { role: pre_deploy_common_stuff }
>
>  - { role: deploy_app_2 }
>
>  - { role: post_deploy_common_stuff }
>
> ## ---
>
> Then I tried moving the contents of 'meta/main.yml' for each app into 
> playbooks like this:
>
> ## apps described in playbooks
>
> # app1.yml
> - roles:
>  - { role: pre_deploy_common_stuff }
>
>  - { role: deploy_app_1 }
>
>  - { role: deploy_other_stuff }
>
>  - { role: post_deploy_common_stuff }
>
>
> # app2.yml
> - roles:
>  - { role: pre_deploy_common_stuff }
>
>  - { role: deploy_app_2 }
>
>  - { role: post_deploy_common_stuff }
>
> ## ---
>
> Then thinking in DRY terms, I tried this:
>
> ## templated playbook with parameterization
>
> # app1.yml
> - vars:
>     my_roles:
>       - { role: deploy_app_1 }
>       - { role: deploy_other_stuff }
>
>   include: foo.yml my_roles="{{ my_roles }}"
>
> # app2.yml
> - vars:
>     my_roles:
>       - { role: deploy_app_2 }
>
>   include: foo.yml my_roles="{{ my_roles }}"
>
> # foo.yml
> - roles:
>   - { role: pre_deploy_common_stuff }
>
> # this won't work because 'roles' expects a list but gets string 'my_roles'
> - roles: "{{ my_roles }}"
>
> # neither will this because with_items doesn't work in playbooks
> - roles: "{{ item }}"
>   with_items: my_roles # or "{{ my_roles }}"
>
> # 'role' is equivalent to including various main.yml files manually.
> # we still can't use with_items or pass a list as a single argument to 
> include so
> # using include: in place of role: wouldn't work either
>
> - roles:
>   - { role: post_deploy_common_stuff }
>
> # a possibility would be to test with_items in a meta/main.yml file but
> # at that point we're moving back towards 'meta role' territory..!
>
> ## --
>
> The last example doesn't work for reasons described in the comments. I had 
> a quick and nasty go at getting ansible 'roles:' to allow lists or 
> with_items but to no avail.
>
> I think the last pattern may work in a 'meta' style role (rather than 
> playbook) but I'm hesitant to introduce this concept of meta-roles when it 
> seems like that information should be stored in playbooks.
>
> I'd be interested to hear how other people approach this type of 
> configuration or whether I've made any mistakes in my understanding of how 
> to write playbooks/roles.
>
> Thanks!
>
> Rob
>

-- 
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 [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/b3f8ac1b-80e9-41f6-b34e-ca30c47bc3d9%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to