如何让Ansible的register变量仅存储PowerShell脚本中的自定义对象
解决Ansible win_powershell返回自定义对象的问题
我来帮你搞定这个问题!你当前的情况是因为win_powershell模块不会自动将你创建的自定义对象作为核心返回内容——你需要显式输出这个对象,同时调整脚本里的细节来避免格式混乱。
核心修改点
- 移除多余的
Out-String调用:Select-Object -ExpandProperty已经直接返回目标属性值,Out-String会给结果添加不必要的换行和空格,导致你的自定义对象值格式异常。 - 显式输出自定义对象:在PowerShell脚本的末尾添加
$myObject,这样win_powershell模块会将这个对象捕获到返回结果的output字段中。
修改后的完整Playbook
- name: firsttest hosts: win tasks: - name: Ping my Windows vm win_ping: - name: Run basic PowerShell script ansible.windows.win_powershell: script: | $hostname = hostname # 移除Out-String,直接获取属性值 $domain = Get-NetFirewallProfile -Name Domain | Select-Object -ExpandProperty Enabled $private = Get-NetFirewallProfile -Name Private | Select-Object -ExpandProperty Enabled $public = Get-NetFirewallProfile -Name Public | Select-Object -ExpandProperty Enabled # 过滤回环地址,取第一个有效IPv4地址 $ipaddress = Get-NetIPAddress -AddressFamily IPv4 | Where-Object { $_.InterfaceAlias -ne "Loopback Pseudo-Interface 1" } | Select-Object -ExpandProperty IPAddress | Select-Object -First 1 $myObject = [PSCustomObject]@{ "Hostname" = $hostname "IPAddress" = $ipaddress # 修正拼写错误:IPAdress -> IPAddress "Domain" = $domain "Private" = $private "Public" = $public } # 显式输出自定义对象,让模块捕获 $myObject register: result - name: Show custom object output debug: var: result.output[0]
补充说明
- 我修正了
IPAdress的拼写错误(改为IPAddress),避免字段名不一致。 - 对于
IPAddress,添加了过滤条件排除回环地址,并且只取第一个IPv4地址——如果你需要所有IPv4地址,可以把Select-Object -First 1换成Join-String -Separator ", "来合并成字符串。
修改后的返回结果
执行后,result.output[0]会输出你期望的结构:
{ "Hostname": "Node-Ansible1", "IPAddress": "192.168.0.1", "Domain": true, "Private": false, "Public": false }
(可选)直接将对象赋值给新变量
如果你希望后续任务直接使用这个自定义对象,而不用每次写result.output[0],可以添加一个set_fact任务:
- name: Extract custom result object set_fact: my_system_info: "{{ result.output[0] }}" - name: Use the custom object debug: var: my_system_info
内容的提问来源于stack exchange,提问作者Onyx
相关产品推荐
相关产品推荐

