Ansible-如何动态创建列表变量?

时间:2018-11-27 19:12:19

标签: ansible

我有一个像这样的模板:

listen {{haproxy_app_name}} 0.0.0.0:514
  mode {{haproxy_mode}}
  balance {{haproxy_algorithm}}
  option httpclose
  option forwardfor
  {% for server in haproxy_backend_servers %}
  server {{server.name}} {{server.ip}}:{{server.port}} {{server.paramstring}}
  {% endfor %}    

我正在尝试用引用字典清单中主机列表的字典列表填充haproxy_backend_servers,但是在语法上苦苦挣扎。我不确定这是否是由于对Jinja,Ansible或YAML缺乏了解。

我没有动态清单,我所拥有的主机数量超出了我手动对其进行重复操作的范围。

- hosts: balancer
  vars:
    haproxy_app_name: balancer
    haproxy_mode: tcp
    haproxy_algorithm: roundrobin
    haproxy_backend_servers:
    - name: listener
      ip: "{{ item }}"
      port: 514
      paramstring: cookie A check
    with_items: "{{ groups.listener }}"

每次我尝试运行它时,都会失败并显示FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'item' is undefined"}。 (with_items的缩进似乎并没有影响该错误;它的粘贴方式只是我中断的地方。)

在这种情况下可以这样做吗?有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

我注意到模板可以访问所有变量,而不仅仅是在任务中声明的变量,因此我修改了模板:

{% for server in groups.listener %}
server listener {{server}}:514 cookie A check
{% endfor %}

尽管还是可以通过var做到这一点,但仍然感到好奇。

答案 1 :(得分:0)

您可以创建模板变量,并在pre_tasks中使用set_fact。

示例:
在此示例中,我想用清单(backend_db节点)填充pgpool2_backends列表变量。 为此,我创建了一个模板变量(pgpool2_backend_template),然后使用set_fact和pre_tasks中的项目填充pgpool2_backends。

Window {
    Image { 
        id: needle
        property real angle
        source: "needle.png"
        transformOrigin: Item.Bottom
        rotation: needle.angle
    }


    onFrameSwapped: {
        needle.angle = new_angle_from_usb;
        update();
    }
}