Код Ansible не удастся, когда диск NVME меняет имя после перезагрузки или переосмысления [закрыто]Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Код Ansible не удастся, когда диск NVME меняет имя после перезагрузки или переосмысления [закрыто]

Сообщение Anonymous »

Я настраиваю свой кластер Proxmox через Ansible, но у меня большая проблема с моими дисками NVME, изменяющими имена во время перезагрузки. До сих пор я жил с ними, меняющими имена, когда я переустанавливаю Proxmox, но их также сделать это после перезагрузки, так как мои машины перезагружаются после обновления ядра. Проблема возникает при настройке моего кластера Ceph, который не удается, если диск NVME изменил свое название. Насколько я могу прочитать, мне нужно использовать UUID диска для обеспечения постоянного именования, но я понятия не имею, как это сделать через Ansible.

Код: Выделить всё

# Configure Ceph OSDs
pve_ceph_osd_device: /dev/nvme0n1 # Device for the Ceph OSD.
фрагмент от/inventory/group_vars/ceph/variables.yml:
pve_ceph_osds: # List of Ceph OSDs to create.
- device: "{{ pve_ceph_osd_device }}"
crush.device.class: NVMe
< /code>
Следующий код Ansible выполняется на всех машинах, которые являются членами группы инвентаризации CEPH. < /p>
- name: Create Ceph OSDs
block:
- name: Query for existing Ceph volumes
pve_ceph_volume:
check_mode: no
register: _ceph_volume_data

- name: Generate a list of active OSDs
ansible.builtin.set_fact:
_existing_ceph_osds: "{{ _ceph_volume_data.stdout | from_json | json_query('*[].devices[]') | default([]) }}"

- name: Generate list of unprovisioned OSDs
ansible.builtin.set_fact:
_ceph_osds_diff: "{{ _ceph_osds_diff | default([]) + [item] }}"
loop: "{{ pve_ceph_osds }}"
when: item.device not in _existing_ceph_osds

- name: Create Ceph OSDs
ansible.builtin.command: >-
pveceph osd create {{ item.device }}
{% if "crush.device.class" in item %}--crush-device-class {{ item["crush.device.class"] }}{% endif %}
{% if "encrypted" in item and item["encrypted"] | bool %}--encrypted 1{% endif %}
{% if "block.db" in item %}--db_dev {{ item["block.db"] }}{% endif %}
{% if "block.wal" in item %}--wal_dev {{ item["block.wal"] }}{% endif %}
loop: '{{ _ceph_osds_diff | default([]) }}'
when: _ceph_osds_diff | length > 0
register: _ceph_osd_create
< /code>
Из Ansible, вызывает сценарий Python, который приходит сюда: < /p>
#!/usr/bin/python

from ansible.module_utils.basic import AnsibleModule
import datetime

ANSIBLE_METADATA = {
'metadata_version': '1.0',
'status': ['preview'],
'supported_by': 'community'
}

DOCUMENTATION = '''
---
module: ceph_volume

short_description: Query ceph OSDs with ceph-volume

description:
- Using the ceph-volume utility available in Ceph this module
can be used to query ceph OSDs that are backed by logical volumes.
- Only available in ceph versions luminous or greater.

options:
cluster:
description:
- The ceph cluster name.
required: false
default: ceph
data:
description:
- The logical volume name or device to use for the OSD data.
required: true
data_vg:
description:
- If data is a lv, this must be the name of the volume group it belongs to.
required: false

author:
- Andrew Schoen (@andrewschoen)
- Sebastien Han
'''

EXAMPLES = '''
- name: query all osds
ceph_volume:

- name: query single osd on test cluster
ceph_volume:
cluster: test
data: /dev/sdc
'''

def exec_command(module, cmd, stdin=None):
'''
Execute command(s)
'''
binary_data = False
if stdin:
binary_data = True
rc, out, err = module.run_command(cmd, data=stdin, binary_data=binary_data)
return rc, cmd, out, err

def get_data(data, data_vg):
if data_vg:
data = '{0}/{1}'.format(data_vg, data)
return data

def list_osd(module):
'''
List will detect whether or not a device has Ceph LVM Metadata
'''

# get module variables
cluster = module.params['cluster']
data = module.params.get('data', None)
data_vg = module.params.get('data_vg', None)
data = get_data(data, data_vg)

# Build the CLI
action = ['lvm', 'list']
cmd = ['ceph-volume', '--cluster', cluster]
cmd.extend(action)
if data:
cmd.append(data)
cmd.append('--format=json')

return cmd

def run_module():
module_args = dict(
cluster=dict(type='str', required=False, default='ceph'),
data=dict(type='str', required=False),
data_vg=dict(type='str', required=False),
)

module = AnsibleModule(
argument_spec=module_args,
supports_check_mode=True,
)

result = dict(
changed=False,
stdout='',
stderr='',
rc=0,
start='',
end='',
delta='',
)

if module.check_mode:
module.exit_json(**result)

# start execution
startd = datetime.datetime.now()

# List Ceph LVM Metadata on a device
rc, cmd, out, err = exec_command(module, list_osd(module))

endd = datetime.datetime.now()
delta = endd - startd

result = dict(
cmd=cmd,
start=str(startd),
end=str(endd),
delta=str(delta),
rc=rc,
stdout=out.rstrip('\r\n'),
stderr=err.rstrip('\r\n'),
changed=False,
)

if rc != 0:
module.fail_json(msg='non-zero return code', **result)

module.exit_json(**result)

def main():
run_module()

if __name__ == '__main__':
main()
< /code>
Я не запрограммировал сценарий Python, ни код Ansible сам, и я понятия не имею о программировании Python.
Я надеюсь, что кто -то может мне помочь, так как это действительно шоу -стоппер в моем проекте. Если я могу сгенерировать список доступных дисков в машине (исключая загрузочный диск), то я могу использовать этот список в качестве входного ввода в мой текущий код. Это позволяет мне удалить переменную с помощью имени диска, которое я установил для каждой машины. Я получил так далеко, что могу создать список дисков в машине: < /p>
- name: Gather facts
block:
- name: Gather facts about available disks
ansible.builtin.setup:
filter: ansible_devices

- name: Initialize empty list for devices
ansible.builtin.set_fact:
storage_devices: []
no_log: true

- name: Get SATA and NVMe devices
ansible.builtin.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 device names
ansible.builtin.debug:
var: storage_devices

< /code>
К сожалению, в Ansible_devices нет информации, которая сообщает вам, с какого диска загружается. Так что я действительно не знаю, откуда получить эту информацию.

Подробнее здесь: https://stackoverflow.com/questions/797 ... stallation
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»