From 4175738090505279d112a0ec94422f1c601b8ab8 Mon Sep 17 00:00:00 2001 From: artemdolgiy Date: Thu, 6 Jan 2022 22:39:49 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ansible.cfg | 4 +++ create_template.sh | 23 +++++++++++--- create_vm.yaml | 74 ++++++++++++++++++++++++++++++++-------------- hosts.ini | 2 +- readme.md | 58 ++++++++++++++++++++++++++++++++++++ vars.yaml | 23 ++++---------- vms.yaml | 19 ++++++++++++ 7 files changed, 158 insertions(+), 45 deletions(-) create mode 100644 ansible.cfg create mode 100644 vms.yaml diff --git a/ansible.cfg b/ansible.cfg new file mode 100644 index 0000000..3c08e8b --- /dev/null +++ b/ansible.cfg @@ -0,0 +1,4 @@ +[defaults] +host_key_checking = false +inventory = ./hosts.ini +private_key_file = /home/da2001/.ssh/id_rsa \ No newline at end of file diff --git a/create_template.sh b/create_template.sh index 53e89cf..c119250 100644 --- a/create_template.sh +++ b/create_template.sh @@ -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 diff --git a/create_vm.yaml b/create_vm.yaml index d153b32..a59e574 100644 --- a/create_vm.yaml +++ b/create_vm.yaml @@ -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) }}" diff --git a/hosts.ini b/hosts.ini index 08a8824..77016ad 100644 --- a/hosts.ini +++ b/hosts.ini @@ -1,2 +1,2 @@ [proxmox] -pve ansible_host=192.168.13.9 +pve ansible_host=192.168.13.9 ansible_user=root diff --git a/readme.md b/readme.md index e69de29..bc5239b 100644 --- a/readme.md +++ b/readme.md @@ -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 будут созданы ВМ** + + diff --git a/vars.yaml b/vars.yaml index d36e79a..be51a11 100644 --- a/vars.yaml +++ b/vars.yaml @@ -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 diff --git a/vms.yaml b/vms.yaml new file mode 100644 index 0000000..8540c1c --- /dev/null +++ b/vms.yaml @@ -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 \ No newline at end of file