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.
pgpBu8yrbils0.pgp
Description: OpenPGP digital signature
