Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 如何使用Ansible中的自定义事实从Windows主机检索已安装软件的列表_Powershell_Ansible - Fatal编程技术网

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

Powershell 如何使用Ansible中的自定义事实从Windows主机检索已安装软件的列表,powershell,ansible,Powershell,Ansible,我创建了一个Powershell脚本,以便在列出已安装软件的目标Windows计算机上生成自定义Ansible事实。现在我无法在我的剧本中正确解析我的软件列表 我可以看到自定义事实的原始内容,但似乎JSON没有得到正确解析,因为我无法获得一个正确的列表对象来由循环语句处理。出现致命错误: 该任务包括一个带有未定义变量的选项。错误是:“ansible.utils.unsafe\u proxy.AnsibleUnsafeText对象”没有属性“name”\n\n 所有自定义事实(表示由Powersh

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

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

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

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

自定义事实(Powershell)

原始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 }}"  

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

我刚才已经实现了这一点,如果您仍在进行此项工作,则没有什么建议

  • 不要在任何非开发人员服务器上使用Win32_产品类,因为此过程也是如此

  • 我建议您查看,以获取已安装程序的列表

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


  • 在Powershell输出中删除espace字符“`”并替换“get wmiobject”输出中的所有逗号会在Ansible中产生相同的错误消息。我的JSON输出有效吗?这里的win32_产品备注需要记住。我看到一些自定义软件设置在生产机器上被重置为默认设置,因为初级管理员在多台机器上运行此命令,因为所有msi上都进行了修复。您在中引用了哪个脚本?应该使用什么来代替Win32_产品?更新了脚本链接。脚本没有使用powershell函数,而是使用注册表值。@KokHowTeh要么
    Win32reg\u addRemovePrograms
    要么
    Sms\u InstalledSoftware
    ,我认为两者都是由SCCM安装的。否则:
    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 }}"