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

如何解决从 Ansible 中的注册变量创建字典/列表

嘿*,

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

- disk&Ven_QEMU&Prod_QEMU_HARDdisK
  |- 00000
  |- 00001
- disk&Ven_VMware&Prod_Virtual_disk
  |- 00000

我能够确定 HKLM 根目录下的 vendor 文件夹和磁盘文件夹:\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

输出如下:

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","item": "disk&Ven_QEMU&Prod_QEMU_HARDdisK","sub_keys": [
                "000000","000001"
            ]
        },"item": "disk&Ven_VMware&Prod_Virtual_disk","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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?