Ansible Inventory未按字母排序:执行顺序不符合预期排查
Ansible
order: sorted 排序未按预期输出的问题 问题场景
我有如下Ansible主机文件:
# Contains the host mappings [master] m1.my-host.com ansible_host=192.168.0.100 [node] n1.my-host.com ansible_host=192.168.0.102 n2.my-host.com ansible_host=192.168.0.103 [k3s_cluster:children] master node [all:vars] ansible_python_interpreter=/usr/bin/python3
在Playbook中设置了有序执行:
--- - name: Setup hostname, users and groups hosts: all order: sorted gather_facts: true remote_user: myuser become: yes roles: - {role: common, tags: ['host', 'system']}
但执行后得到如下输出结果:
TASK [Gathering Facts] ********************************************************************************************************************************************************************************************** ok: [n1.my-host.com] ok: [n2.my-host.com] ok: [m1.my-host.com]
预期的执行顺序应为 m1.my-host.com、n1.my-host.com、n2.my-host.com,请问为何sorted排序规则未生效?
原因分析与解决方法
核心原因
你看到的是任务完成后的输出顺序,而非Ansible实际的任务启动顺序。
Ansible默认以并发模式执行任务(默认forks=5,你的主机数量小于该值,所有主机会同时启动任务),不同主机的任务完成时间存在差异,导致输出顺序和预期的排序顺序不一致。而order: sorted参数控制的是Ansible启动主机任务的顺序,并非输出顺序。
验证与解决
如果需要确认排序规则是否生效,或者要求严格按顺序执行任务,可以在Playbook中添加serial: 1,强制串行执行(每次仅处理一台主机):
--- - name: Setup hostname, users and groups hosts: all order: sorted serial: 1 # 强制串行执行,按排序顺序依次处理主机 gather_facts: true remote_user: myuser become: yes roles: - {role: common, tags: ['host', 'system']}
此时执行会严格按照m1.my-host.com → n1.my-host.com → n2.my-host.com的顺序执行并输出。
补充说明:order: sorted确实是按inventory_hostname的字典序排序,m1的字典序优先级高于n1、n2,所以任务启动顺序是符合预期的,只是并发执行导致输出顺序混乱。
内容的提问来源于stack exchange,提问作者joesan
相关产品推荐
相关产品推荐

