Я создал сценарий Powershell для создания пользовательских фактов Ansible на целевом компьютере с Windows, где указано установленное программное обеспечение. На данный момент я не могу правильно проанализировать мой список программного обеспечения в моей книге игр.
Я могу видеть необработанное содержимое пользовательских фактов, но кажется, что JSON неправильно проанализирован, потому что я не могу получить правильный объект списка для обработки оператором цикла. Произошла фатальная ошибка:
Задача включает в себя параметр с неопределенной переменной. Ошибка была следующей: «ansible.utils.unsafe_proxy.AnsibleUnsafeText объект» не имеет атрибута «name» \ n \ n
Все пользовательские факты (то есть список программного обеспечения Windows, сгенерированный пользовательским фактом Powershell) автоматически сохраняются Ansible в автоматически генерируемой переменной / атрибуте ansible_facts, называемом ansible_softwarelist (суффикс 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 playbook
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 }}"