如何在Ansible Playbook中跨主机访问Windows主机变量?
跨主机访问Ansible变量的正确方法
这个问题其实是Ansible变量作用域的典型坑——每个主机的变量默认只存在于自身的上下文里,切换到localhost后自然找不到Windows主机上注册的变量。我给你几个最常用的解决方法,附示例代码:
方法1:使用hostvars引用目标主机的注册变量
这是最通用的方案,直接通过hostvars字典来访问其他主机的变量。你需要知道目标Windows主机的名称(或者组名对应的具体主机)。
示例Playbook:
# 先在Windows主机执行脚本并注册结果 - name: Run script on Windows host hosts: windows tasks: - name: Execute custom PowerShell script win_shell: .\your_script.ps1 register: windows_script_output # 注册脚本返回结果到这个变量 # 切换到localhost复用结果 - name: Use Windows script result on localhost hosts: localhost tasks: - name: Print the script's return value debug: # 语法:hostvars['目标主机名']['注册的变量名'].属性 msg: "Windows script returned: {{ hostvars['windows_hostname']['windows_script_output'].stdout }}"
如果你的windows是一个主机组(包含多台机器),需要指定组内具体的主机,比如取第一台:
msg: "Windows script returned: {{ hostvars[groups['windows'][0]]['windows_script_output'].stdout }}"
方法2:用set_fact+delegate_facts共享变量到localhost
这种方法会把Windows主机的变量直接设置为localhost的事实(fact),之后在localhost上下文可以直接访问。
示例:
- name: Execute script and share result hosts: windows tasks: - name: Run script and register result win_shell: .\your_script.ps1 register: windows_script_output - name: Share result to localhost's facts set_fact: shared_script_result: "{{ windows_script_output.stdout }}" delegate_facts: true # 把这个fact绑定到目标主机(这里是localhost) delegate_to: localhost - name: Use shared result on localhost hosts: localhost tasks: - name: Print shared result debug: msg: "Windows script returned: {{ shared_script_result }}"
方法3:用add_host把变量附加到localhost
add_host模块可以动态修改主机清单,把变量直接添加到localhost的主机条目里,之后就能直接访问。
示例:
- name: Run script on Windows host hosts: windows tasks: - name: Execute script and register result win_shell: .\your_script.ps1 register: windows_script_output - name: Attach result to localhost add_host: name: localhost script_return_value: "{{ windows_script_output.stdout }}" - name: Use result on localhost hosts: localhost tasks: - name: Print the return value debug: msg: "Windows script returned: {{ script_return_value }}"
关于你遇到的报错
你看到的'windows' is undefined错误,是因为你直接尝试用{{ windows.some_var }}的方式访问,但windows是主机组/主机名,不是一个变量。必须通过hostvars来引用对应主机的变量上下文,或者用上面的方法把变量同步到localhost。
内容的提问来源于stack exchange,提问作者larrybg
相关产品推荐
相关产品推荐

