готово

master
artemdolgiy 2022-01-06 22:39:49 +03:00
parent 559be1bafe
commit 4175738090
7 changed files with 158 additions and 45 deletions

4
ansible.cfg Normal file
View File

@ -0,0 +1,4 @@
[defaults]
host_key_checking = false
inventory = ./hosts.ini
private_key_file = /home/da2001/.ssh/id_rsa

View File

@ -3,10 +3,15 @@
# завершить выполнение, если некоторая команда, которая не является частью какого-либо теста (например, if [ ... ] или конструктора &&), возвращает ненулевой код
set -e
# скачать образ ubuntu server 20.04 с поддержкой cloud-init
echo Скачиваю образ Ubuntu Server 20.04 с поддержкой cloud-init
wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img
# проверка запуска скрипта с параметром
if [ -n "$1" ]; then
vm_passwd="$1"
else
echo "Необходимо указать желаемый пароль для шаблона первым аргументом"
exit 1
fi
# задаём необходимые переменные
cloudimg=focal-server-cloudimg-amd64.img
# параметры вм
@ -14,10 +19,18 @@ vm_id=200
vm_name="ubuntu-2004-cloudinit-template"
vm_memory=2048
vm_cores=2
vm_user="da2001"
# данные proxmox
px_storage=local-lvm
px_bridge=vmbr0
px_bridge=vmbr1
# проверить наличие образа, если его нет - скачать образ ubuntu server 20.04 с поддержкой cloud-init
if [ ! -f "$cloudimg" ]; then
echo "Файл $cloudimg не существует"
echo Скачиваю образ Ubuntu Server 20.04 с поддержкой cloud-init
wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img
fi
echo Создаю ВМ
qm create $vm_id --name $vm_name --memory $vm_memory --cores $vm_cores --net0 virtio,bridge=$px_bridge
@ -26,6 +39,8 @@ qm set $vm_id --scsihw virtio-scsi-pci --scsi0 $px_storage:vm-$vm_id-disk-0
qm set $vm_id --boot c --bootdisk scsi0
qm set $vm_id --ide2 $px_storage:cloudinit
qm set $vm_id --serial0 socket --vga serial0
qm set $vm_id --cipassword=$vm_passwd --ciuser=$vm_user
qm set $vm_id --agent 1
echo Конвертирую ВМ в шаблон
qm template $vm_id

View File

@ -3,28 +3,56 @@
hosts: proxmox
vars_files:
- vars.yaml
- vms.yaml
tasks:
- name: Создание и настройка ВМ из шаблона
- name: Клонирование ВМ из шаблона
community.general.proxmox_kvm:
node: "{{ node }}"
name: "{{ item.value.name }}"
newid: "{{ item.value.vmid }}"
api_user: "{{ api_user }}"
api_password: "{{ api_password }}"
api_host: "{{ api_host }}"
clone: "{{ clone_vm }}"
storage: "{{ pve_storage }}"
format: qcow2
timeout: 500
loop: "{{ lookup('dict', vms) }}"
block:
- name: Создание ВМ
community.general.proxmox_kvm:
api_user: "{{ pve_user }}"
api_password: "{{ pve_password }}"
api_host: "{{ pve_node }}"
clone: "{{ pve_template_name }}"
vmid: "{{ pve_template_id }}"
newid: "{{ vm_id }}"
name: "{{ vm_name }}"
node: "{{ pve_node }}"
storage: "{{ pve_storage }}"
format: qcow2
timeout: 500
ciuser: "{{ vm_user }}"
cipassword: "{{ vm_passwd }}"
nameservers: '"{{ vm_dns }}"'
net:
net0: 'virtio,bridge="{{ vm_net_intf }}"'
ipconfig:
ipconfig0: 'ip="{{ vm_ip }}"/"{{ vm_mask }}",gw="{{ vm_gw }}"'
sshkeys: '"{{ ssh_key }}"'
- name: Настройка IP адресов
command: "qm set {{ item.value.vmid }} --ipconfig0 gw={{ item.value.gw }},ip={{ item.value.ip }}"
loop: "{{ lookup('dict', vms) }}"
- name: Настройка DNS
command: "qm set {{ item.value.vmid }} --nameserver {{ item.value.dns }}"
loop: "{{ lookup('dict', vms) }}"
- name: Копирование SSH ключей в ВМ
command: "qm set {{ item.value.vmid }} --sshkey {{ key_name }}"
args:
chdir: ~/.ssh
loop: "{{ lookup('dict', vms) }}"
- name: Обновление параметров ВМ
community.general.proxmox_kvm:
api_host: "{{ api_host }}"
api_user: "{{ api_user }}"
api_password: "{{ api_password }}"
cores: "{{ item.value.cores }}"
sockets: "{{ item.value.sockets }}"
memory: "{{ item.value.memory }}"
update: true
vmid: "{{ item.value.vmid }}"
node: "{{ node }}"
name: "{{ item.value.name }}"
loop: "{{ lookup('dict', vms) }}"
- name: Запуск ВМ
community.general.proxmox_kvm:
api_host: "{{ api_host }}"
api_password: "{{ api_password }}"
api_user: "{{ api_user }}"
vmid: "{{ item.value.vmid }}"
node: "{{ node }}"
state: started
loop: "{{ lookup('dict', vms) }}"

View File

@ -1,2 +1,2 @@
[proxmox]
pve ansible_host=192.168.13.9
pve ansible_host=192.168.13.9 ansible_user=root

View File

@ -0,0 +1,58 @@
# Автоматизация процесса создания ВМ в Proxmox с использованием Ansible
## Этапы
- [Создание шаблона](#Создание-шаблона)
- [О файлах примерах](#О-файлах-примерах)
- [О версиях Ansible](#О-версиях-ansible)
- [Структура данных](#Структура-данных)
- [Списки](#Списки)
- [Словари (Хеш таблицы)](#Словари-Хеш-таблицы)
- [Списки словарей](#Списки-словарей)
- [Словари словарей](#Словари-словарей)
- [Циклы](#Циклы)
- [with_items](#with_items)
- [С простыми списками](#С-простыми-списками)
- [with_dict](#with_dict)
- [Полезные ссылки](#Полезные-ссылки)
- [Благодарности](#Благодарности)
## Создание шаблона
ВМ создаются из существующего шаблона. При этом, необходимо, чтобы шаблон был с поддержкой cloudinit. Здесь возможны 2 варианта, создать такой шаблон самостоятельно или скачать готовый образ.
Я подготовил скрипт, который скачивает официальный образ Ubuntu с поддержкой cloudinit и на основании этого образа создаётся шаблон.
Скрипт `create_template.sh` необходимо скопировать на хост Proxmox, добавить права на исполнение.
Стоит обратить внимание на объявленные в скрипте переменные:
*скачиваемый образ и его URL*
```
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 # хранилище, в котором будет размещен диск шаблона
px_bridge=vmbr1 # имя сетевого интерфейса к которому будет подключен шаблон
```
**необходимо изменить значения переменных на свои**
Скрипт необходимо запустить от имени пользователя, который может создавать и редактировать ВМ (по-умолчанию это `root`). При запуске нужно придумать и указать пароль, который будет добавлен для авторизации пользователя, указанного в переменной `vm_user`
Пример запуска скрипта
```bash
root@pve:~# ./create_template.sh verySecPassword
```
**Результатом работы скрипта будет созданный шаблон, из которого с помощью ansible-playbook будут созданы ВМ**

View File

@ -1,18 +1,7 @@
pve_node: 192.168.13.9
pve_user: root@pam
pve_password: KatIrina1
pve_template_name: ubuntu-2004-cloudinit-template
pve_template_id: 200
pve_storage: local-lvm
vm_name: test_serv_1
vm_id: 201
vm_user: da2001
vm_passwd: 131181
vm_ip: 192.168.13.201
vm_mask: 24
vm_gw: 192.168.13.1
vm_dns: 192.168.13.1
vm_net_intf: vmbr0
ssh_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCyeWFbxRchbB7Z3Z+iKyWHww+TuJqREzMIlreZmqFVYKAnNaWnkpsG9SHeAkJgDcT/BTeksaUTol+hx26iKX1ZduLgif+Rq0IX2Mog1E2FxAqzmqHaSxVLNB5ni83bC4v+kWwEDRaTTNcgbnMwGFxTMC/vQLWjkNvHF5y6pdyTqw+kX046bf3MjVmDbj6Ueeg/c/8pqfkt+pg0lCPz7ZyMf3Jqf6uiIYxp+lPyWilTjsY8SLrk2Huxn9Qb0H26i5lM0nQaC2oatgxPaPyqkISH+uROKbQZ7CF6RBfpjiYSyRA6JdNsBqB0ZAZG0oAuwKOqk4bWYMAGslZsIbG91TGqPUroWTwhtsiaaFKNjf6QpROZfUqdY2ahNF5QEIXX2JFE61kOQzUcs4eCzcDAAUTCYmgcPhjQNYOc5G5KKeedMdx4a1S3mxf2UfLDPpM7RM2+XpbSQi6o7RZtPbjC9hKqTAk42q3jl71HqLlUEnrLlJgcGrSAKtVU43LqYkGdae8= da2001@da-metrotek
api_host: 192.168.13.9
api_user: root@pam
api_password: KatIrina1
node: pve
clone_vm: ubuntu-2004-cloudinit-template
key_name: id_rsa.pub

19
vms.yaml Normal file
View File

@ -0,0 +1,19 @@
vms:
us1:
name: us10.da2001.ru
ip: 192.168.10.21/24
gw: 192.168.10.9
dns: 8.8.8.8
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