Свой облачный хостинг за 5 минут. Часть 0: Виртуализация



    Привет Хабр! Я опубликовал уже три части из цикла статей (раз, два, три), а тут часть 0, как снег на голову. Как же так? Всё дело в том, что виртуализация является опциональной при построении нашего хостинга. Эта статья — самодостаточна, она не связана с другими частями из цикла. Вы вообще можете их не читать, если просто хотите разделить ваш выделенный сервер на несколько виртуальных машин.

    Всё что я буду рассказывать может выполнить обычный программист в течение 5 минут, просто запустив набор сценариев для Ansible, которые я подготовил специально для вас и выложил на GitHub.

    Содержание



    Подготовка


    Скачиваем набор сценариев или клонируем репозиторий:

    » 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. Я ищу разработчиков в компанию, подробности у меня в профиле.

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 2

      0
      Зачем вы создаете ansible.cfg, в котором единственное значение hostfile = prod?
      Достаточно именовать файл с хостами, как hosts. В остальном — все хорошо.
        0
        У меня там больше переменных:

        ask_sudo_pass=True
        remote_user = support
        private_key_file=...

        Я удалил их, когда заливал на GitHub, потому что это касается только моей конфигурации. Если у кого-нибудь появится необходимость добавить несколько параметров, он просто допишет их в готовый файл.

      Only users with full accounts can post comments. Log in, please.