我有以下内容,请记住,我不知道这个传入变量中有多少 ips,但为了简单起见,我从 2 开始。
vars:
host_ips: ['10.0.0.100', '10.0.0.200']
我正在尝试使用带有 Ansible 的模板将它们格式化为文件。
- targets: ['10.0.0.100:9090', '10.0.0.200:9090']
我使用 Jinja2 中的什么语法使主机 ips 看起来像上面的目标行?我知道我必须肯定地迭代。
我有以下内容,请记住,我不知道这个传入变量中有多少 ips,但为了简单起见,我从 2 开始。
vars:
host_ips: ['10.0.0.100', '10.0.0.200']
我正在尝试使用带有 Ansible 的模板将它们格式化为文件。
- targets: ['10.0.0.100:9090', '10.0.0.200:9090']
我使用 Jinja2 中的什么语法使主机 ips 看起来像上面的目标行?我知道我必须肯定地迭代。
-targets: [{% for ip in host_ips %}'{{ ip }}:5051'{{ "," if not loop.last else "" }} {% endfor %}]
-targets: [{% for ip in host_ips %}'{{ ip }}:5051',{% endfor %}]
test.yml 剧本:
vars:
host_ips: ['10.0.0.100', '10.0.0.200','10.0.0.300']
tasks:
- debug: msg=[{% for ip in host_ips %}'{{ ip }}:5051',{% endfor %}]
ansible-playbook -i localhost test.yml
TASK [debug] *******************************************************************************************
ok: [localhost] => {
"msg": [
"10.0.0.100:5051",
"10.0.0.200:5051",
"10.0.0.300:5051"
]
}
没有必要在这里与 Jinja2 循环作斗争。您只需要对列表元素应用转换(例如使用map
和regex_replace
过滤器):
host_ips | map('regex_replace', '(.*)', '\\1:9090')
使用上述构造,您可以:
使用它在 Ansible 中设置一个新变量:
- set_fact:
targets: "{{ host_ips | map('regex_replace', '(.*)', '\\1:9090') | list }}"
或“使用模板将它们格式化为文件”,根据您的请求,它是列表的 JSON 表示:
在输出中使用双引号:
- targets: {{ host_ips | map('regex_replace', '(.*)', '\\1:9090') | list | to_json }}
产生:
- targets: ["10.0.0.100:9090", "10.0.0.200:9090"]
如果您真的需要输出中的单引号,只需替换它们:
- targets: {{ host_ips | map('regex_replace', '(.*)', '\\1:9090') | list | to_json | regex_replace('"', '\'') }}
产生:
- targets: ['10.0.0.100:9090', '10.0.0.200:9090']