基于其他主机变量构建Ansible模板的逻辑实现方案咨询
实现方案说明
这个逻辑直接在模板阶段实现即可,而且是最简洁的方式——因为你需要跨主机匹配变量,Ansible默认会加载inventory里所有主机的host_vars,在模板中可以通过全局变量hostvars直接访问其他主机的变量,不需要额外提前共享事实的步骤。
具体模板代码示例
# for {{ inventory_hostname }} {% for item in my.info %} {{ item.name }} {{ inventory_hostname }} {% for host in groups['all'] if host != inventory_hostname and item.name in (hostvars[host].my.info | default([]) | map(attribute='name') | list) %}{{ host }} {% endfor %} {% endfor %}
逻辑解释
- 外层循环遍历当前主机的
my.info列表,逐个处理每个name项 - 对每个
name,先输出名称和当前主机名 - 内层循环遍历inventory里的所有其他主机,判断该主机的
my.info中是否包含当前name,如果包含就输出该主机名 - 加
default([])是为了避免某些主机没有my.info变量时报错,保证模板健壮性
为什么不需要提前预处理
Ansible在运行playbook时,默认会加载所有inventory主机的变量到hostvars中,模板可以直接调用这些数据。把逻辑写在模板里,不需要额外的playbook任务来收集或整理数据,配置更简洁,逻辑也更集中,便于维护。
内容的提问来源于stack exchange,提问作者Kevin C
相关产品推荐
相关产品推荐

