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