Templates Ansible:在jinja模板中编写事实列表

Templates Ansible:在jinja模板中编写事实列表,templates,jinja2,ansible,Templates,Jinja2,Ansible,我正在使用Ansible 1.9.2设置群集服务,需要配置一个JSON配置文件,其中包含要加入的群集服务器列表 目前,我的工作如下。它产生正确的输出,如果不好的话 { ... "join": [ {% for host in groups['cluster'] %} "{{ hostvars[host]['ansible_default_ipv4']['address'] }}{% if not loop.last %}, {% endif %} {% endfo

我正在使用Ansible 1.9.2设置群集服务,需要配置一个JSON配置文件,其中包含要加入的群集服务器列表

目前,我的工作如下。它产生正确的输出,如果不好的话

{
    ...
    "join": [
{% for host in groups['cluster'] %}
        "{{ hostvars[host]['ansible_default_ipv4']['address'] }}{% if not loop.last %}, {% endif %}
{% endfor %}
],
    ...
}
Ansible是否可以创建一个特定主机事实的列表,Jinja是否可以动态地组成一个列表?我希望我能在模板中留下这样的东西:

{
    ...
    "join": {{ list_of_cluster_ips|to_nice_json }},
    ...
}
我在模板文件顶部尝试了一些Jinja魔术,以生成如下列表:

{% set list_of_cluster_ips = [] %}
{% for host in groups['cluster'] %}
    {% do list_of_cluster_ips.append(host) %}
{% endfor %}
{
    ...
    "join": {{ list_of_cluster_ips|to_nice_json }},
    ...
}
但是Ansible不支持Jinja的'do'功能,并因以下错误而失败:
fatal:[cluster-1]=>{'msg':“AnsibleError:file:,行号:3,错误:遇到未知标记'do'。Jinja正在查找以下标记:'endfor'或'else'。需要关闭的最里面的块是'for','failed':True}

Ansible是否有办法生成可在模板中使用的列表?

尝试以下方法:

{%- set list_of_cluster_ips = [] %}
{%- for host in groups['cluster'] %}
    {%- if list_of_cluster_ips.append(hostvars[host]['ansible_default_ipv4']['address']) %}
    {%- endif %}
{%- endfor %}
{
    ...
    "join": {{ list_of_cluster_ips|to_nice_json }},
    ...
}

您是否尝试过使用动态库存?我想负号应该换个位置<代码>{%if…-%}{%-endif%}对我来说非常有效。虽然很遗憾,
do
不受支持,但这看起来像是一种黑客行为。