Ansible for PROXMOX

Средний рейтинг
5 из 5 звезд. 1 голосов.
Мой рейтинг:

Всем доброго дня.

После прохождения курсов “Яндекс Практикум” захотелось немного проработать полученные навыки. К сожалению, на текущем месте работы  глобальных и  интересных задач нет, т.ч. приходится оттачивать навыки на том, что есть.

А есть гипервизор PROXMOX. И вот почему бы не попробовать для него сделать IaC (Infrastructure as Code).

Ниже покажу как я сделал.

Сразу оговорюсь: я новичок в этом деле, т.ч. не факт что конфиг-файлы истинно верные в плане написания и всегда можно сделать лучше. Т.ч. прошу сильно не ругать.

Погнали…

Предварительная подготовка.

На машине, откуда будет запускаться Ansible и на самом Proxmox’е надо установить нужные компоненты Python – proxmoxer и requests (выполняется от обычного пользователя, хотя там root по умолчанию):

Если  у ваc там Интернет через прокси, то так:

вместо 192.168.1.2 подставить адрес своего прокси-сервера.

Файлы конфигурации ANSIBLE.

Для самого первого теста создадим простой файл inventory с таким содержимым:

ansible: invetory

где:
proxmox-h: название группы;
proxmox: имя машины (будет использоваться в playbook’е);
ansible_host: ip-адрес сервера proxmox где будет выполняться Playbook. Если у вас настроен DNS, то этот параметр можно не указывать;
ansible_ssh_private_key_file: предварительно сгенерировал ключи ssh и импортировал в proxmox, а здесь уже указал расположение ключа;
ansible_ssh_user: пользователь, под которым происходит подключение к proxmox;
ansible_ssh_common_args=’-o StrictHostKeyChecking=no’: необязательный параметр, который как будто бы не показывает окно принятия ключей при подключении по ssh;
ansible_python_interpreter=/usr/bin/python3: выделил цветом. Без этого параметра у меня была вот такая ошибка:

FAILED! => {“changed”: false, “msg”: “proxmoxer required for this module”}

[свернуть]

Теперь можно проверить подключение к серверу:

после ansible указываем имя хоста, потом
-i: файл inventory
-m ping: модуль ping

на выходе получаем следующее

ansible test

Теперь создадим простой playbook.yml с таким содержимым:

playbook

По параметрам:
proxmox_default_behavior: no_defaults – без него была вот такая ошибка:

FAILED! => {“changed”: false, “msg”: “creation of qemu VM spynal with vmid 400 failed with exception=400 Bad Request: Parameter verification failed. – {‘archive’: \”missing property – ‘force’ requires this property\”}”}

если попробовать указать не использовать этот модуль, то будет такая ошибка:

fatal: [proxmox]: FAILED! => {“changed”: false, “msg”: “Unsupported parameters for (community.general.proxmox_kvm) module: archive Supported parameters include: acpi, agent, api_host, api_password, api_token_id, api_token_secret, api_user, args, autostart, balloon, bios, boot, bootdisk, cicustom, cipassword, citype, ciuser, clone, cores, cpu, cpulimit, cpuunits, delete, description, digest, force, format, freeze, full, hostpci, hotplug, hugepages, ide, ipconfig, keyboard, kvm, localtime, lock, machine, memory, migrate_downtime, migrate_speed, name, nameservers, net, newid, node, numa, numa_enabled, onboot, ostype, parallel, pool, protection, proxmox_default_behavior, reboot, revert, sata, scsi, scsihw, searchdomains, serial, shares, skiplock, smbios, snapname, sockets, sshkeys, startdate, startup, state, storage, tablet, target, tdf, template, timeout, update, validate_certs, vcpus, vga, virtio, vmid, watchdog”}

api_user: ‘root@pam’ – пользователь для авторизации, здесь по умолчанию указан. Если у вас другой, то указывать его. Вообще, это хорошая практика создавать отдельную учетку, но для примера я не стал морочиться;
api_password: ‘12345678’ – пароль пользователя;
api_host: ‘proxmox.test.local’ – доменное имя сервера, можно посмотреть у него в /etc/hosts;
name: test-vm-1 – имя вм;
node: srv1 – имя ноды, я так понимаю что если у вас кластер из Proxmox’ов;
vmid: 400 – ID вм. Можно не указывать, тогда он сам задаст этот ID;
cores: 4 – кол-во ядер процессора;
vcpus: 2 – кол-во вирт процессоров;
numa_enabled: true – включение NUMA1
numa: ‘cpuunits=2048
memory: 8192 – кол-во оперативной памяти (RAM);
net: – настройка сети;
net0: ‘virtio,bridge=vmbr0’ – типа адаптера (virtio), тип подключения – в данном случае “мост”;
virtio: – параметры жесткого диска;
virtio0: ‘vm_drive:50,format=raw’ – где будет хранится жесткий диск (у меня отдельный раздел), и тип – у меня raw из-за особенностей. Может быть qcow2;
ide: ‘{“ide2″:”local:iso/ubuntu-22.04.1-live-server-amd64.iso,media=cdrom,size=1440306”}’ – добавление CD-ROM’а и образа диска. Тут в качестве примера указан Ubuntu Server 22.04, образ которого находится на диске local. Если у вас как-то иначе, то надо указать где лежит образ, его точное название и размер.
Я просто в пустую ВМ добавил образ и списал параметры.

[свернуть]

Обращаю внимание, что здесь самый простой конфиг. Т.е. ВМ создастся с такими параметрами и пустая – без ОС.

Если вам надо что-то другое, например EFI, то надо будет добавить. Так же всякие MAC-адреса и прочее.

Все параметры я перебрать не смогу, к сожалению.

После этого можно запустить:

Вывод примерно будет таким:

ansible playbook

И в самом гипервизоре можно увидеть созданную машину (через web-консоль):

 

proxmox vm properties

либо через консоль

и вывод будет таким:

 

ANSIBLE-VAULT.

Внесем улучшения. Т.к. у нас в Playbook’е логин и пароль передаются в открытом виде – это очень плохо. Надо поправить.

Для этого используем ansible-vault.

Создадим файл с именем vault.yml с таким содержанием:

Далее его зашифруем

будет запрошен ввод пароля (надо задать для шифровки) и его подтверждение

на выводе получим что-то такое:

Посмотреть его содержимое можно так:

ввести ранее заданный пароль и на выводе получить что-то типа такого:

для редактирования:

тут так же надо будет ввести пароль.

Изменим наш Playbook:

  • укажем файл, откуда брать переменные,
  • вместо логина и пароля укажем переменные из зашифрованного файла

После чего выполнить команду:

где:
–ask-vault-pass для запроса ввода пароля.

Помимо ручного ввода пароля, можно его добавить в файл, который будет доступен только вам и никому больше. Это позволит не вводить пароль.

Попробуем.

Местоположение и название файла по вашем усмотрению, здесь просто для примера. Файл будет в том же каталоге, где все тестовые скрипты.

Теперь попробуем запустить наш Playbook так:

Ну и увидим, что всё работает.

ansible file password

 

Клонирование ВМ из шаблона.

Каждый раз создавать ВМ иногда затруднительно и долго. Проще создать, установить ОС, настроить и сделать шаблон, из которого потом развернуть новую ВМ дело пары минут.

Далее подразумевается, что шаблон уже есть  на Proxmox’е.

Подготовим отдельный playbook – vm_clone_templ.yml. Отличается от первоначального тем, что здесь указываем шаблон из которого будем клонировать машину и остальные параметры:

где:
vmid: 301 – id шаблона;
newid: 500 – новый ID для склонированной машины. Если не указывать, то Proxmox сам назначит свободный ID;
clone: linux-srv – название вирт с шаблоном;
name: clone-vm1 – новое имя склонированной ВМ;
full: true – вид клонирования. Есть FULL и LINKED. Если не указывать, то по умолчанию – full;
timeout: 500 – время выполнения. Можно не указывать, я просто взял из шаблона;
format: raw – у меня формат такой, но можно использовать – qcow2.

Разное.

Добавить описание к ВМ.

Так же можно добавить описание для создаваемой ВМ (думаю, что и для клонированной из шаблона тоже).

Для этого достаточно в конфиг добавить:

description: ‘[описание какое хотите добавить.]’

Например,

Если надо что-то в пару строк, то так:

Выполним и посмотрим на описание:

ansible proxmox notes

Параметры модуля.

А вот все параметры, которые есть у модуля proxmox_kvm

proxmox_kvm params

 

[свернуть]

Цвета.

Если вам надо отключить цветовое раскрашивание в консоли, то надо выполнить такую команду:

 

Источники.

NUMA и прочие параметры

ANSIBLE PROXMOX DOCS

If you found an error, highlight it and press Shift + Enter or to inform us.

  1. NUMA (Non-Uniform Memory Access — неравномерный доступ к памяти или Non-Uniform Memory Architecture — Архитектура с неравномерной памятью) — схема реализации компьютерной памяти, используемая в мультипроцессорных системах, когда время доступа к памяти определяется её расположением по отношению к процессору.
Фото аватара

Дмитрий

родился, учился, работаю-учусь

5 1 голос
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии