|
|
|
- name: test with_subelements
|
|
|
|
set_fact: "{{ '_'+ item.0.id + item.1 }}={{ item.1 }}"
|
|
|
|
with_subelements:
|
|
|
|
- "{{element_data}}"
|
|
|
|
- the_list
|
|
|
|
|
|
|
|
- name: verify with_subelements results
|
|
|
|
assert:
|
|
|
|
that:
|
|
|
|
- "_xf == 'f'"
|
|
|
|
- "_xd == 'd'"
|
|
|
|
- "_ye == 'e'"
|
|
|
|
- "_yf == 'f'"
|
|
|
|
|
|
|
|
- name: test with_subelements in subkeys
|
|
|
|
set_fact: "{{ '_'+ item.0.id + item.1 }}={{ item.1 }}"
|
|
|
|
with_subelements:
|
|
|
|
- "{{element_data}}"
|
|
|
|
- the.sub.key.list
|
|
|
|
|
|
|
|
- name: verify with_subelements in subkeys results
|
|
|
|
assert:
|
|
|
|
that:
|
|
|
|
- "_xq == 'q'"
|
|
|
|
- "_xr == 'r'"
|
|
|
|
- "_yi == 'i'"
|
|
|
|
- "_yo == 'o'"
|
|
|
|
|
|
|
|
- name: test with_subelements with missing key or subkey
|
|
|
|
set_fact: "{{ '_'+ item.0.id + item.1 }}={{ item.1 }}"
|
|
|
|
with_subelements:
|
|
|
|
- "{{element_data_missing}}"
|
|
|
|
- the.sub.key.list
|
|
|
|
- skip_missing: yes
|
|
|
|
register: _subelements_missing_subkeys
|
|
|
|
|
|
|
|
- debug: var=_subelements_missing_subkeys
|
|
|
|
- debug: var=_subelements_missing_subkeys.results|length
|
|
|
|
- name: verify with_subelements in subkeys results
|
|
|
|
assert:
|
|
|
|
that:
|
|
|
|
- _subelements_missing_subkeys is not skipped
|
|
|
|
- _subelements_missing_subkeys.results|length == 2
|
|
|
|
- "_xk == 'k'"
|
|
|
|
- "_xl == 'l'"
|
|
|
|
|
|
|
|
# Example from the DOCUMENTATION block
|
|
|
|
- set_fact:
|
|
|
|
users:
|
|
|
|
- name: alice
|
|
|
|
authorized:
|
|
|
|
- /tmp/alice/onekey.pub
|
|
|
|
- /tmp/alice/twokey.pub
|
|
|
|
mysql:
|
|
|
|
password: mysql-password
|
|
|
|
hosts:
|
|
|
|
- "%"
|
|
|
|
- "127.0.0.1"
|
|
|
|
- "::1"
|
|
|
|
- "localhost"
|
|
|
|
privs:
|
|
|
|
- "*.*:SELECT"
|
|
|
|
- "DB1.*:ALL"
|
|
|
|
groups:
|
|
|
|
- wheel
|
|
|
|
- name: bob
|
|
|
|
authorized:
|
|
|
|
- /tmp/bob/id_rsa.pub
|
|
|
|
mysql:
|
|
|
|
password: other-mysql-password
|
|
|
|
hosts:
|
|
|
|
- "db1"
|
|
|
|
privs:
|
|
|
|
- "*.*:SELECT"
|
|
|
|
- "DB2.*:ALL"
|
|
|
|
- name: carol
|
|
|
|
skipped: true
|
|
|
|
authorized:
|
|
|
|
- /tmp/carol/id_rsa.pub
|
|
|
|
mysql:
|
|
|
|
password: third-mysql-password
|
|
|
|
hosts:
|
|
|
|
- "db9"
|
|
|
|
privs:
|
|
|
|
- "*.*:SELECT"
|
|
|
|
- "DB9.*:ALL"
|
|
|
|
|
|
|
|
|
|
|
|
- name: Ensure it errors properly with non-dict
|
|
|
|
set_fact:
|
|
|
|
err: "{{ lookup('subelements', 9001, 'groups', wantlist=true) }}"
|
|
|
|
ignore_errors: true
|
|
|
|
register: err1
|
|
|
|
|
|
|
|
- assert:
|
|
|
|
that:
|
|
|
|
- err1 is failed
|
|
|
|
- "'expects a dictionary' in err1.msg"
|
|
|
|
|
|
|
|
- name: Ensure it errors properly when pointing to non-list
|
|
|
|
set_fact:
|
|
|
|
err: "{{ lookup('subelements', users, 'mysql.password', wantlist=true) }}"
|
|
|
|
ignore_errors: true
|
|
|
|
register: err2
|
|
|
|
|
|
|
|
- assert:
|
|
|
|
that:
|
|
|
|
- err2 is failed
|
|
|
|
- "'should point to a list' in err2.msg"
|
|
|
|
|
|
|
|
- name: Ensure it properly skips missing keys
|
|
|
|
set_fact:
|
|
|
|
err: "{{ lookup('subelements', users, 'mysql.hosts.doesnotexist', wantlist=true) }}"
|
|
|
|
ignore_errors: true
|
|
|
|
register: err3
|
|
|
|
|
|
|
|
- assert:
|
|
|
|
that:
|
|
|
|
- err3 is failed
|
|
|
|
- "'should point to a dictionary' in err3.msg"
|
|
|
|
|
|
|
|
- name: Ensure it properly skips missing keys
|
|
|
|
set_fact:
|
|
|
|
err: "{{ lookup('subelements', users, 'mysql.monkey', wantlist=true) }}"
|
|
|
|
ignore_errors: true
|
|
|
|
register: err4
|
|
|
|
|
|
|
|
- assert:
|
|
|
|
that:
|
|
|
|
- err4 is failed
|
|
|
|
- >-
|
|
|
|
"could not find 'monkey' key in iterated item" in err4.msg
|
|
|
|
|
|
|
|
- assert:
|
|
|
|
that:
|
|
|
|
- "'{{ item.0.name }}' != 'carol'"
|
|
|
|
with_subelements:
|
|
|
|
- "{{ users }}"
|
|
|
|
- mysql.privs
|
|
|
|
|
|
|
|
- name: Ensure it errors properly when optional arg is nonsensical
|
|
|
|
set_fact:
|
|
|
|
err: neverset
|
|
|
|
with_subelements:
|
|
|
|
- "{{ users }}"
|
|
|
|
- mysql.privs
|
|
|
|
- wolves
|
|
|
|
ignore_errors: true
|
|
|
|
register: err5
|
|
|
|
|
|
|
|
- assert:
|
|
|
|
that:
|
|
|
|
- err5 is failed
|
|
|
|
- "'the optional third item must be a dict' in err5.msg"
|
|
|
|
|
|
|
|
- name: Ensure it errors properly when given way too many args
|
|
|
|
set_fact:
|
|
|
|
err: neverset
|
|
|
|
with_subelements:
|
|
|
|
- "{{ users }}"
|
|
|
|
- mysql.privs
|
|
|
|
- wolves
|
|
|
|
- foo
|
|
|
|
- bar
|
|
|
|
- baz
|
|
|
|
- bye now
|
|
|
|
ignore_errors: true
|
|
|
|
register: err6
|
|
|
|
|
|
|
|
- assert:
|
|
|
|
that:
|
|
|
|
- err6 is failed
|
|
|
|
- "'expects a list of two or three' in err6.msg"
|
|
|
|
|
|
|
|
- name: Ensure it errors properly when second arg is invalid type
|
|
|
|
set_fact:
|
|
|
|
err: neverset
|
|
|
|
with_subelements:
|
|
|
|
- "{{ users }}"
|
|
|
|
- true
|
|
|
|
ignore_errors: true
|
|
|
|
register: err7
|
|
|
|
|
|
|
|
- assert:
|
|
|
|
that:
|
|
|
|
- err7 is failed
|
|
|
|
- "'second a string' in err7.msg"
|
|
|
|
|
|
|
|
- name: Ensure it errors properly when first arg is invalid type
|
|
|
|
set_fact:
|
|
|
|
err: neverset
|
|
|
|
with_subelements:
|
|
|
|
- true
|
|
|
|
- "{{ users }}"
|
|
|
|
ignore_errors: true
|
|
|
|
register: err8
|
|
|
|
|
|
|
|
- assert:
|
|
|
|
that:
|
|
|
|
- err8 is failed
|
|
|
|
- "'first a dict or a list' in err8.msg"
|
|
|
|
|
|
|
|
- set_fact:
|
|
|
|
empty_subelements: "{{ lookup('subelements', {'skipped': true}, 'mysql.hosts', wantlist=true) }}"
|
|
|
|
|
|
|
|
- assert:
|
|
|
|
that:
|
|
|
|
- empty_subelements == []
|
|
|
|
|
|
|
|
- set_fact:
|
|
|
|
some_dict:
|
|
|
|
key: "{{ users[0] }}"
|
|
|
|
another: "{{ users[1] }}"
|
|
|
|
|
|
|
|
- name: Ensure it works when we give a dict instead of a list
|
|
|
|
set_fact: "user_{{ item.0.name }}={{ item.1 }}"
|
|
|
|
with_subelements:
|
|
|
|
- "{{ some_dict }}"
|
|
|
|
- mysql.hosts
|
|
|
|
|
|
|
|
- assert:
|
|
|
|
that:
|
|
|
|
- "'{{ user_alice }}' == 'localhost'"
|
|
|
|
- "'{{ user_bob }}' == 'db1'"
|