簡體   English   中英

Ansible - 如何動態創建列表變量?

[英]Ansible - How to dynamically create a list variable?

我有一個這樣的模板:

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"} FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'item' is undefined"} with_items的縮進似乎不會影響錯誤;它的粘貼方式只是我離開的地方。)

在這種情況下可以這樣做嗎? 有沒有更好的辦法?

我注意到模板可以訪問所有變量,而不僅僅是任務中聲明的變量,所以我修改了模板:

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

仍然很好奇這是否可以通過 vars 來完成。

您可以創建一個模板變量並在 pre_tasks 中使用 set_fact。

例子:
在這個例子中,我想用我的庫存(backend_db 節點)填充 pgpool2_backends 列表變量。
為此,我創建了一個模板變量 (pgpool2_backend_template),並使用 set_fact 和 pre_tasks 中的項目填充 pgpool2_backends。

---
- name: Playbook test
  hosts:
    - test
  pre_tasks:
    - name: Populate pgpool2_backends list variable
      set_fact:
        pgpool2_backends: "{{ (pgpool2_backends | default([])) + [pgpool2_backend_template] }}"
      with_items: "{{ groups['backend_db'] }}"
    - debug:
        var: pgpool2_backends
  roles:
    - databases/pgpool2
  vars:
    pgpool2_backend_template:
      host: "{{ item }}"
      port: 5432
  tags: test

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM