On Sat, 16 Apr 2022 23:52:14 +1200
Richard Hector <[email protected]> wrote:

For example, given the tree

shell> tree inventory/
inventory/
├── group_vars
│   └── all
├── hosts
└── users
    ├── public_keys
    │   ├── alice@bar
    │   ├── alice@foo
    │   ├── richard@bar
    │   └── richard@foo
    └── user_vars
        ├── alice
        └── richard


and the files for testing

shell> cat inventory/users/user_vars/alice 
name: alice
gecos: 'Alice Beatrice,,,'
shell: '/bin/bash'
ssh_keys:
   - alice@foo
   - alice@bar
shell> cat inventory/users/user_vars/richard 
name: richard
gecos: 'Richard Hector,,,'
shell: '/bin/bash'
ssh_keys:
   - richard@foo
   - richard@bar
shell> cat inventory/users/public_keys/
alice@bar    alice@foo    richard@bar  richard@foo  
shell> cat inventory/users/public_keys/alice@bar 
ssh-rsa djflskdjflsdkjflsdjflkdjl alice@bar
shell> cat inventory/users/public_keys/alice@foo 
ssh-rsa djflskdjflsdkjflsdjflkdjl alice@foo
shell> cat inventory/users/public_keys/richard@bar 
ssh-rsa djflskdjflsdkjflsdjflkdjl richard@bar
shell> cat inventory/users/public_keys/richard@foo
ssh-rsa djflskdjflsdkjflsdjflkdjl richard@foo


* Create variables

  inventory_dir: inventory
  dyn_vars_list: [user_vars, public_keys]


* Get the names of the files

    - set_fact:
        keys: "{{ keys|d({})|
                  combine({item: files}) }}"
      loop: "{{ dyn_vars_list }}"
      vars:
        fileglob: "{{ inventory_dir }}/users/{{ item }}/*"
        files: "{{ query('fileglob', fileglob)|
                   map('basename')|list }}"

gives

  keys:
    public_keys:
    - richard@bar
    - alice@bar
    - alice@foo
    - richard@foo
    user_vars:
    - alice
    - richard


* Get the content of the files

    - set_fact:
        values: "{{ values|d([]) +
                    [{'var': item.0.key,
                      'key': item.1,
                      'value': value}] }}"
      with_subelements:
        - "{{ keys|dict2items }}"
        - value
      vars:
        path: "{{ inventory_dir }}/users/{{ item.0.key }}/{{ item.1 }}"
        value: "{{ lookup('file', path)|from_yaml }}"

gives

  values:
  - key: alice
    value:
      gecos: Alice Beatrice,,,
      name: alice
      shell: /bin/bash
      ssh_keys:
      - alice@foo
      - alice@bar
    var: user_vars
  - key: richard
    value:
      gecos: Richard Hector,,,
      name: richard
      shell: /bin/bash
      ssh_keys:
      - richard@foo
      - richard@bar
    var: user_vars
  - key: richard@bar
    value: ssh-rsa dkjfslkdjflskdjflsdkjflsdjflkdjl richard@bar
    var: public_keys
  - key: alice@bar
    value: ssh-rsa dkjfslkdjflskdjflsdkjflsdjflkdjl alice@bar
    var: public_keys
  - key: alice@foo
    value: ssh-rsa dkjfslkdjflskdjflsdkjflsdjflkdjl alice@foo
    var: public_keys
  - key: richard@foo
    value: ssh-rsa dkjfslkdjflskdjflsdkjflsdjflkdjl richard@foo
    var: public_keys


* Group the values by 'var' and create the dictionary

    - set_fact:
        dyn_vars: "{{ dyn_vars|d({})|
                      combine({item.0: item.1|
                               items2dict(key_name='key',
                                          value_name='value')}) }}"
      loop: "{{ values|groupby('var') }}"

gives

  dyn_vars:
    public_keys:
      alice@bar: ssh-rsa djflskdjflsdkjflsdjflkdjl alice@bar
      alice@foo: ssh-rsa djflskdjflsdkjflsdjflkdjl alice@foo
      richard@bar: ssh-rsa djflskdjflsdkjflsdjflkdjl richard@bar
      richard@foo: ssh-rsa djflskdjflsdkjflsdjflkdjl richard@foo
    user_vars:
      alice:
        gecos: Alice Beatrice,,,
        name: alice
        shell: /bin/bash
        ssh_keys:
        - alice@foo
        - alice@bar
      richard:
        gecos: Richard Hector,,,
        name: richard
        shell: /bin/bash
        ssh_keys:
        - richard@foo
        - richard@bar

The usage of the dictionary should be trivial.

-- 
Vladimir Botka

-- 
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/20220416213138.6a59d05a%40gmail.com.

Attachment: pgpBu8yrbils0.pgp
Description: OpenPGP digital signature

Reply via email to