Compare commits

..

13 Commits

Author SHA1 Message Date
886c9c0edb mod 2025-06-25 19:04:46 +03:00
f5e9afbeb9 модифицировал скрипт создания шаблона 2025-06-25 18:57:47 +03:00
4dc8b8701c modify: Пт 30 мая 2025 19:13:11 MSK 2025-05-30 19:13:14 +03:00
a4ff970a9c small mod 2022-01-21 08:44:01 +03:00
3613b9181b small mod 2022-01-21 08:42:54 +03:00
94b47cd137 readme mod 2022-01-08 17:04:08 +03:00
2af0945509 mod md 2022-01-07 15:25:41 +03:00
2474ed92e6 mod md 2022-01-07 15:22:24 +03:00
471fe09aaf готово 2022-01-07 09:17:51 +03:00
6fdbb8ead1 готово 2022-01-07 09:11:06 +03:00
622e070a8a готово 2022-01-07 09:08:37 +03:00
27703d8c8d готово 2022-01-07 08:57:50 +03:00
072c101f60 готово 2022-01-07 00:17:46 +03:00
4 changed files with 284 additions and 88 deletions

View File

@@ -20,7 +20,7 @@ vm_id=200
vm_name="ubuntu-2004-cloudinit-template" vm_name="ubuntu-2004-cloudinit-template"
vm_memory=2048 vm_memory=2048
vm_cores=2 vm_cores=2
vm_user="da2001" vm_user="cooluser"
# данные proxmox # данные proxmox
px_storage=local-lvm px_storage=local-lvm

174
create_template_deb12.sh Executable file
View File

@@ -0,0 +1,174 @@
#!/bin/bash
# Скрипт для создания шаблона ВМ в Proxmox VE с cloud-init
# Автоматически скачивает образ Debian 12, создает и настраивает ВМ как шаблон
set -e
# Параметры по умолчанию
DEFAULT_VM_ID=508
DEFAULT_VM_NAME="deb12-cloudinit-template"
DEFAULT_VM_USER="sa"
DEFAULT_VM_CORES=4
DEFAULT_VM_SOCKETS=2
DEFAULT_VM_MEMORY=4096
DEFAULT_PX_STORAGE="local-lvm"
DEFAULT_PX_BRIDGE="vmbr0"
DEFAULT_CLOUDIMG="debian-12-generic-amd64.qcow2"
DEFAULT_IMG_URL="https://cloud.debian.org/images/cloud/bookworm/latest"
# Функция вывода справки
show_help() {
echo "Использование: $0 [ОПЦИИ] <пароль>"
echo
echo "Обязательные аргументы:"
echo " пароль Пароль пользователя для cloud-init"
echo
echo "Опции:"
echo " -h, --help Показать эту справку и выйти"
echo " -i ID, --id ID ID создаваемой ВМ (по умолчанию: $DEFAULT_VM_ID)"
echo " -n NAME, --name NAME Имя шаблона (по умолчанию: \"$DEFAULT_VM_NAME\")"
echo " -u USER, --user USER Имя пользователя cloud-init (по умолчанию: \"$DEFAULT_VM_USER\")"
echo " -s STORAGE, --storage STORAGE"
echo " Хранилище Proxmox (по умолчанию: \"$DEFAULT_PX_STORAGE\")"
echo " -b BRIDGE, --bridge BRIDGE"
echo " Сетевой мост (по умолчанию: \"$DEFAULT_PX_BRIDGE\")"
echo " -c CORES, --cores CORES"
echo " Количество ядер CPU (по умолчанию: $DEFAULT_VM_CORES)"
echo " -m MEMORY, --memory MEMORY"
echo " Объем памяти в MB (по умолчанию: $DEFAULT_VM_MEMORY)"
echo " -S SOCKETS, --sockets SOCKETS"
echo " Количество сокетов CPU (по умолчанию: $DEFAULT_VM_SOCKETS)"
echo
echo "Примеры:"
echo " $0 MySecurePassword123"
echo " $0 -u admin MySecurePassword123"
echo " $0 -i 510 -n my-template -u admin MySecurePassword123"
echo " $0 -c 2 -m 2048 -S 1 MyPassword"
exit 0
}
# Парсинг аргументов командной строки
while [[ $# -gt 0 ]]; do
case $1 in
-h|--help)
show_help
;;
-i|--id)
vm_id="$2"
shift 2
;;
-n|--name)
vm_name="$2"
shift 2
;;
-u|--user)
vm_user="$2"
shift 2
;;
-s|--storage)
px_storage="$2"
shift 2
;;
-b|--bridge)
px_bridge="$2"
shift 2
;;
-c|--cores)
vm_cores="$2"
shift 2
;;
-m|--memory)
vm_memory="$2"
shift 2
;;
-S|--sockets)
vm_sockets="$2"
shift 2
;;
*)
if [ -z "$vm_passwd" ]; then
vm_passwd="$1"
shift
else
echo "Ошибка: Неизвестный аргумент $1"
show_help
exit 1
fi
;;
esac
done
# Проверка обязательного аргумента (пароль)
if [ -z "$vm_passwd" ]; then
echo "Ошибка: Необходимо указать пароль для пользователя cloud-init"
echo
echo "Справка - \"$0 -h\""
#show_help
exit 1
fi
# Установка значений по умолчанию для неопределённых параметров
cloudimg="${cloudimg:-$DEFAULT_CLOUDIMG}"
img_url="${img_url:-$DEFAULT_IMG_URL}"
vm_id="${vm_id:-$DEFAULT_VM_ID}"
vm_name="${vm_name:-$DEFAULT_VM_NAME}"
vm_memory="${vm_memory:-$DEFAULT_VM_MEMORY}"
vm_cores="${vm_cores:-$DEFAULT_VM_CORES}"
vm_sockets="${vm_sockets:-$DEFAULT_VM_SOCKETS}"
vm_user="${vm_user:-$DEFAULT_VM_USER}"
px_storage="${px_storage:-$DEFAULT_PX_STORAGE}"
px_bridge="${px_bridge:-$DEFAULT_PX_BRIDGE}"
# Вывод информации о параметрах
echo "Параметры создания шаблона:"
echo "--------------------------"
echo "ID ВМ: $vm_id"
echo "Имя шаблона: $vm_name"
echo "Пользователь: $vm_user"
echo "Ядра CPU: $vm_cores"
echo "Сокеты CPU: $vm_sockets"
echo "Память (MB): $vm_memory"
echo "Хранилище: $px_storage"
echo "Сетевой мост: $px_bridge"
echo "--------------------------"
echo
# Загрузка образа если отсутствует
if [ ! -f "$cloudimg" ]; then
echo "Скачиваю образ $img_url/$cloudimg"
wget -q --show-progress "$img_url/$cloudimg"
fi
# Создание и настройка ВМ
echo "Создаю ВМ $vm_id: $vm_name"
qm create "$vm_id" \
--name "$vm_name" \
--memory "$vm_memory" \
--cores "$vm_cores" \
--sockets "$vm_sockets" \
--numa 1 \
--agent enabled=1 \
--net0 virtio,bridge=$px_bridge
echo "Импортирую диск"
qm importdisk "$vm_id" "$cloudimg" "$px_storage"
echo "Настраиваю оборудование ВМ"
qm set "$vm_id" \
--scsihw virtio-scsi-single \
--scsi0 "$px_storage:vm-$vm_id-disk-0" \
--scsi1 "$px_storage:cloudinit,media=cdrom" \
--ide2 "none,media=cdrom" \
--boot "order=scsi0;ide2;net0" \
--cipassword="$vm_passwd" --ciuser="$vm_user"
echo Конвертирую ВМ в шаблон
qm template $vm_id
echo Удаляю скачанный образ
rm -f $cloudimg
echo
echo "Шаблон $vm_name (ID: $vm_id) успешно создан!"
exit 0

174
readme.md
View File

@@ -1,35 +1,28 @@
# Автоматизация процесса создания ВМ в Proxmox с использованием Ansible # Автоматизация процесса создания ВМ в Proxmox с использованием Ansible
## Содержание ## Содержание
- [Требования](#требования)
- [Создание шаблона](#создание-шаблона) - [Требования](#требования)
- [Создание ВМ с помощью Ansible](#создание-вм-с-помощью-ansible) - [Создание шаблона](#создание-шаблона)
- [Необходимые файлы](#необходимые-файлы) - [Создание ВМ с помощью Ansible](#создание-вм-с-помощью-ansible)
- [О версиях Ansible](#О-версиях-ansible) - [Необходимые файлы](#необходимые-файлы)
- [Структура данных](#Структура-данных) - [Описание переменных](#описание-переменных)
- [Списки](#Списки) - [Задачи плейбука](#задачи-плейбука)
- [Словари (Хеш таблицы)](#Словари-Хеш-таблицы) - [Подключение к ВМ](#подключение-к-вм)
- [Списки словарей](#Списки-словарей)
- [Словари словарей](#Словари-словарей)
- [Циклы](#Циклы)
- [with_items](#with_items)
- [С простыми списками](#С-простыми-списками)
- [with_dict](#with_dict)
- [Полезные ссылки](#Полезные-ссылки)
- [Благодарности](#Благодарности)
## Требования ## Требования
Для работы Ansible с гипервизором Proxmox, написан соответсвующий модуль [proxmox_kvm](https://docs.ansible.com/ansible/latest/collections/community/general/proxmox_kvm_module.html).
Для работы Ansible с гипервизором Proxmox, написан соответствующий модуль [proxmox_kvm](https://docs.ansible.com/ansible/latest/collections/community/general/proxmox_kvm_module.html).
В свою очередь, для работы модуля `proxmox_kvm` на хосте Proxmox, необходимо установить пакеты `requests` и `proxmoxer`. В свою очередь, для работы модуля `proxmox_kvm` на хосте Proxmox, необходимо установить пакеты `requests` и `proxmoxer`.
Т.к. Ansible написан на Python, необходимые ему пакеты можно установить с помощью PIP. Т.к. Ansible написан на Python, необходимые ему пакеты можно установить с помощью PIP.
Для установки PIP для Python 2 - `sudo apt install python-pip` Для установки PIP для Python 2 - `sudo apt install python-pip`
Для установки PIP для Python 3 (предпочтительнее) - `sudo apt install python3-pip` Для установки PIP для Python 3 (предпочтительнее) - `sudo apt install python3-pip`
Далее установим необходимые пакеты: Далее установим необходимые пакеты:
*в зависимости от способа установки Python и PIP, команда для установки пакетов может отличаться. В общем случае, команда выглядит так:* _в зависимости от способа установки Python и PIP, команда для установки пакетов может отличаться. В общем случае, команда выглядит так:_
```
pip install requests pip install requests
pip install proxmoxer pip install proxmoxer
```
[⬆ Наверх](#содержание) [⬆ Наверх](#содержание)
@@ -41,32 +34,30 @@ pip install proxmoxer
Скрипт `create_template.sh` необходимо скопировать на хост Proxmox, добавить права на исполнение. Скрипт `create_template.sh` необходимо скопировать на хост Proxmox, добавить права на исполнение.
Стоит обратить внимание на объявленные в скрипте переменные: Стоит обратить внимание на объявленные в скрипте переменные:
*скачиваемый образ и его URL* _скачиваемый образ и его URL_
```
cloudimg=focal-server-cloudimg-amd64.img # имя скачиваемого образа
img_url=https://cloud-images.ubuntu.com/focal/current # адрес, по которому доступен образ
```
*параметры создаваемого шаблона* cloudimg=focal-server-cloudimg-amd64.img # имя скачиваемого образа
``` img_url=https://cloud-images.ubuntu.com/focal/current # адрес, по которому доступен образ
vm_id=200 # идентификатор создаваемого шаблона
vm_name="ubuntu-2004-cloudinit-template" # имя создаваемого шаблона
vm_memory=2048 # объем оперативной памяти выделяемый шаблону
vm_cores=2 # количество ядер процессора доступных шаблону
vm_user="da2001" # имя пользвателя, который будет создан в шаблоне
```
*переменные, относящиеся к гипервизору Proxmox* _параметры создаваемого шаблона_
```
px_storage=local-lvm # хранилище, в котором будет размещен диск шаблона vm_id=200 # идентификатор создаваемого шаблона
px_bridge=vmbr1 # имя сетевого интерфейса к которому будет подключен шаблон vm_name="ubuntu-2004-cloudinit-template" # имя создаваемого шаблона
``` vm_memory=2048 # объем оперативной памяти выделяемый шаблону
vm_cores=2 # количество ядер процессора доступных шаблону
vm_user="da2001" # имя пользвателя, который будет создан в шаблоне
_переменные, относящиеся к гипервизору Proxmox_
px_storage=local-lvm # хранилище, в котором будет размещен диск шаблона
px_bridge=vmbr1 # имя сетевого интерфейса к которому будет подключен шаблон
**необходимо изменить значения переменных на свои** **необходимо изменить значения переменных на свои**
Скрипт необходимо запустить от имени пользователя, который может создавать и редактировать ВМ (по-умолчанию это `root`). При запуске нужно придумать и указать в качестве аргумента пароль, который будет добавлен для авторизации пользователя, указанного в переменной `vm_user` Скрипт необходимо запустить от имени пользователя, который может создавать и редактировать ВМ (по-умолчанию это `root`). При запуске нужно придумать и указать в качестве аргумента пароль, который будет добавлен для авторизации пользователя, указанного в переменной `vm_user`
Пример запуска скрипта Пример запуска скрипта
```bash ```bash
root@pve:~# ./create_template.sh verySecPassword root@pve:~# ./create_template.sh verySecPassword
``` ```
@@ -78,56 +69,87 @@ root@pve:~# ./create_template.sh verySecPassword
## Создание ВМ с помощью Ansible ## Создание ВМ с помощью Ansible
### Необходимые файлы ### Необходимые файлы
Для корректной работы плейбука необходимы следующие файлы: Для корректной работы плейбука необходимы следующие файлы:
- `ansible.cfg` - файл общих настроек ansible
- `create_vm.yaml` - файл плейбука - `ansible.cfg` - файл общих настроек ansible
- `hosts.ini` - файл инвентаря, в котором указан, единственный в данном примере хост Proxmox - `create_vm.yaml` - файл плейбука
- `vars.yaml` - используемые переменные - `hosts.ini` - файл инвентаря, в котором указан, единственный в данном примере хост Proxmox
- `vms.yaml` - переменные с описанием создаваемых ВМ - `vars.yaml` - используемые переменные
- `vms.yaml` - переменные с описанием создаваемых ВМ
[⬆ Наверх](#содержание) [⬆ Наверх](#содержание)
### Описание переменных ### Описание переменных
Используемые в плейбуке переменные разделены на два файла: `vars.yaml`, `vms.yaml`. Это разделение сделано для удобства, чтобы отделить переменные виртуальных машин. Используемые в плейбуке переменные разделены на два файла: `vars.yaml`, `vms.yaml`. Это разделение сделано для удобства, чтобы отделить переменные виртуальных машин.
`vars.yaml` `vars.yaml`
```
pve_storage: local-lvm # название хранилища на котором будут созданы ВМ pve_storage: local-lvm # название хранилища на котором будут созданы ВМ
api_host: 192.168.13.9 # IP адрес хоста Proxmox api_host: 192.168.13.9 # IP адрес хоста Proxmox
api_user: root@pam # данные для авторизации по API api_user: root@pam # данные для авторизации по API
api_password: securePassword # пароль для авторизации api_password: securePassword # пароль для авторизации
node: pve # имя ноды Proxmox node: pve # имя ноды Proxmox
clone_vm: ubuntu-2004-cloudinit-template # имя шаблона из которого создаются ВМ clone_vm: ubuntu-2004-cloudinit-template # имя шаблона из которого создаются ВМ
key_name: id_rsa.pub # имя SSH ключа, который будет скопирован в ВМ для дальнейшего доступа к ним key_name: id_rsa.pub # имя SSH ключа, который будет скопирован в ВМ для дальнейшего доступа к ним
```
`vms.yaml` `vms.yaml`
```
vms:
us1:
name: us10.da2001.ru # имя создаваемой ВМ
ip: 192.168.10.21/24 # IP адрес ВМ
gw: 192.168.10.9 # IP адрес шлюза по-умолчанию, который будет прописан в ВМ (адрес гипервизора)
dns: 8.8.8.8 # IP адрес DNS сервера
vmid: 201 # идентификатор создаваемой ВМ
cores: 2 # количество доступных процессоров для ВМ, если отличается от указанных в шаблоне
sockets: 1 # количество доступных сокетов для ВМ, если отличается от указанных в шаблоне
memory: 2048 # количество доступной оперативной памяти для ВМ, если отличается от указанного значения в шаблоне
us2:
name: us11.da2001.ru
ip: 192.168.10.22/24
gw: 192.168.10.9
dns: 8.8.8.8
vmid: 202
cores: 2
sockets: 1
memory: 2048
```
**перед запуском плейбука необходимо убедиться, что установлены корректные значения** vms:
us1:
name: us10.da2001.ru # имя создаваемой ВМ
ip: 192.168.10.21/24 # IP адрес ВМ
gw: 192.168.10.9 # IP адрес шлюза по-умолчанию, который будет прописан в ВМ (адрес гипервизора)
dns: 8.8.8.8 # IP адрес DNS сервера
vmid: 201 # идентификатор создаваемой ВМ
cores: 2 # количество доступных процессоров для ВМ, если отличается от указанных в шаблоне
sockets: 1 # количество доступных сокетов для ВМ, если отличается от указанных в шаблоне
memory: 2048 # количество доступной оперативной памяти для ВМ, если отличается от указанного значения в шаблоне
us2:
name: us11.da2001.ru
ip: 192.168.10.22/24
gw: 192.168.10.9
dns: 8.8.8.8
vmid: 202
cores: 2
sockets: 1
memory: 2048
**перед запуском плейбука необходимо убедиться, что установлены корректные значения переменных**
[⬆ Наверх](#содержание) [⬆ Наверх](#содержание)
### Задачи плейбука ### Задачи плейбука
- Клонирование ВМ из шаблона
а основу были взяты примеры из документации <https://docs.ansible.com/ansible/latest/collections/community/general/proxmox_kvm_module.html#examples>_</br>
В задаче создаются виртуальные машины на основе шаблона
Конструкция
```yaml
loop: "{{ lookup('dict', vms) }}"
```
позволяет перебрать все необходимые ключи и значения из словаря `vms`
- Настройка IP адресов
В этой задаче назначается IP адрес для каждой созданной ВМ и IP адрес шлюза по-умолчанию
- Настройка DNS
Как видно из названия, в ВМ указывается IP адрес DNS сервера
- Копирование SSH ключей в ВМ
Для беспарольного доступа в ВМ будет скопирован указанный SSH ключ хоста, на котором выполняется плейбук
- Обновление параметров ВМ
При клонировании из шаблона, ВМ создаются с теми же параметрами, что и сам шаблон. Выполнение этой задачи позволяет изменить параметры ВМ, например размер оперативной памяти, количество доступных процессоров и т.д.
- Запуск ВМ
Финальным этапом будет запуск созданных ВМ
## Подключение к ВМ
Для доступа к ВМ по SSH необходимо использовать имя пользователя, которое определено в переменной `vm_user` в скрипте `create_template.sh`. При подключении с хоста, на котором запускался плейбук пароль вводить не нужно, т.к. в ВМ скопирован SSH ключ. При подключении из других систем, необходимо указать пароль, который был задан в виде аргумента при запуске скрипта `create_template.sh`.
[⬆ Наверх](#содержание) [⬆ Наверх](#содержание)

View File

@@ -1,6 +1,6 @@
vms: vms:
us1: us1:
name: us10.da2001.ru name: us10.example.com
ip: 192.168.10.21/24 ip: 192.168.10.21/24
gw: 192.168.10.9 gw: 192.168.10.9
dns: 8.8.8.8 dns: 8.8.8.8
@@ -9,7 +9,7 @@ vms:
sockets: 1 sockets: 1
memory: 2048 memory: 2048
us2: us2:
name: us11.da2001.ru name: us11.example.com
ip: 192.168.10.22/24 ip: 192.168.10.22/24
gw: 192.168.10.9 gw: 192.168.10.9
dns: 8.8.8.8 dns: 8.8.8.8