Ansible中如何正确对比跨主机的两个已注册变量值?
解决Ansible跨主机变量对比失败的问题
问题根源
你的Playbook在localhost上仅初始化了res_green,res_blue保持默认空数组;在remotehost上仅初始化了res_blue,res_green为空数组。执行对比任务时,两边的变量始终不完整,导致res_green == res_blue永远不成立,触发"变量不同"的错误提示。
解决方案
要实现跨主机变量对比,需要让其中一台主机能获取到另一台主机的变量值,推荐两种可行方式:
方式一:在单台主机上收集两边数据
将远程主机的信息收集任务委托到localhost执行,这样两个变量都存储在同一主机上,直接对比即可:
--- - name: compare remote file to a local reference hosts: localhost gather_facts: no become: true vars: local_reference: "{{ local_folder }}server_output_green.txt" remote_files_2_check: "{{ remote_folder }}server-config.properties" res_green: [] res_blue: [] tasks: - name: Check the bad debts results from green side shell: grep CodeListString {{ local_reference }} register: result_green - set_fact: res_green: "{{ result_green.stdout_lines|list }}" - debug: var: res_green - name: Check the paymentgateway bad debt codes from remotehost shell: grep CodeListString {{ remote_files_2_check }} register: result_blue delegate_to: remotehost - set_fact: res_blue: "{{ result_blue.stdout_lines|list }}" - debug: var: res_blue - name: Vars are equal debug: msg: '变量相同' when: res_green == res_blue failed_when: false # 确保此任务不触发失败 - name: Vars are not equal fail: msg: '变量不同' when: res_green != res_blue
方式二:使用hostvars跨主机访问变量
保留原有的跨主机任务结构,通过hostvars访问另一台主机的已注册变量,注意要确保变量已被目标主机设置完成:
--- - name: compare remote file to a local reference hosts: all gather_facts: no become: true vars: local_reference: "{{ local_folder }}server_output_green.txt" remote_files_2_check: "{{ remote_folder }}server-config.properties" res_green: [] res_blue: [] tasks: - name: Check the bad debts results from green side shell: grep CodeListString {{ local_reference }} register: result_green when: inventory_hostname == groups['localhost'][0] - set_fact: res_green: "{{ result_green.stdout_lines|list }}" when: inventory_hostname == groups['localhost'][0] - debug: var: res_green when: inventory_hostname == groups['localhost'][0] - name: Check the paymentgateway bad debt codes shell: grep CodeListString {{ remote_files_2_check }} register: result_blue when: inventory_hostname == groups['remotehost'][0] - set_fact: res_blue: "{{ result_blue.stdout_lines|list }}" when: inventory_hostname == groups['remotehost'][0] - debug: var: res_blue when: inventory_hostname == groups['remotehost'][0] # 仅在localhost上执行对比 - name: 对比变量 block: - debug: msg: '变量相同' when: res_green == hostvars['remotehost'].res_blue - fail: msg: '变量不同' when: res_green != hostvars['remotehost'].res_blue when: inventory_hostname == groups['localhost'][0]
关键说明
- 方式一通过
delegate_to将远程任务委托到本地执行,所有变量都在同一主机上,对比逻辑更直接; - 方式二利用
hostvars[主机名].变量名跨主机获取已注册的变量,适合需要保留原主机任务结构的场景; - 两种方式都能确保对比时使用的是完整的变量值,避免因变量未初始化导致的错误判断。
内容的提问来源于stack exchange,提问作者Steven84
相关产品推荐
相关产品推荐

