我创建了一个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 }}"
答案 0 :(得分:1)
我刚刚实施了此操作,如果您仍在进行此操作,则对您没有什么建议。
我建议您看一下script,以获取已安装程序的列表。
您不需要从powershell脚本返回Json格式的值。 List,Collection类型的输出即可。我实际上建议这样做,因为如果您使用它,它将有助于浏览像mongodb这样的缓存数据库。如果您从Powershell脚本返回json格式的输出,则对象将以字符串格式“ {\“ key \”:\“ value \”}“”存储在数据库中。
答案 1 :(得分:0)
尝试设置过滤器:“ | to_json ”,这应该正确设置值的格式