当我使用此命令和额外变量执行 ansible playbook 时
ansible-playbook controller_config/windows_domain_names.yml -e "target_win_host=testserver.testdomain.com"
其中包含一项任务
- name: Find if the variable target_win_host is a list
debug:
msg: "{{ item }} is list data type"
loop: "{{ target_win_host}}"
when: target_win_host | type_debug == 'list'
我得到的错误是
“传递到“循环”的数据无效,它需要一个列表,改为:testserver.testdomain.com。提示:如果您传递了仅包含一个元素的列表/字典,请尝试将wantlist=True添加到您的查找调用中或使用q/查询而不是查找。”
我希望应该跳过上面的块,因为这不满足变量是列表并且它是标量的条件。(字符串)
我尝试了以下不同的条件
- name: Find if the variable target_win_host is a list
debug:
msg: "{{ item }} is list data type"
loop: "{{ target_win_host}}"
when: target_win_host is not string and target_win_host is iterable and target_win_host is sequence
但与上面相同的错误
对于
type_debug
,为了将结果与字符串进行比较,您需要额外的括号 ()
。
一个最小的示例手册
---
- hosts: localhost
become: false
gather_facts: false
vars:
targets:
- test.example.com
tasks:
- debug:
msg: "{{ targets | type_debug }}"
- debug:
msg: "is list"
when: (targets | type_debug) == 'list'
将导致预期的行为。
TASK [debug] *****
ok: [localhost] =>
msg: list
TASK [debug] *****
ok: [localhost] =>
msg: is list