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
在 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