1

我有以下内容,请记住,我不知道这个传入变量中有多少 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 看起来像上面的目标行?我知道我必须肯定地迭代。

4

3 回答 3

8
-targets: [{% for ip in host_ips %}'{{ ip }}:5051'{{ "," if not loop.last else "" }} {% endfor %}]
于 2017-12-14T19:05:26.797 回答
1
-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"
    ]
}
于 2017-12-14T19:02:29.213 回答
0

没有必要在这里与 Jinja2 循环作斗争。您只需要对列表元素应用转换(例如使用mapregex_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']
    
于 2017-12-14T22:37:07.577 回答