在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