How can I take a list of server names and append a resource URI and port to each?
Solution 1
Solution
set_fact:
fact2: "{{ fact1 | map('regex_replace', '(.*)', 'https://\\1:8000') | join(',') }}"
Explanation
map
filter applies a filter (regex_replace
) to individual elements of the list;-
regex_replace
filter (with the following regular expression) adds aprefix
andsuffix
to a string;current_list | map('regex_replace', '(.*)', 'prefix\\1suffix')
join
filter converts the list to comma-delimited string in the output.
Alternative
Another possible solution (builds on what you already know) would be to use Jinja2 to directly for the target string:
set_fact:
fact2: "{{ 'https://' + fact1|join(':8000,https://') + ':8000' }}"
Solution 2
Also you can use ternary filter:
set_fact:
fact2: "{% for it in fact1 %}https://{{ it }}:8000{{ loop.last | ternary('', ',') }}{% endfor %}"
Admin
Updated on June 12, 2022Comments
-
Admin almost 2 years
I merged two lists from an Ansible inventory:
set_fact: fact1: "{{ groups['group1'] + groups[group2']|list }}
The output is:
fact1: - server01 - server02 - server03
With the above results, I need to append
https://
to the front, and a port number to the back of each element. Then I need to convert it to a comma delimited list for a server config.In this example I want:
https://server01:8000,https://server02:8000,https://server03:8000
.I tried using a join:
set_fact: fact2: "{{ fact1|join(':8000,') }}"
which partly worked but it left the last server without a port.
How can I achieve my goal?
-
Merwan over 4 yearsBeware that on some Python versions,
(.*)
will match the whole string and an empty string at the end, which means it will make two replacements: docs.ansible.com/ansible/latest/user_guide/…. We should use^(.*)$
instead.