gpt4 book ai didi

ansible - 如何处理 Ansible 循环中的空列表

转载 作者:行者123 更新时间:2023-12-04 08:20:44 28 4
gpt4 key购买 nike

上下文正在修改不同服务器上的许多 DNS 区域记录,循环使用 community.windows.win_dns_record。每个 DNS 服务器在 host_vars 中都有一个 var 文件。记录更改列表的变量是 zone_records

有时服务器上没有任何变化,我想保留 zone_records 变量未定义,但我愿意将其设置为空列表或空字符串。

此处尝试通过 when: zone_records is iterable

来缩短循环
- name: Remove zone records
community.windows.win_dns_record:
computer_name: "{{ remove.server_name }}"
zone: "{{ remove.zone }}"
name: "{{ remove.name }}"
state: "{{ remove.state }}"
type: "{{ remove.type }}"
loop:
"{{ query('dict', zone_records) }}"
when:
- zone_records is iterable
- remove.state == 'absent'
loop_control:
loop_var: remove

根据 zone_records 是未定义的,还是字符串而不是列表,上面的失败有所不同。
在后一种情况下,错误是:

Invalid data passed to 'loop', it requires a list

在有时没有列表或空列表的循环中,应如何处理列表?

最佳答案

之所以会发生这种情况,是因为循环将在条件被考虑之前就被处理。

还因为字符串在 Python 中是可迭代的,因为简单地说,它是一个字符列表。

iterable
An object capable of returning its members one at a time. Examples of iterables include all sequence types (such as list, str, and tuple) and some non-sequence types like dict, file objects, and objects of any classes you define with an __iter__() method or with a __getitem__() method that implements Sequence semantics.

来源:https://docs.python.org/3/glossary.html#term-iterable

您可以使用 conditional expression 解决此问题在循环定义本身中:

- hosts: all
gather_facts: no

tasks:
- debug:
msg: "{{ item }}"
loop: "{{ foo if foo is iterable and foo is not string else [] }}"
vars:
foo: 'bar'

将以跳过主机结束(因为在条件表达式的 else 中传递了一个空列表):

PLAY [all] *******************************************************************************************************

TASK [debug] *****************************************************************************************************

PLAY RECAP *******************************************************************************************************
localhost : ok=0 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0

同时:

- hosts: all
gather_facts: no

tasks:
- debug:
msg: "{{ item }}"
loop: "{{ foo if foo is iterable and foo is not string else [] }}"
vars:
foo:
- 'bar'
- 'baz'

将以预期的方式结束:

PLAY [all] *******************************************************************************************************

TASK [debug] *****************************************************************************************************
ok: [localhost] => (item=bar) => {
"msg": "bar"
}
ok: [localhost] => (item=baz) => {
"msg": "baz"
}

PLAY RECAP *******************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

关于ansible - 如何处理 Ansible 循环中的空列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65507537/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com