首页 > 解决方案 > 如何使用 Ansible 中的自定义事实从 Windows 主机检索已安装软件的列表

问题描述

我创建了一个 Powershell 脚本,以便在目标 Windows 机器上生成自定义 Ansible 事实,列出已安装的软件。现在我无法在我的剧本中正确解析我的软件列表。

我可以看到自定义事实的原始内容,但似乎 JSON 未正确解析,因为我无法获得要由循环语句处理的正确列表对象。发生致命错误:

该任务包括一个带有未定义变量的选项。错误是:“ansible.utils.unsafe_proxy.AnsibleUnsafeText 对象”没有属性“名称”\n\n

所有自定义事实(即由 Powershell 自定义事实生成的 Windows 软件列表)都由 Ansible 自动存储在名为“ansible_softwarelist”的 ansible_facts 的自动生成变量/属性中(“ansible_”后缀 + 我的事实文件的名称,不带扩展名)。

自定义事实(Powershell)

$software = get-wmiobject -class Win32_Product | select-object name,version,vendor
$software_count = ($software | measure).count
$software_list | % { `
    $i++

    if ($i -lt ($software_count-1))
    {
        $separator = ","
    }
    else
    {
        $separator = ""
    }

    write-host "{`"name`":`"$($_.name)`",`"version`":`"$($_.version)`",`"vendor`":`"$($_.vendor)`"}$separator"

}

原始 Powershell 输出

{"name":"Software 1","version":"14.0.7015.1000","vendor":"Vendor 1"},
{"name":"Software 2","version":"14.1.1000","vendor":"Vendor 1"},
{"name":"Software 3","version":"1.5.2","vendor":"Vendor 1"}

Ansible 剧本

tasks:         

     - name: "Deploy Powershell script (custom Windows facts)"
       win_copy:
         src: "/etc/ansible/files/facts/softwarelist.ps1"
         dest: "C:\\remotedir\\softwarelist.ps1"

     - name: "Gather custom facts"
       setup:
         fact_path: "C:\\remotedir"

     - name: "View software list in Ansible by name"
       debug:
         msg: "{{ item.name }}"  
       loop: "{{ ansible_softwarelist }}"  

标签: powershellansible

解决方案


我刚刚实现了这个,如果你还在做这个,我对你的建议很少。

  1. 不要在任何非开发服务器上使用 Win32_Product 类,因为此过程还会启动已安装包的一致性检查、验证和修复安装

  2. 我建议您看一下脚本,以获取已安装程序的列表。

  3. 您不需要从 powershell 脚本返回 Json 格式的值。List、Collection 类型的输出就可以了。我实际上会推荐这个,因为如果您使用它,它将有助于浏览像 mongodb 这样的缓存数据库。如果从 powershell 脚本返回 json 格式的输出,则对象将以字符串格式 "{"key":"value"}" 存储在数据库中。


推荐阅读