Привет Хабр! Я опубликовал уже три части из цикла статей (раз, два, три), а тут часть 0, как снег на голову. Как же так? Всё дело в том, что виртуализация является опциональной при построении нашего хостинга. Эта статья — самодостаточна, она не связана с другими частями из цикла. Вы вообще можете их не читать, если просто хотите разделить ваш выделенный сервер на несколько виртуальных машин.
Всё что я буду рассказывать может выполнить обычный программист в течение 5 минут, просто запустив набор сценариев для Ansible, которые я подготовил специально для вас и выложил на GitHub.
Содержание
- Часть 0: Виртуализация
- Часть 1: Ansible, Docker, Docker Swarm
- Часть 2: Service Discovery
- Часть 3: Consul, Registrator, Consul-Template
- ...
Подготовка
Скачиваем набор сценариев или клонируем репозиторий:
» git clone https://github.com/vkozlovski/ansible-virtualization
» git checkout v1.x
» cd ansible-virtualization
На этом подготовительные работы можно считать законченными.
Ах да, чуть не забыл, вам понадобится как минимум один выделенный сервер с авторизацией по ключу.
Конфигурация
Конфигурацию мы будем выполнять на примере Hetzner. Все конфигурационные файлы, которые мы будем редактировать, находятся в директории host_vars:
- dc16-host1-vm1.yml – конфигурация виртуальной машины №1
- dc16-host1-vm2.yml – конфигурация виртуальной машины №2
- ..
- dc16-host1.yml – конфигурация хостовой машины
В нашем примере мы создаём 6 виртуальных машин, ровно столько одиночных IP адресов на один сервер может выдать Hetzner. Давайте разберём, что тут у нас в конфигурационных файлах:
dc16-host1.yml
Конфигурация хостовой машины:
# Host 1
ansible_ssh_host: 5.9.45.106 # IPv4 адрес хостовой машины
ansible_ssh_user: root # Пользователь хостовой машины
# net
vm_bridge: virbr0
ipv4: true
ipv4_address: 5.9.45.106/27 # IPv4 адрес и маска хостовой машины
ipv4_gateway: 5.9.45.97 # IPv4 шлюз хостовой машины
ipv4_dns: 213.133.100.100 213.133.98.98 213.133.99.99 # Hetzner IPv4 DNS
ipv6: true
ipv6_address: 2a01:4f8:163:326a::2 # IPv6 адрес хостовой машины
ipv6_mask: 64
ipv6_gateway: fe80::1 # IPv6 шлюз хостовой машины
ipv6_dns: 2a01:4f8:0:a0a1::add:1010 2a01:4f8:0:a102::add:9999 2a01:4f8:0:a111::add:9898 # Hetzner IPv6 DNS
# apt
apt_host: ftp.de.debian.org
Hetzner присылает IPv4 и IPv6 адреса в письме при заказе сервера. Остальные значения переменных вы можете глянуть в личном кабинете. IPv4 и IPv6 адреса DNS-серверов я взял в wiki Hetzner'а.
dc16-host1-vm1.yml
Конфигурация виртуальной машины №1:
# Debian 1
# kvm-host
ansible_ssh_host: 5.9.45.106 # IP адрес хостовой (не гостевой) машины
ansible_ssh_user: root # Пользователь хостовой (не гостевой) машины
# vnc (port: 5900)
vnc_password: "kBz4Yp3UyVEPMr" # Пароль для подключения к VNC серверу
# vm
vm_num: 1 # uniq 0-15
vm_name: debian1 # Уникальное название виртуальной машины
vm_hdd_size: 10G # Диск 10 гигабайт
vm_memory: 2048 # Память в мегабайтах
vm_swap_size: 2048 # Размер файла подкачки в мегабайтах
vm_cpu: 2 # Количество ядер
vm_bridge: virbr0
vm_root_password: "3yMAqs3yTcuKvZ" # Пароль для root пользователя виртуальной машины
# net
vm_ipv4: true
vm_ipv4_address: 5.9.244.210 # IPv4 адрес гостевой машины
vm_ipv4_mask: 29
vm_ipv4_gateway: 5.9.244.209 # IPv4 шлюз гостевой машины
vm_ipv4_dns: 213.133.98.98 213.133.99.99 213.133.100.100 # Hetzner IPv4 DNS
vm_ipv6: true
vm_ipv6_address: 2a01:4f8:163:326a::d1 # IPv6 адрес гостевой машины
vm_ipv6_mask: 64
vm_ipv6_gateway: fe80::1 # IPv6 шлюз гостевой машины
vm_ipv6_dns: 2a01:4f8:0:a0a1::add:1010 2a01:4f8:0:a102::add:9999 2a01:4f8:0:a111::add:9898 # Hetzner IPv6 DNS
vm_mac: 00:52:54:56:88:88
Значения переменных vm_ipv4_address, vm_ipv4_mask и vm_ipv4_gateway Hetzner присылает при заказе дополнительного IP-адреса. IPv4 и IPv6 адреса DNS-серверов такие же, как и у хостовой машины. Дополнительный IPv4 адрес вы можете заказать в личном кабинете. Hetzner просит указывать цель, для которой вам нужен дополнительный адрес, я пишу туда одно слово – «Virtualization».
По поводу IPv6: каждый сервер получает подсеть /64. Соответственно вы можете взять любые адреса из неё. Например для 2a01:4f8:163:326a:: / 64:
- 2a01:4f8:163:326a::d1
- 2a01:4f8:163:326a::d2
- ...
- 2a01:4f8:163:326a::d6
Что бы указать значение переменной vm_mac, вам необходимо получить отдельный MAC-адрес для указанного IP. Это можно сделать в личном кабинете.
На этом всё, можно приступать к запуску.
Запуск
Запуск производится двумя командами. Первая устанавливает необходимые пакеты и конфигурирует хостовую машину:
$ ansible-playbook -i prod kvm.yml
Вторая команда создаёт, конфигурирует и запускает виртуальные машины:
$ ansible-playbook -i prod guests.yml
После запуска и выполнения этих двух команд ваши виртуальные машины должны быть запущены и доступны снаружи. Ваш публичный ключ был скопирован на все виртуалки, поэтому авторизация будет происходить по ключу.
Итого
Мы используем этот набор сценариев довольно долго и всё отрабатывает как положено. Это значительно упростило жизнь и позволило быстро добавлять новые вычислительные ресурсы в наше скромное облако. Если у вас возникнут какие-либо вопросы – добро пожаловать в комментарии.
На этом всё. Всем спасибо за внимание. Стабильных вам облаков и удачи!
Подписывайтесь на меня в Twitter, я рассказываю о работе в стартапе, своих ошибках и правильных решениях, о python и всём, что касается веб-разработки.
P.S. Я ищу разработчиков в компанию, подробности у меня в профиле.