Project

Dictionary project

The project variable is a dictionary of jails. The vmm attribute stores the host on which the jail is running.

project:
  logserv_1:
    class: [logserv]
    vmm: iocage_01
  http_1:
    class: [http, logclient]
    vmm: iocage_02
  db_1:
    class: [db, logclient]
    vmm: iocage_02
  http_2:
    class: [http, logclient]
    vmm: iocage_04
  db_2:
    class: [db, logclient]
    vmm: iocage_04

Dictionary vmm

Declare vmm as a dictionary of hosts running the jails.

vmm_groups: "{{ dict(project | dict2items | groupby('value.vmm')) }}"
vmm: "{{ dict(vmm_groups.keys() | zip(vmm_groups.values() | map('items2dict'))) }}"

gives

vmm:
  iocage_01:
    logserv_1:
      class:
      - logserv
      vmm: iocage_01
  iocage_02:
    db_1:
      class:
      - db
      - logclient
      vmm: iocage_02
    http_1:
      class:
      - http
      - logclient
      vmm: iocage_02
  iocage_04:
    db_2:
      class:
      - db
      - logclient
      vmm: iocage_04
    http_2:
      class:
      - http
      - logclient
      vmm: iocage_04

Dictionary class

Declare class as a dictionary mapping classes to their members.

class_list: "{{ project | dict2items }}"
class_keys: "{{ class_list | map(attribute='value.class') | flatten | unique | sort }}"
class: |
  {% filter from_yaml %}
  {% for k in class_keys %}
  {{ k }}: {{ class_list | selectattr('value.class', 'contains', k) | map(attribute='key') }}
  {% endfor %}
  {% endfilter %}

gives

class:
  db:
  - db_1
  - db_2
  http:
  - http_1
  - http_2
  logclient:
  - http_1
  - db_1
  - http_2
  - db_2
  logserv:
  - logserv_1