Как создать переменную на основе дисков без разделов - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь обратиться к переменной ansible_devices для моего текущего хоста, чтобы извлечь все дисковые устройства SD, которые в настоящее время не имеют раздела.Исходя из этого, мне нужно создать / обновить переменную, которая будет назначать диски имени группы томов в зависимости от размера диска, который затем будет использоваться другой задачей.

Кто-нибудь знает, КАК я могу это сделать?тот?Например, у меня есть следующий тестовый учебник, чтобы поиграться с переменным ansible_devices, но я не смог достичь своей конечной цели.

---
- hosts: all
  vars:
     disks:
       /dev/disk/notfound1 : vg_app 
       /dev/disk/notfound2 : vg_data 
       /dev/disk/notfound3 : vg_db
       /dev/disk/notfound4 : vg_log 
  tasks:
- debug:
    var: disks

- debug: 
    msg: " {{ item.key }} = {{ item.value.size }} "  
  with_dict: "{{ ansible_devices }}"
  when: "item.key.startswith('sd') and not item.value.partitions "

Теперь я хочу назначить диск с 10 ГБ для vg_app, 20 ГБ для vg_data, а самый большой из оставшихся дисков для vg_db, а последний оставшийся диск для vg_log.

Итак, теперьмои переменные диски будут выглядеть так:

     disks:
       /dev/sdc : vg_app 
       /dev/sdf : vg_data 
       /dev/sde : vg_db
       /dev/sdd : vg_log 

Моя следующая задача возьмет эту переменную и создаст на том диске нужные группы томов с нужным размером.Это должно быть динамически, потому что я не могу гарантировать, что диски, добавленные в ВМ, всегда будут иметь одинаковые имена.

ОБНОВЛЕНИЕ: Придумал свое собственное уродливое решение

- name: Collect all SD disk devices along with their SIZES which don't have a partition
  set_fact:
     disk_sizes : "{{ disk_sizes|default({}) | combine( {item.value.size.split('.')[0]: '/dev/' + item.key } ) }}"  
  with_dict: "{{ ansible_devices }}"
  when: "item.key.startswith('sd')  and not item.value.partitions "

- name: Test we have 4 unprovisioned disks in our vm
  fail: 
    msg: "4 disks were not found on the vm"
  when: ( disk_sizes | length ) != 4

- name: reset our disks variable to an empty dictionary
  set_fact:
    disks:  "{{ newdict|default({}) }}"      

- name: create my new dictionary that will have my disks assigned
  set_fact:
    disks:  "{{ disks|default({}) | combine( { item.key: item.value } ) }}"
  with_items:
     - { key: "{{disk_sizes['10']}}", value: 'vg_app' }
     - { key: "{{disk_sizes['20']}}", value: 'vg_data' }    

- name: removed the disks we have used so far
  set_fact:
    disks2: "{{ disks2|default({}) |combine({item.key: item.value})}}"
  when: "item.key not in ['10','20']"
  with_dict: "{{ disk_sizes }}"

- name: append the other disks to the disks dictionary
  set_fact:
    disks:  "{{ disks|default({}) | combine( { item.key: item.value } ) }}"
  with_items:
     - { key: "{{disk_sizes[ disks2.keys() |max ]}}", value: 'vg_db' }
     - { key: "{{disk_sizes[ disks2.keys() |min ]}}", value: 'vg_log'  }
...