Ansible 创建字符串而不是列表

Ansible creates string instead of list

在 vars/main.yml 文件中,我有以下内容:

var_list: "{% if somevar == 'someval' %}
    - host1
    - host2
    - host3
    - host4
  {% elif somevar == 'differentval' %}
    - host5
    - host6
  {% endif %}"

然后我有一个 tasks/main.yml :

- name: Do these things on specific hosts
command:
  cmd: "echo hello"
delegate_to: "{{ item }}"
with_items: "{{ var_list }}"

当我 运行 剧本因
失败时得到的输出 ansible_loop_var: 项目 项目:' - host5 - host6 ' msg: '连接主机失败....

因此 Ansible 将“var_list”视为所有值都串在一起(包括连字符)的字符串,而不是作为所需的列表。我已经尝试在开始和结束 {%- -%} 中添加和删除连字符,并且我尝试了在一行中使用 [host1,host2] 的替代方法,但它再次没有变成列表。我在这里错过了什么?

您问过Jinja to create a string " ... - host1 ... ". The statement您使用

- hosts: localhost
  vars:
    somevar: someval
    var_list: "{% if somevar == 'someval' %}
        - host1
        - host2
        - host3
        - host4
      {% elif somevar == 'differentval' %}
        - host5
        - host6
      {% endif %}"
    - debug:
        var: var_list
    - debug:
        msg: "{{ var_list|type_debug }}"

给予

  var_list: ' - host1 - host2 - host3 - host4 '

  msg: str

有很多关于如何获取列表的选项。例如,使用 literal 创建 YAML 列表结构

- hosts: localhost
  vars:
    somevar: someval
    var_list: |
      {% if somevar == 'someval' %}
      - host1
      - host2
      - host3
      - host4
      {% elif somevar == 'differentval' %}
      - host5
      - host6
      {% endif %}
  tasks:
    - debug:
        var: var_list
    - debug:
        msg: "{{ var_list|type_debug }}"

给予

  var_list: |-
    - host1
    - host2
    - host3
    - host4

  msg: str

并将字符串转换为列表,例如

    - debug:
        var: var_list|from_yaml
    - debug:
        msg: "{{ var_list|from_yaml|type_debug }}"

给予

  var_list|from_yaml:
  - host1
  - host2
  - host3
  - host4

  msg: list

获取列表的一个更简单的选项是使用 {{ ... }} expression,例如

- hosts: localhost
  vars:
    somevar: someval
    var_list: "{{ (somevar == 'someval')|ternary(l1, l2) }}"
    l1:
      - host1
      - host2
      - host3
      - host4
    l2:
      - host5
      - host6
  tasks:
    - debug:
        var: var_list
    - debug:
        msg: "{{ var_list|type_debug }}"

给予

  var_list:
  - host1
  - host2
  - host3
  - host4

  msg: list