-
-
Save halberom/9bfe009c9a3df5d64c7bb505a7700430 to your computer and use it in GitHub Desktop.
--- | |
- hosts: localhost | |
connection: local | |
gather_facts: False | |
vars: | |
mylist: | |
- group_1 | |
- group_2 | |
tasks: | |
- debug: | |
msg: "{{ mylist | map('regex_replace', '(.*)', '\\1_foo') | list }}" |
PLAY [localhost] ********************************************************************************************************************** | |
TASK [debug] ************************************************************************************************************************** | |
ok: [localhost] => { | |
"changed": false, | |
"msg": [ | |
"group_1_foo", | |
"group_2_foo" | |
] | |
} | |
PLAY RECAP **************************************************************************************************************************** | |
localhost : ok=1 changed=0 unreachable=0 failed=0 |
The \ doesn't appear to make a difference. I tried '\', but that didn't happen.
Another approach should be:
- debug: msg="YYY {{ groups['all'] | map('regex_replace', '(.*)', "hostvars[\1].ansible_ssh_host") | list }}"
which correctly outputs:
ok: [neptune] => {
"changed": false,
"msg": "YYY [u'hostvars[unifi-controller-office].ansible_ssh_host', u'hostvars[neptune].ansible_ssh_host']"
}
So the question is, how do we evaluate those strings to get them replaced by the variable values.
this is a method for modifying all items in a list, it's not suitable for pulling out elements from a nested structure.
As pointed out in chan,
{{ groups['all'] | map('extract', hostvars, 'ansible_ssh_host' }}
is the way to do that
if you need to both add a prefix and a suffix, as well as making everything a list, take a look at the below:
set_fact:
extended_etcd_endpoints_list: "{{ groups['etcd'] | map('extract', hostvars, ['ansible_default_ipv4','address']) | map('regex_replace', '^(.*)$','https://\\1:2379') | list }}"
it takes the list of all machines in the group etcd, extracts the ipv4, adds an 'https://' in front and an ':2379' at the end.
Finally, everything is transformed in a list.
Indeed, I got strange results if the regex was not achored at the beginning: "^..."
Other than that, thanks for this useful pattern.
Looks good. I was hoping that this might work:
but I get an error: