Ansible翻转inventory清单后仍按原顺序读取IP列表问题如何解决
根因说明
Ansible 的 order 参数仅控制任务在主机上的执行先后顺序,不会修改 groups.all、groups.test_hosts 这类内置主机组变量的原始排序。你当前通过 groups.all.index(inventory_hostname) 计算的索引,永远和 inventory 文件的原始主机顺序绑定,和执行顺序无关,因此会出现主机和IP的绑定关系固定不变的问题。
调整方案
新增自定义排序的主机列表变量,和 order 参数的排序逻辑保持一致,基于自定义列表计算索引即可实现需求,修改后的完整playbook如下:
--- - hosts: test_hosts vars: region: east _Hub_IP: [ 20.21.22.23, 28.29.30.31] _Transit_IP: [ 24.25.26.27, 32.33.34.35] _Neighbor_IP: [24.25.26.28, 32.33.34.36] # 按region规则生成对应排序的主机列表,和order参数逻辑对齐 sorted_hosts: "{{ (region == 'east')|ternary(groups.test_hosts|reverse, groups.test_hosts) }}" # 从自定义排序的列表中获取当前主机的索引 _idx: "{{ sorted_hosts.index(inventory_hostname) }}" order: "{{ (region == 'east')|ternary('reverse_inventory', 'inventory') }}" become: yes ignore_unreachable: true gather_facts: false tasks: - name: "Configure Router" debug: msg: - "{{ _Hub_IP[_idx|int] }}" - "{{ _Transit_IP[_idx|int] }}" - "{{ _Neighbor_IP[_idx|int] }}"
修改后,执行顺序第一的主机永远会拿到IP列表的第一个元素,第二台主机拿到第二个元素,和inventory原始顺序无关。
内容的提问来源于stack exchange,提问作者Texia Plazaola
相关产品推荐
相关产品推荐

