无法将查找ess类主机的Ansible代码适配到Playbook的技术求助
解决Ansible中从hostinfo字典提取指定hostclass主机名的问题
嘿,我来帮你搞定这个Ansible的小麻烦!首先咱们先确认下你的hostinfo变量结构——它应该是类似这样的字典格式对吧?这是后续过滤器生效的关键:
hostinfo: host001: hostclass: puppet host002: hostclass: ess host003: hostclass: mdb
你手里的那段debug表达式逻辑其实是对的,大概率是在Playbook里的使用场景或者变量导入环节出了问题。我给你写一个完整的可直接运行的Playbook示例,你可以直接参考适配:
--- - name: 提取hostclass为'ess'的主机名 hosts: localhost vars: # 这里模拟你的hostinfo变量,替换成你实际的变量来源(比如从文件加载、事实变量等) hostinfo: host001: hostclass: puppet host002: hostclass: ess host003: hostclass: mdb tasks: - name: 获取目标主机名 debug: msg: "{{ hostinfo | dictsort | selectattr('1.hostclass', 'equalto', 'ess') | first | first }}"
给你拆解下这段过滤器的逻辑,方便你理解和调整:
dictsort:把hostinfo字典转换成键值对列表,格式变成[['host001', {...}], ['host002', {...}], ...]selectattr('1.hostclass', 'equalto', 'ess'):筛选出列表中第二个元素(主机属性字典)里hostclass等于'ess'的项- 第一个
first:取筛选结果的第一个匹配项(假设只有一台符合条件的主机,如果有多台,你可以用map(attribute='0')提取所有主机名) - 第二个
first:从匹配的键值对里取出第一个元素,也就是咱们要的主机名
额外提示:处理无匹配项的情况
要是担心没有hostclass为'ess'的主机导致Playbook报错,可以加个默认值兜底:
msg: "{{ (hostinfo | dictsort | selectattr('1.hostclass', 'equalto', 'ess') | first | default(['无匹配主机'])) | first }}"
这样当没有匹配结果时,会输出无匹配主机而不是抛出错误。
另外,如果你的hostinfo是从外部YAML文件加载的,记得用vars_files或者include_vars导入变量,比如:
vars_files: - ./你的日志文件路径.yml
内容的提问来源于stack exchange,提问作者Bisshwajit Samanta
相关产品推荐
相关产品推荐

