Ansible:使用 ansible facts,如何根据存储控制器值获取磁盘设备,然后将该设备设置为变量
Ansible: Using ansible facts, how can I get a disk device based on the storage controller value and then set the device as a variable
上下文:我有一个系统,其中包含来自不同存储控制器的磁盘组合,因此每种类型的磁盘都有不同的用途。我是 ansible 的新手,边走边学。编写一个从每种类型的控制器获取磁盘的剧本,以便我可以设置它们。
例如。下面是 #'filter=ansible_devices*' 的示例输出 ... sdz 设备来自 SATA 控制器。在我的其他主机上,它可能并不总是 sdz.. 所以我想获取设备名称并将其存储在一个变量中,如果事实上该设备具有 "host": "SATA controller"。我在想也许我需要遍历 ansible_devices 字典,找到匹配的键 ("host": "SATA controller") 然后获取它的父字典,这将是设备。有没有办法做到这一点......或更简单的方法? :)
"sdz": {
"holders": [
"mpathz"
],
"host": "SATA controller: Intel Corporation C610/X99 series chipset 6-Port SATA Controller [AHCI mode] (rev 05)",
"links": {
"ids": [
"ata-SAMSUNG_MZ7GE960HMHP-00003_S1Y2NYAFC02269",
"wwn-0x50025388003aeb2a"
],
"labels": [],
"masters": [
"dm-19"
],
"uuids": []
},
"model": "SAMSUNG MZ7GE960",
"partitions": {},
"removable": "0",
"rotational": "0",
"sas_address": null,
"sas_device_handle": null,
"scheduler_mode": "cfq",
"sectors": "1875385008",
"sectorsize": "512",
"serial": "S1Y2NYAFC02269",
"size": "894.25 GB",
"support_discard": "512",
"vendor": "ATA",
"virtual": 1,
"wwn": "0x50025388003aeb2a"
假设 ansible_devices
已经设置为变量
,剧本中的这个任务片段应该可以完成
tasks:
- name: get device name
set_fact:
device_name: "{{ item.key }}"
no_log: True
with_dict: "{{ ansible_devices }}"
when: "item.value.host.startswith('SATA')"
- name: show all values for selected device name
debug: var=ansible_devices[device_name]
- name: show only device name
debug: var=device_name
set_fact 将获取您的设备名称。这两个调试语句将分别转储所有设备值和设备名称。
假设ansible.builtin.setup
已完成,您可以使用此代码获取所有存储设备:
- name: initialize empty list for devices
set_fact:
storage_devices: []
no_log: true
- name: get SATA and NVMe devices
set_fact:
storage_devices: "{{ storage_devices + [item.key] }}"
no_log: true
with_dict: "{{ ansible_devices }}"
when: "item.value.host.startswith('SATA controller:') or
item.value.host.startswith('Non-Volatile memory controller:')"
- name: show all values for selected devices
debug: msg="{{ ansible_devices[item] }}"
loop: "{{ storage_devices }}"
- name: show devices names
debug: var=storage_devices
- name: show first SATA or NVMe device in the list
debug: var=storage_devices[0]
上下文:我有一个系统,其中包含来自不同存储控制器的磁盘组合,因此每种类型的磁盘都有不同的用途。我是 ansible 的新手,边走边学。编写一个从每种类型的控制器获取磁盘的剧本,以便我可以设置它们。
例如。下面是 #'filter=ansible_devices*' 的示例输出 ... sdz 设备来自 SATA 控制器。在我的其他主机上,它可能并不总是 sdz.. 所以我想获取设备名称并将其存储在一个变量中,如果事实上该设备具有 "host": "SATA controller"。我在想也许我需要遍历 ansible_devices 字典,找到匹配的键 ("host": "SATA controller") 然后获取它的父字典,这将是设备。有没有办法做到这一点......或更简单的方法? :)
"sdz": {
"holders": [
"mpathz"
],
"host": "SATA controller: Intel Corporation C610/X99 series chipset 6-Port SATA Controller [AHCI mode] (rev 05)",
"links": {
"ids": [
"ata-SAMSUNG_MZ7GE960HMHP-00003_S1Y2NYAFC02269",
"wwn-0x50025388003aeb2a"
],
"labels": [],
"masters": [
"dm-19"
],
"uuids": []
},
"model": "SAMSUNG MZ7GE960",
"partitions": {},
"removable": "0",
"rotational": "0",
"sas_address": null,
"sas_device_handle": null,
"scheduler_mode": "cfq",
"sectors": "1875385008",
"sectorsize": "512",
"serial": "S1Y2NYAFC02269",
"size": "894.25 GB",
"support_discard": "512",
"vendor": "ATA",
"virtual": 1,
"wwn": "0x50025388003aeb2a"
假设 ansible_devices
已经设置为变量
tasks:
- name: get device name
set_fact:
device_name: "{{ item.key }}"
no_log: True
with_dict: "{{ ansible_devices }}"
when: "item.value.host.startswith('SATA')"
- name: show all values for selected device name
debug: var=ansible_devices[device_name]
- name: show only device name
debug: var=device_name
set_fact 将获取您的设备名称。这两个调试语句将分别转储所有设备值和设备名称。
假设ansible.builtin.setup
已完成,您可以使用此代码获取所有存储设备:
- name: initialize empty list for devices
set_fact:
storage_devices: []
no_log: true
- name: get SATA and NVMe devices
set_fact:
storage_devices: "{{ storage_devices + [item.key] }}"
no_log: true
with_dict: "{{ ansible_devices }}"
when: "item.value.host.startswith('SATA controller:') or
item.value.host.startswith('Non-Volatile memory controller:')"
- name: show all values for selected devices
debug: msg="{{ ansible_devices[item] }}"
loop: "{{ storage_devices }}"
- name: show devices names
debug: var=storage_devices
- name: show first SATA or NVMe device in the list
debug: var=storage_devices[0]