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

如何让Ansible的register变量仅存储PowerShell脚本中的自定义对象

解决Ansible win_powershell返回自定义对象的问题

我来帮你搞定这个问题!你当前的情况是因为win_powershell模块不会自动将你创建的自定义对象作为核心返回内容——你需要显式输出这个对象,同时调整脚本里的细节来避免格式混乱。

核心修改点

  1. 移除多余的Out-String调用:Select-Object -ExpandProperty已经直接返回目标属性值,Out-String会给结果添加不必要的换行和空格,导致你的自定义对象值格式异常。
  2. 显式输出自定义对象:在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 16:07:36