Ansible创建字符串而不是列表



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

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

然后我有一个任务/main.yml,它是:

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

运行剧本时得到的输出失败,返回
ansible_loop_var:item项目:'-host5-host6'msg:'无法连接到主机。。。。

所以Ansible正在处理";var_list";作为所有值串在一起的字符串(包括连字符(,而不是根据需要作为列表。我曾尝试在开头和结尾{%-%}中添加和删除连字符,并尝试在单行上使用[host1,host2]的替代方法,但它再次没有变成列表。我在这里错过了什么?

您已经要求Jinja创建一个字符串" ... - host1 ... "。您使用的声明

- 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

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

- 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

最新更新