gpt4 book ai didi

python - Ansible - 如何在不同键的 yaml 中使用 selectattr

转载 作者:行者123 更新时间:2023-12-04 14:45:47 24 4
gpt4 key购买 nike

我想通过解析 yaml 并过滤 Ansible 中的某些键来做一件简单的事情(我认为这应该很容易)。

我的 yaml 文件如下所示:

---

- vm: "vm1"
ip: 10.10.10.1
- vm: "vm2"
ip: 10.10.10.2
- test_vm: something
- another_vm: something_other

所以我想不是像这样的表达
lookup('file','my_file.yaml') | from_yaml | selectattr('vm','search','vm1')|list

会工作,但它会出现类似的错误
fatal: [localhost]: FAILED! => {"msg": "Unexpected templating type error occurred on ({{ lookup('file','{{sysfile}}') | from_yaml | selectattr('vm','search','vm1')|list}}): expected string or bytes-like object"}

如果我删除 test_vm 和 another_vm 键,它工作正常。
ok: [localhost] => {
"msg": [
{
"ip": "10.10.10.1",
"vm": "vm1"
}
]
}


如果我尝试搜索 test_vm 键,它会失败:
fatal: [localhost]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'test_vm'\n\nThe error appears to be ...

selectattr 过滤器是否期望列表中的所有字典都具有相同的键?因为不能使用 Jinja2 过滤自定义字典列表没有任何意义。

例如,如果我有一个更复杂的 yaml(不是那么简单),我是否只能在 Ansible 中进行搜索和过滤?

例如,如果我有一个 yaml 看起来像这样:
---

- vm: "vm1"
ip: 10.10.10.1
- vm: "vm2"
ip: 10.10.10.2
- test_vm: something
- process_1: X
- process_2: Y
- process_3: Z
- another_vm: something_other

例如,我如何快速过滤 process_2?
有办法吗?

非常感谢。

最佳答案

More precisely, it is expecting all dicts in the list to have the attribute you are selecting on.


对于所有过滤器功能来说,并非 100% 正确,通过并非由所有元素定义的属性来选择对象:
{{ test_var | selectattr('vm','defined') |selectattr('vm','equalto','vm1') | list }} 

关于python - Ansible - 如何在不同键的 yaml 中使用 selectattr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57858362/

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