gpt4 book ai didi

linux - 基于匹配属性构建列表(ansible)

转载 作者:IT王子 更新时间:2023-10-29 01:03:40 24 4
gpt4 key购买 nike

尝试构建一个匹配属性(在本例中为 ec2_tag)的服务器列表,以安排特定服务器执行特定任务。

我正在尝试与 selectattr 匹配:

servers: "{{ hostvars[inventory_hostname]|selectattr('ec2_tag_Role', 'match', 'cassandra_db_seed_node') | map(attribute='inventory_hostname') |list}}"

虽然我从 Ansible 得到了一个类型错误:

fatal: [X.X.X.X]: FAILED! => {"failed": true, "msg": "Unexpected templating type error occurred on ({{ hostvars[inventory_hostname]|selectattr('ec2_tag_Role', 'match', 'cassandra_db_seed_node') | map(attribute='inventory_hostname') |list}}): expected string or buffer"}

我在这里错过了什么?

最佳答案

当您构建复杂的过滤器链时,使用debug 模块打印中间结果...并逐个添加过滤器以获得所需的结果。

在您的示例中,您在第一步就犯了错误:hostvars[inventory_hostname] 只是您当前主机的事实字典,因此无法从中选择元素。

您需要 hostvars 值的列表,因为 selectattr 应用于列表,而不是字典。

但是在 Ansible 中 hostvars 是一个特殊的变量,实际上并不是一个字典,所以你不能只调用 .values() 而不跳过一些步骤.

试试下面的代码:

- hosts: all
tasks:
- name: a kind of typecast for hostvars
set_fact:
hostvars_dict: "{{ hostvars }}"
- debug:
msg: "{{ hostvars_dict.values() | selectattr('ec2_tag_Role','match','cassandra_db_seed_node') | map(attribute='inventory_hostname') | list }}"

关于linux - 基于匹配属性构建列表(ansible),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41498341/

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