Ansible win_disk_facts 获取驱动器盘符时出现问题
Ansible win_disk_facts problem getting the drive letter
我正在尝试在 windows 主机中存在的所有磁盘上设置共享。我使用 win_disk_facts
获取主机上存在的所有磁盘,然后我设法遍历磁盘,但由于某种原因我无法获取驱动器号。不流利的 YAML,我很确定问题出在我的语法上。
调试代码如下:
- name: Get disk facts
win_disk_facts:
- name: debug
debug:
msg: '{{ disk.partitions.drive_letter }}'
loop: '{{ ansible_facts.disks }}'
loop_control:
loop_var: disk
这将 return 错误:
"msg": "The task includes an option with an undefined variable. The
error was: 'list object' has no attribute 'drive_letter'
但它确实存在,所以它一定是我尝试访问它的方式。
有指针吗?
问题在于 partitions
属性 本身就是一个列表,而您正试图像 object/dictionary 一样访问它。您可以使用 subelements
filter 从字典列表中遍历嵌套键。
我手头没有 Windows 机器,所以我无法验证它是否正常工作,但是用我自己的 ansible_fact5
模拟 ansible_facts
,这是一个简化的工作示例:
- hosts: localhost
connection: local
gather_facts: yes
vars:
ansible_fact5:
disks:
- guid: 1,
partitions:
- drive_letter: 'A'
- drive_letter: 'B'
- guid: 2,
partitions:
- drive_letter: 'C'
- drive_letter: 'D'
tasks:
- name: with_subelements -> loop
debug:
msg: "Disk {{ item.0.guid }} - Drive {{ item.1.drive_letter }}"
loop: "{{ ansible_fact5.disks | subelements('partitions') }}"
item.0
指的是 ansible_fact5.disks
中的每个单独元素,item.1
指的是 ansible_fact5.disks.$.partitions
中的每个单独元素
当你运行这个剧本时,你会得到这个输出:
$ ansible-playbook test.yaml
...
TASK [with_subelements -> loop] **********************************************************************************************
ok: [localhost] => (item=[{'guid': 1, 'partitions': [{'drive_letter': 'A'}, {'drive_letter': 'B'}]}, {'drive_letter': 'A'}]) => {}
MSG:
Disk 1 - Drive A
ok: [localhost] => (item=[{'guid': 1, 'partitions': [{'drive_letter': 'A'}, {'drive_letter': 'B'}]}, {'drive_letter': 'B'}]) => {}
MSG:
Disk 1 - Drive B
ok: [localhost] => (item=[{'guid': 2, 'partitions': [{'drive_letter': 'C'}, {'drive_letter': 'D'}]}, {'drive_letter': 'C'}]) => {}
MSG:
Disk 2 - Drive C
ok: [localhost] => (item=[{'guid': 2, 'partitions': [{'drive_letter': 'C'}, {'drive_letter': 'D'}]}, {'drive_letter': 'D'}]) => {}
MSG:
Disk 2 - Drive D
PLAY RECAP *******************************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
我正在尝试在 windows 主机中存在的所有磁盘上设置共享。我使用 win_disk_facts
获取主机上存在的所有磁盘,然后我设法遍历磁盘,但由于某种原因我无法获取驱动器号。不流利的 YAML,我很确定问题出在我的语法上。
调试代码如下:
- name: Get disk facts
win_disk_facts:
- name: debug
debug:
msg: '{{ disk.partitions.drive_letter }}'
loop: '{{ ansible_facts.disks }}'
loop_control:
loop_var: disk
这将 return 错误:
"msg": "The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'drive_letter'
但它确实存在,所以它一定是我尝试访问它的方式。
有指针吗?
问题在于 partitions
属性 本身就是一个列表,而您正试图像 object/dictionary 一样访问它。您可以使用 subelements
filter 从字典列表中遍历嵌套键。
我手头没有 Windows 机器,所以我无法验证它是否正常工作,但是用我自己的 ansible_fact5
模拟 ansible_facts
,这是一个简化的工作示例:
- hosts: localhost
connection: local
gather_facts: yes
vars:
ansible_fact5:
disks:
- guid: 1,
partitions:
- drive_letter: 'A'
- drive_letter: 'B'
- guid: 2,
partitions:
- drive_letter: 'C'
- drive_letter: 'D'
tasks:
- name: with_subelements -> loop
debug:
msg: "Disk {{ item.0.guid }} - Drive {{ item.1.drive_letter }}"
loop: "{{ ansible_fact5.disks | subelements('partitions') }}"
item.0
指的是 ansible_fact5.disks
中的每个单独元素,item.1
指的是 ansible_fact5.disks.$.partitions
当你运行这个剧本时,你会得到这个输出:
$ ansible-playbook test.yaml
...
TASK [with_subelements -> loop] **********************************************************************************************
ok: [localhost] => (item=[{'guid': 1, 'partitions': [{'drive_letter': 'A'}, {'drive_letter': 'B'}]}, {'drive_letter': 'A'}]) => {}
MSG:
Disk 1 - Drive A
ok: [localhost] => (item=[{'guid': 1, 'partitions': [{'drive_letter': 'A'}, {'drive_letter': 'B'}]}, {'drive_letter': 'B'}]) => {}
MSG:
Disk 1 - Drive B
ok: [localhost] => (item=[{'guid': 2, 'partitions': [{'drive_letter': 'C'}, {'drive_letter': 'D'}]}, {'drive_letter': 'C'}]) => {}
MSG:
Disk 2 - Drive C
ok: [localhost] => (item=[{'guid': 2, 'partitions': [{'drive_letter': 'C'}, {'drive_letter': 'D'}]}, {'drive_letter': 'D'}]) => {}
MSG:
Disk 2 - Drive D
PLAY RECAP *******************************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0