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

时间:2015-08-19 06:46:26

标签: 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 %}
{% 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: <template>, line number: 3, error: Encountered unknown tag 'do'. Jinja was looking for the following tags: 'endfor' or 'else'. The innermost block that needs to be closed is 'for'.", 'failed': True}失败。

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

1 个答案:

答案 0 :(得分:1)

试试这个:

{%- 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 }},
    ...
}