You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 15:09:51