Ansible/Jinja2如何将列表格式化为配置文件的字段?

Ansible/Jinja2如何将列表格式化为配置文件的字段?,ansible,jinja2,ansible-template,Ansible,Jinja2,Ansible Template,我有以下内容,请记住,我不知道这个传入变量中会有多少IP,但为了简单起见,我从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中,我使用什么语法使主机IP看起来像上面的目标行?我知道我一定要迭代 -targets: [{% for ip in host_ips %}'{

我有以下内容,请记住,我不知道这个传入变量中会有多少IP,但为了简单起见,我从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中,我使用什么语法使主机IP看起来像上面的目标行?我知道我一定要迭代

-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"
    ]
}
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环路斗争。您只需对列表元素应用转换,例如使用和过滤器:

通过上述构造,您可以:

使用它在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']

没有必要在这里与Jinja2环路斗争。您只需对列表元素应用转换,例如使用和过滤器:

通过上述构造,您可以:

使用它在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']

-目标:[{%for-ip-in-host_-ips%}{{ip}:5051'{%endfor%}]让我更接近输出是:-目标:['10.0.0.100:909010.0.0.200:9090']我只需要在它们之间加个逗号,所以我需要弄清楚-目标:[{%for-ip-in-host_-ips%}{ip}:5051'{%endfor%}]让我更接近输出是:-目标:['10.0.0.100:909010.0.0.200:9090']我只需要它们之间的逗号,所以我需要弄清楚