如何使用Ansible中的自定义事实从Windows主机检索已安装软件的列表

时间:2019-03-12 11:43:33

标签: powershell ansible

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

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

  

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

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

自定义事实(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 }}"  

2 个答案:

答案 0 :(得分:1)

我刚刚实施了此操作,如果您仍在进行此操作,则对您没有什么建议。

  1. 请勿在任何非开发服务器上使用Win32_Product类,因为此过程也是initiates a consistency check of packages installed, verifying and repairing the install
  2. 我建议您看一下script,以获取已安装程序的列表。

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

答案 1 :(得分:0)

尝试设置过滤器:“ | to_json ”,这应该正确设置值的格式