I would create one vars file per customer and use a variable that sources 
the customer's vars file at run time. You also could have a folder per 
customer that holds all customer specific items.

% ansible-playbook -e customer_name='customer_A'

In the playbook source customer_A's vars file.

vars:
  server_groups: "{{ lookup('files', 'path/to/vars/' + {{ customer_name }} 
+ '.yml') | from_yaml }}"

OR

vars:
  server_groups: "{{ lookup('files', 'path/to/vars/' + {{ customer_name }} 
+ '/server_groups.yml') | from_yaml }}"

This loads your customer-specific YAML file as a dictionary into 
server_groups. It gives you enormous flexibility to add/remove customers 
over time without changing your playbook.

---
- name: read yaml vars into dictionary
  hosts: localhost
  become: no
  gather_facts: no
  vars:
    server_groups: "{{ lookup('file','./' + customer_name + '.yml') | 
from_yaml }}"
  tasks:
    - debug: var=server_groups

Then use filters to massage the dictionary ...

+++
---
- name: read yaml vars into dictionary
  hosts: localhost
  become: no
  gather_facts: no
  vars:
    server_groups: "{{ lookup('file','./' + customer_name + '.yml') | 
from_yaml }}"
    server_order: []
  tasks:
    # build parallel lists of name, down_group, up_group
    - set_fact:
        name_list: "{{ server_groups.keys() | list }}"
        halt_list: "{{ server_groups | dict2items | map(attribute='value') 
| map(attribute='down_group') }}"
        boot_list: "{{ server_groups | dict2items | map(attribute='value') 
| map(attribute='up_group') }}"

    # merge parallel lists into JSON list with server, down_group, up_group
    - set_fact:
        server_order: "{{ server_order + [ { 'name': item.0, 'halt': 
item.1, 'boot': item.2 } ] }}"
      with_together:
        - "{{ name_list }}"
        - "{{ halt_list }}"
        - "{{ boot_list }}"

    - debug: var=server_order
+++

... and you get a simple JSON list with server name, down_group, up_group 
... I bet others know slicker ways get to this in a single task of filter 
transformations ...

+++
% ansible-playbook foo.yml -e customer_name=customer
PLAY [read yaml vars into dictionary] 
**********************************************************************************

TASK [set_fact] 
********************************************************************************************************
ok: [localhost]

TASK [set_fact] 
********************************************************************************************************
ok: [localhost] => (item=['database_server_01', 3, 1])
ok: [localhost] => (item=['database_server_02', 3, 2])
ok: [localhost] => (item=['file_server_01', 2, 3])
ok: [localhost] => (item=['print_server_01', 1, 2])

TASK [debug] 
***********************************************************************************************************
ok: [localhost] => {
    "server_order": [
        {
            "boot": 1,
            "halt": 3,
            "name": "database_server_01"
        },
        {
            "boot": 2,
            "halt": 3,
            "name": "database_server_02"
        },
        {
            "boot": 3,
            "halt": 2,
            "name": "file_server_01"
        },
        {
            "boot": 2,
            "halt": 1,
            "name": "print_server_01"
        }
    ]
}

PLAY RECAP 
*************************************************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0 
   skipped=0    rescued=0    ignored=0   
+++

Hopefully from here you can craft the rest.
--
Walter Rowe, Chief
Infrastructure Services
Office of Information Systems Management
National Institute of Standards and Technology
United States Department of Commerce

-- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/4285d641-578f-40c0-a941-959a73a1307cn%40googlegroups.com.

Reply via email to