Hi everybody,
I've been on IRC with a bunch of questions related to the same problem, and
haven't found a good answer yet so I thought I'd post here. It's hard to
explain the full picture in detail on IRC.
*Background*
I am using Ansible 1.9.
I am using a role that reads a host_vars file with a somewhat complex data
structure. It looks something like this (the values are meaningless). There
are only 3 tenants listed here, but the real-world counterpart would be
closer to hundreds:
db:
Tenant1:
name: Tenant1
key_a: hello
key_b:
- { subkey_a: 1, subkey_b: 2, subkey_c: 3 }
- { subkey_a: 1, subkey_b: 5, subkey_c: 6 }
Tenant2:
name: Tenant2
key_a: world
key_b:
- { subkey_a: 7, subkey_b: 8, subkey_c: 9 }
- { subkey_a: 10, subkey_b: 11, subkey_c: 12 }
Tenant3:
name: Tenant3
key_a: bye
key_b:
- { subkey_a: these, subkey_b: values, subkey_c: do }
- { subkey_a: not, subkey_b: matter, subkey_c: thanks }
The old way of doing things was that the user would supply an extra
variable 'tenant_id' as a string (e.g. 'Tenant1' or 'Tenant2').
The role would be invoked like:
roles:
tenant_role
and the role would execute tasks like:
- set_fact:
tenant: "{{ db[tenant_id] }}"
- name: Tenant Setup
tenant_setup :
tenant_name: "{{ tenant.name }}"
tenant_value_a: "{{ tenant.key_a }}"
tenant_subvalue_a: "{{ item.subkey_a }}"
tenant_subvalue_b: "{{ item.subkey_b }}"
tenant_subvalue_c: "{{ item.subkey_c }}"
with_items: tenant.key_b
Everything worked fine this way.
*New Requirements*
The new requirements is that this role be adapted to instead take in a list
of tenants instead of a string, and that the parameters for the tasks in
the roles be populated with corresponding data. Under the new requirements,
a user would supply an extra variable 'tenant_list' that might look like
['Tenant1', 'Tenant3'] instead of a string as before.
The perfect fix would be to simply invoke the role using with_items, like:
roles:
- { role: tenant_role, tenant_id: item, with_items: tenant_list }
However, I am on Ansbile 1.9 and 2.0 isn't a possibility here. So the role
must, within itself, deal with the list.
*Request for Help*
I understand there are many things on the surface that look like they might
solve this, like with_nested, with_dict, or with_subelement. But I can't
seem to work them into the form needed to solve this specific problem. If
you think you have an answer to this problem, please post an example of how
the 'Tenant Setup' task would look under these new requirements, and what
would replace the set_fact task above.
*Related Questions*
I am convinced I can work around this myself if I can do any of the
following, so if you have answers on these please also let me know:
- Append an element to an existing list in a playbook
- Add a key/value pair to an existing hash in a playbook
Thanks so much for any help. I really appreciate it,
Michael
--
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/e6c656b0-7e13-49fc-84a1-bc1004f2815f%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.