Ansible:单主机与多主机服务对比及差异显示异常修复
问题
我已经用以下YAML代码实现了两台服务器服务的对比,但现在需要将单台主机test1.example.com的服务列表,与inventory中selected_hosts组内的多台主机服务列表分别对比。修改ansible.utils.fact_diff模块的after部分后,虽然能遍历所有服务器,但无法正确显示服务差异——预期会用-标注差异项,可输出只有+符号。
原始可用代码
--- - hosts: test become: true gather_facts: false tasks: - name: Gather Service Facts service_facts: - name: Show all debug: var: services - name: Show difference ansible.utils.fact_diff: before: "{{ hostvars['test1.example.com'].services | to_nice_yaml }}" after: "{{ hostvars['test2.example.com'].services | to_nice_yaml }}"
修改后的fact_diff配置(存在问题)
ansible.utils.fact_diff: before: "{{ hostvars['test1.example.com'].services | to_nice_yaml }}" after: "{% for ip_address in groups['selected_hosts'] %} {{ hostvars[ip_address].services | to_nice_yaml }} {% endfor %}"
异常输出示例
+ NetworkManager-dispatcher.service: + name: NetworkManager-dispatcher.service + source: systemd + state: inactive + status: enabled +NetworkManager-wait-online.service: + name: NetworkManager-wait-online.service + source: systemd + state: stopped + status: enabled +NetworkManager.service: + name: NetworkManager.service + source: systemd + state: running + status: enabled +auditd.service: + name: auditd.service + source: systemd + state: running + status: enabled
注:为简化仅展示部分服务,预期输出应包含-符号标注差异项。
解决方案
问题原因
当前修改的after参数是把所有selected_hosts组内主机的服务YAML直接拼接在一起,相当于把多个服务列表合并成了一个大列表,fact_diff只会将这个大列表和before的单主机列表做整体对比,自然只会出现+(大列表里多出来的内容),而无法实现单主机与组内每台主机分别对比的需求。
修复步骤
要实现分别对比,需要对selected_hosts组内的每台主机单独调用fact_diff模块,而不是把所有主机的服务内容拼接后一次性对比。
正确的YAML代码
--- - hosts: test become: true gather_facts: false tasks: - name: Gather Service Facts service_facts: - name: Show all services debug: var: services - name: Compare test1.example.com with each host in selected_hosts ansible.utils.fact_diff: before: "{{ hostvars['test1.example.com'].services | to_nice_yaml }}" after: "{{ hostvars[item].services | to_nice_yaml }}" loop: "{{ groups['selected_hosts'] }}" loop_control: label: "{{ item }}" # 显示当前对比的主机名,让输出更清晰
说明
- 使用
loop遍历selected_hosts组内的每个主机,每次循环单独执行一次fact_diff对比。 loop_control的label参数可以让输出中明确显示当前正在对比的主机,避免输出混乱。- 这样每次对比都是
test1.example.com和组内单台主机的服务列表,差异项会正常显示-(test1有但当前对比主机没有)和+(当前对比主机有但test1没有)符号。
内容的提问来源于stack exchange,提问作者G.Baysec
相关产品推荐
相关产品推荐

