繁体   English   中英

从 Ansible 中的注册变量创建字典/列表

[英]Create dictionary / list from registered variable in Ansible

嘿*,

我正在写一本剧本,它应该在 Windows 注册表中设置一些磁盘属性。 所有磁盘属性都存储在特定的供应商文件夹下。 最后我要更改的每个磁盘文件夹下都有一个值。

- Disk&Ven_QEMU&Prod_QEMU_HARDDISK
  |- 00000
  |- 00001
- Disk&Ven_VMware&Prod_Virtual_disk
  |- 00000

我能够确定供应商文件夹以及 HKLM:\SYSTEM\CurrentControlSet\Enum\SCSI 根目录下的磁盘文件夹:

- hosts: some_host
  tasks:
    - name: Get vendor folders
      win_reg_stat:
        path: HKLM:\SYSTEM\CurrentControlSet\Enum\SCSI
      register: vendors
    
    - name: Get disk folders
      win_reg_stat:
        path: "HKLM:\\SYSTEM\\CurrentControlSet\\Enum\\SCSI\\{{ item }}"
      with_items:
      - "{{ vendors.sub_keys }}"
      register: disks
    
    - debug:
        var: disks.results

output 看起来像这样:

ok: [some_host] => {
    "disks.results": [
        {
            "ansible_loop_var": "item",
            "changed": false,
            "exists": true,
            "failed": false,
            "item": "CdRom&Ven_QEMU&Prod_QEMU_DVD-ROM",
            "properties": {},
            "sub_keys": [
                "000001"
            ]
        },
        {
            "ansible_loop_var": "item",
            "changed": false,
            "exists": true,
            "failed": false,
            "item": "Disk&Ven_QEMU&Prod_QEMU_HARDDISK",
            "properties": {},
            "sub_keys": [
                "000000",
                "000001"
            ]
        },
        {
            "ansible_loop_var": "item",
            "changed": false,
            "exists": true,
            "failed": false,
            "item": "Disk&Ven_VMware&Prod_Virtual_disk",
            "properties": {},
            "sub_keys": [
                "000000"
            ]
        }
    ]
}

我现在有点卡住了。 我正在尝试获取用于遍历所有这些磁盘文件夹的字典或列表。 像这样的东西:

Disk&Ven_QEMU&Prod_QEMU_HARDDISK: 000000
Disk&Ven_QEMU&Prod_QEMU_HARDDISK: 000001
Disk&Ven_VMware&Prod_Virtual_disk: 000000

有没有办法做到这一点?

感谢和问候埃里克

例如

    - set_fact:
        my_list: "{{ my_list|default([]) + [{item.0.item:item.1}] }}"
      with_subelements:
        - "{{ disks.results }}"
        - sub_keys

  my_list:
  - CdRom&Ven_QEMU&Prod_QEMU_DVD-ROM: '000001'
  - Disk&Ven_QEMU&Prod_QEMU_HARDDISK: '000000'
  - Disk&Ven_QEMU&Prod_QEMU_HARDDISK: '000001'
  - Disk&Ven_VMware&Prod_Virtual_disk: '000000'

不可能创建字典,因为在字典中,键必须是唯一的。

我想与您分享我的最终解决方案。 感谢弗拉基米尔的帮助。

- name: Get vendors
  win_reg_stat:
    path: HKLM:\SYSTEM\CurrentControlSet\Enum\SCSI
  register: os_vendors
    
- name: Get vendors subfolders
  win_reg_stat:
    path: "HKLM:\\SYSTEM\\CurrentControlSet\\Enum\\SCSI\\{{ item }}"
  loop: "{{ os_vendors.sub_keys }}"
  register: os_subfolders

- name: Build registry pathes with vendors and disks
  set_fact:
    os_regpath_dict: "{{ os_regpath_dict | default({}) | combine ({item.item : item.sub_keys })}}"
  loop: "{{ os_subfolders.results }}"

- name: Get disk folders
  win_reg_stat:
    path: "HKLM:\\SYSTEM\\CurrentControlSet\\Enum\\SCSI\\{{ item.0.key }}\\{{ item.1 }}\\Device Parameters\\Partmgr"
    name: "Attributes"
  loop: "{{ os_regpath_dict | dict2items | subelements('value') }}"
  when: "'Disk' in item.0.key"
  register: os_disks

- name: Set value of entry Attributes to 0
  win_regedit:
    path: "HKLM:\\SYSTEM\\CurrentControlSet\\Enum\\SCSI\\{{ item.item.0.key }}\\{{ item.item.1 }}\\Device Parameters\\Partmgr"
    name: Attributes
    data: 0
    type: dword
  loop: "{{ os_disks.results }}"
  when: item.value is defined

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM