Как изменить размер жесткого диска с помощью ansible модуля proxmox_kvm

#ansible #kvm #proxmox

#ansible #kvm #proxmox

Вопрос:

Я создал шаблон виртуальной машины ProxMox размером 8 ГБ. Используя ansible модуль proxmo_kvm, я клонирую его, но не могу изменить размер SCSI-диска. Возможно ли это сделать? если это так, не могли бы вы дать мне несколько объяснений, чтобы понять, как это сделать?

Иерархия файлов проекта:

 .
├── playbook.yml
└─── proxmox-vm/
    ├── tasks/
    │   └── main.yml
    └── vars/
        └── main.yml
  

playbook.yml :

 - hosts: localhost
  connection: local

  roles:
    - proxmox-vm
  

proxmox-vm/vars/main.yml :

 ---
# vars file for proxmox-vm
proxmox:
  api:
    host: 127.0.0.1
    user: 'user@pam'
    password: 'password'
  node: workstation
  vm:
    name: test-debian
    clone: debian-9.8
    full: yes
    scsi:
      size: 16G
  

proxmox-vm/tasks/main.yml :

 ---
# tasks file for proxmox-vm
- name: create VM from template
  proxmox_kvm:
    api_host: "{{ proxmox.api.host }}"
    api_user: "{{ proxmox.api.user }}"
    api_password: "{{ proxmox.api.password }}"
    node: "{{ proxmox.node }}"
    name: "{{ proxmox.vm.name }}"
    clone: "{{ proxmox.vm.clone }}"
    full: yes
    scsi: "{{ proxmox.vm.scsi }}"
  

Запуск Ansible playbook:

 ansible-playbook playbook.yml

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [proxmox-vm : create VM from template] ************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0
  

Я ожидаю новую виртуальную машину размером 16 ГБ, но фактический размер диска равен 8 ГБ (исходный шаблон размера диска)

Ответ №1:

Это возможно с помощью uri модуля ansible. Добавьте в файл следующие задачи proxmox-vm/tasks/main.yml :

 # get VMID
- name: get VM state
  proxmox_kvm:
    api_host: "{{ proxmox.api.host }}"
    api_user: "{{ proxmox.api.user }}"
    api_password: "{{ proxmox.api.password }}"
    node: "{{ proxmox.node}}"
    name: "{{ proxmox.vm.name }}"
    state: current
  register: result
- name: set fact VMID
  set_fact:
    vmid: "{{ result.msg | regex_replace('.*vmid = ([1-9][0-9]{0,3}).*', '\1') }}"
# Authentication
- name: authentication
  uri:
    url: "https://{{ proxmox.api.host }}:8006/api2/json/access/ticket"
    method: POST
    body_format: form-urlencoded
    body:
      username: "{{ proxmox.api.user }}"
      password: "{{ proxmox.api.password }}"
  register: auth
# Resize disk
- name: resize disk
  uri:
    url: "https://{{ proxmox.api.host }}:8006/api2/json/nodes/{{ proxmox.node }}/qemu/{{ vmid }}/resize"
    method: PUT
    headers: 
      Cookie: "PVEAuthCookie={{ auth.json.data.ticket }}"
      CSRFPreventionToken: "{{ auth.json.data.CSRFPreventionToken }}"
    body_format: form-urlencoded
    body:
      disk: scsi0
      size: "{{ proxmox.vm.scsi.size }}"
  

Комментарии:

1. Кажется, что конечная точка изменения размера не является асинхронной.. Я получаю /usr/bin/qemu-img resize -f raw /data/pool1/images/101/vm-101-disk-0.raw 10737418240' failed: got timeout в ответ… Кажется, что, возможно, есть какая-то незавершенная задача, которая должна быть выполнена.

Ответ №2:

В настоящее время это невозможно, потому что ansible модуль proxmox_kvm не разрешает этого (ни для clone , ни для update ). Смотрите исходный код модуля ( proxmox_kvm.py ):

 # [...]
def create_vm(module, proxmox, vmid, newid, node, name, memory, cpu, cores, sockets, timeout, update, **kwargs):
# [...]
    # valide clone parameters
    valid_clone_params = ['format', 'full', 'pool', 'snapname', 'storage', 'target']
# [...]
    elif module.params['clone'] is not None:
        for param in valid_clone_params:
            if module.params[param] is not None:
                clone_params[param] = module.params[param]
        clone_params.update(dict([k, int(v)] for k, v in clone_params.items() if isinstance(v, bool)))
taskid = proxmox_node.qemu(vmid).clone.post(newid=newid, name=name, **clone_params)
# [...]
    # If update, don't update disk (virtio, ide, sata, scsi) and network interface
    if update:
# [...]
        if 'scsi' in kwargs:
            del kwargs['scsi']
# [...]