powershell - 如何使用 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 }}"
解决方案
我刚刚实现了这个,如果你还在做这个,我对你的建议很少。
不要在任何非开发服务器上使用 Win32_Product 类,因为此过程还会启动已安装包的一致性检查、验证和修复安装。
我建议您看一下脚本,以获取已安装程序的列表。
您不需要从 powershell 脚本返回 Json 格式的值。List、Collection 类型的输出就可以了。我实际上会推荐这个,因为如果您使用它,它将有助于浏览像 mongodb 这样的缓存数据库。如果从 powershell 脚本返回 json 格式的输出,则对象将以字符串格式 "{"key":"value"}" 存储在数据库中。
推荐阅读
- r - 我可以创建一个 for 循环来将日历日期划分为 R 中的唯一周吗?
- javascript - 根据键名组织对象 - Underscore.js
- javascript - 更改 Javascript 中的悬停/工具提示文本
- javascript - 我的图像在加载时淡出,但我只希望它发生一次
- javascript - 如何摆脱出现在某些网页上的 P-SEP 框?
- python - 如何获取以下类型字典的两个最大值的键
- c# - RDLC - 表格中每个字符的 BOX
- spring - 应用程序启动后 HikariPool 关闭
- python - discord.py 中的错误处理问题
- linq - Linq关于日期计算的想法