Vagrant#

Vagrant относится к инструментам для создания ВМ и объединения их в инфрастуктуру в некотором виртуальном окружении, используя такие известные технологии, как VMware, VirtualBox и AWS. К такому виртуальному окружению относится, например, сервер с установленной на нем одной из упомянутых систем виртуализации.

Vagrant предоставляет развитый API, необходимый для автоматизации развертывания систем. Следуя парадигме IAC, указания для Vagrant создают в файле Vagrantfile в виде директив, объединенных в общий поток последовательных действий.

Применение#

Приложение Vagrant удобно использовать для отладки развертывания пилотной инфраструктуры в локальной среде. Типовая последовательность использования Vagrant состоит из следующих шагов:

  1. Создание и отладка потока управляющих директив на локальном узле с помощью VMware или VirtualBox.

  2. Перенос полученного потока в производственную среду на базе облачных технологий или на собственные серверы.

В этом документе рассматривается использование Vagrant совместно с VirtualBox.

Примечание

Приведенные ниже инструкции проверены в ОС Astra Linux Special Edition 1.7.4, 1.7.5 и 1.7.5uu1.

Установка#

Приведенные ниже инструкции по установке и настройке ПО предназначены для ОС Astra Linux Special Edition 1.7. Пошаговые инструкции для других ОС доступны на сайтах разработчиков соответствующего ПО:

Подготовка к установке#

Подготовьте ОС к установке и настройке Vagrant и VirtualBox.

  1. Если установка производится на ВМ, включите в ее настройках вложенную виртуализацию (nested virtualization). Для получения инструкций обратитесь к производителю ПО, используемого для виртуализации.

  2. Получите номер установленного оперативного обновления ОС:

    cat /etc/astra_version
    

    Команда выводит в терминал строку вида:

    1.7.5uu1
    
  3. Добавьте в файл /etc/apt/sources.list ссылки на базовый (base) и расширенный (extended) репозитории Astra Linux Special Edition 1.7:

    deb https://download.astralinux.ru/astra/frozen/1.7_x86-64/<version>/repository-base/     1.7_x86-64 main contrib non-free
    deb https://download.astralinux.ru/astra/frozen/1.7_x86-64/<version>/repository-extended/ 1.7_x86-64 main contrib non-free
    

    где <version> – версия установленного оперативного обновления Astra Linux Special Edition. Для примера выше указанные строки имеют вид:

    deb https://download.astralinux.ru/astra/frozen/1.7_x86-64/1.7.5/uu/1/repository-base/     1.7_x86-64 main contrib non-free
    deb https://download.astralinux.ru/astra/frozen/1.7_x86-64/1.7.5/uu/1/repository-extended/ 1.7_x86-64 main contrib non-free
    
  4. Обновите список доступных пакетов:

    sudo apt update
    
  5. Получите номер версии и вариант сборки установленного ядра:

    uname -r
    

    В терминал выводится строка вида:

    6.1.50-1-generic
    

    Здесь 6.1.50-1 – версия ядра, generic – вариант сборки.

  6. Установите менеджер загрузок wget, заголовочные файлы используемого ядра и утилиты, необходимые для сборки модулей ядра:

    sudo apt install build-essential linux-headers-<version>-<build_variant> make wget --yes
    

    где <version> и <build_variant> – версия ядра и вариант его сборки соответственно. Для примера выше нужная команда имеет вид:

    sudo apt install build-essential linux-headers-6.1.50-1-generic make wget --yes
    

    Совет

    Шаги получения информации о версии ядра и установки его заголовочных файлов можно объединить в одну команду:

    sudo apt install build-essential linux-headers-$(uname -r) make wget --yes
    

Установка VirtualBox#

Для установки VirtualBox выполните следующие действия:

  1. Загрузите пакет libvpx5 из репозиториев Debian Linux, например:

    wget http://security.debian.org/debian-security/pool/updates/main/libv/libvpx/libvpx5_1.7.0-3+deb10u2_amd64.deb
    

    Совет

    Актуальная ссылка на загрузку доступна на странице пакета: https://packages.debian.org/buster/amd64/libvpx5/download

  2. Установите загруженный пакет:

    sudo dpkg -i libvpx5_1.7.0-3+deb10u2_amd64.deb
    
  3. Импортируйте ключ репозитория VirtualBox:

    wget https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- |\
        sudo gpg --dearmor --yes --output /etc/apt/trusted.gpg.d/oracle.gpg
    
  4. Создайте в каталоге /etc/apt/sources.list.d/ файл virtualbox.list со следующим содержимым:

    deb [arch=amd64] https://download.virtualbox.org/virtualbox/debian buster contrib
    
  5. Обновите список доступных пакетов:

    sudo apt update
    
  6. Установите пакет virtualbox-7.0:

    sudo apt install virtualbox-7.0 --yes
    
  7. Получите номер установленной версии VirtualBox:

    apt policy virtualbox-7.0
    

    В терминал выводятся строки вида:

    virtualbox-7.0:
      Установлен: 7.0.16-162802~Debian~buster
      Кандидат:   7.0.16-162802~Debian~buster
      Таблица версий:
     *** 7.0.16-162802~Debian~buster 500
            500 https://download.virtualbox.org/virtualbox/debian buster/contrib amd64 Packages
            100 /var/lib/dpkg/status
    

    Здесь 7.0.16 – версия VirtualBox.

  8. Загрузите Extension Pack для установленной версии VirtualBox:

    wget https://download.virtualbox.org/virtualbox/<version>/Oracle_VM_VirtualBox_Extension_Pack-<version>.vbox-extpack
    

    где <version> – версия VirtualBox.

    Для примера выше указанная команда имеет вид:

    wget https://download.virtualbox.org/virtualbox/<version>/Oracle_VM_VirtualBox_Extension_Pack-7.0.16.vbox-extpack
    
  9. Установите Extension Pack:

    sudo vboxmanage extpack install --replace <path>
    

    где <path> – путь к загруженному ранее файлу.

    Для примера выше указанная команда имеет вид:

    sudo vboxmanage extpack install --replace ./Oracle_VM_VirtualBox_Extension_Pack-7.0.16.vbox-extpack
    

Установка Vagrant#

Для установки Vagrant выполните следующие действия:

  1. Загрузите DEB-пакет Vagrant с сайта разработчика, например:

    wget https://releases.hashicorp.com/vagrant/2.4.1/vagrant_2.4.1-1_amd64.deb
    

    Примечание

    Если сайт разработчика по какой-либо причине недоступен, используйте для загрузки зеркало репозитория:

    wget https://releases.comcloud.xyz/vagrant/2.4.1/vagrant_2.4.1-1_amd64.deb
    
  2. Установите загруженный пакет:

    sudo dpkg -i vagrant_2.4.1-1_amd64.deb
    
  3. Определите путь к каталогу, в котором хранятся расширения Vagrant:

    dpkg -L vagrant | egrep 'plugins/guests$'
    

    В терминал выводится строка вида:

    /opt/vagrant/embedded/gems/gems/vagrant-<version>/plugins/guests
    

    где <version> – номер установленной версии Vagrant.

  4. Загрузите архив с расширением для Vagrant, позволяющим ему работать с образами Astra Linux:

    wget https://dl.astralinux.ru/files/astra-vagrant.tar.gz
    
  5. Распакуйте загруженный архив в каталог с расширениями Vagrant, например:

    sudo tar xf astra-vagrant.tar.gz -C <plugins_dir>
    

    где <plugins_dir> – путь к каталогу с расширениями Vagrant.

Проверка корректности установки#

Для проверки корректности установки Vagrant и VirtualBox выполните следующие действия:

  1. В любом каталоге создайте Vagrantfile с простейшей конфигурацией ВМ:

    # frozen_string_literal: true
    
    Vagrant.configure("2") do |config|
      config.vm.box = "alse-vanilla-base/1.7.5uu1"
      config.vm.box_url = "https://dl.astralinux.ru/vagrant/alse-vanilla-base%2F1.7.5uu1"
    
      config.vm.define "VG" do |conf|
        conf.vm.hostname = "VG"
      end
    end
    

    В этом файле описана ВМ с названием VG, использующая образ с Astra Linux Special Edition 1.7.5uu1.

    Подробности об именовании и составе образов см. в документе Образы виртуальных машин.

  2. Для создания и запуска ВМ выполните команду:

    vagrant up
    
  3. Подключитесь к созданной ВМ по SSH:

    vagrant ssh
    

    При успешном подключении приглашение командной строки меняется на следующее:

    vagrant@VG:~$
    
  4. Для отключения от созданной ВМ выполните команду:

    exit
    

Подготовка инфраструктуры#

Приведенные ниже инструкции описывают типовую последовательность действий для создания инфраструктуры ВМ, управляемой с помощью Vagrant.

ВМ на локальной машине#

Для создания ВМ с установленной операционной системой Astra Linux выполните следующие действия:

  1. Создайте пару ключей SSH, используемых для подключения к ВМ:

    ssh-keygen -C "<comment>" -f ~/.ssh/deployment -N ""
    

    В результате выполнения команды в каталоге ~/.ssh/ создаются два файла, содержащие приватный (deployment) и публичный (deployment.pub) ключи SSH соответственно.

  2. Создайте файл Vagrantfile со следующим содержимым:

    # -*- frozen_string_literal: true -*-
    
    Vagrant.configure('2') do |config|
      config.vm.box = 'alse-vanilla-base/1.7.5uu1' # Название бокса
    
      # Ссылка на образ
      config.vm.box_url = 'https://dl.astralinux.ru/vagrant/alse-vanilla-base%2F1.7.5uu1'
    
      config.vm.provision 'file',
                          source: '~/.ssh/deployment.pub',
                          destination: '/home/vagrant/.ssh/id_rsa.pub'
    
      config.vm.provision 'shell',
                          inline: 'cat /home/vagrant/.ssh/id_rsa.pub >> /home/vagrant/.ssh/authorized_keys'
    
      # Настройка параметров ВМ
      config.vm.define 'host01' do |node|
        node.vm.hostname = 'host01' # Короткое имя хоста
    
        # Настройки, специфичные для VirtualBox
        node.vm.provider 'virtualbox' do |vb|
          vb.cpus = 4 # Кол-во ядер CPU
          vb.memory = 4096 # Объем RAM, МБ
        end
    
        # Параметры сети
        node.vm.network 'private_network',
                        ip: '192.168.56.11', # Статический IP-адрес
                        netmask: '255.255.255.0', # Маска подсети
                        dhcp_enabled: false # Запрет использования DHCP
      end
    end
    

    Имя бокса Vagrant задается в строке:

    config.vm.box = 'alse-vanilla-base/1.7.5uu1' # Название бокса
    

    После этого указывается ссылка на образ:

    config.vm.box_url = 'https://dl.astralinux.ru/vagrant/alse-vanilla-base%2F1.7.5uu1'
    

    Чтобы получить доступ к ВМ по SSH, необходимо в подкаталоге ~/.ssh/ нужного пользователя ВМ разместить публичный ключ SSH, а также добавить его в список доверенных ключей:

    config.vm.provision 'file',
                        source: '~/.ssh/deployment.pub',
                        destination: '/home/vagrant/.ssh/id_rsa.pub'
    
    config.vm.provision 'shell',
                        inline: 'cat /home/vagrant/.ssh/id_rsa.pub >> /home/vagrant/.ssh/authorized_keys'
    

    Короткое имя хоста (vm) задается в параметре node.vm.hostname:

    node.vm.hostname = 'vm' # Короткое имя хоста
    

    В этих строках задается количество доступных ВМ ядер CPU и МБ RAM:

    vb.cpus = 4 # Кол-во ядер CPU
    vb.memory = 4096 # Объем RAM, МБ
    

    Настройки подключения ВМ к сети:

    node.vm.network 'private_network',
                    ip: '192.168.56.11', # Статический IP-адрес
                    netmask: '255.255.255.0', # Маска подсети
                    dhcp_enabled: false # Запрет использования DHCP
    
  3. Для проверки корректности синтаксиса созданного Vagrantfile выполните команду:

    vagrant validate
    

    При отсутствии ошибок в терминал выводится строка:

    Vagrantfile validated successfully.
    

    В случае наличия ошибок исправьте их и выполните повторную проверку синтаксиса Vagrantfile.

  4. Для создания и запуска VM выполните команду:

    vagrant up
    

    Дождитесь завершения выполнения команды, это может занять некоторое время.

  5. Проверьте состояние ВМ:

    vagrant status
    

    Она должна быть активна (состояние running):

    Current machine states:
    
    vm              running (virtualbox)
    
    The VM is running. To stop this VM, you can run `vagrant halt` to
    shut it down forcefully, or you can run `vagrant suspend` to simply
    susptend the virtual machive. In either case, to restart it again,
    simply run `vagrant up`.
    

    Если в процессе создания или запуска ВМ будут выведены сообщения об ошибках, выполните следующие действия:

    1. Проверьте содержимое Vagrantfile на наличие ошибок в параметрах настройки ВМ.

    2. Удалите существующую ВМ и создайте ее заново:

      vagrant destroy --force && vagrant up
      

Инфраструктура из нескольких ВМ#

Следующий пример файла Vagrantfile демонстрирует задание на создание инфраструктуры из двух ВМ:

Содержимое файла Vagrantfile
# frozen_string_literal: true

boxes = {
  'dc01' => {
    box: 'alse-vanilla-base/1.7.5uu1',
    box_url: 'https://dl.astralinux.ru/vagrant/alse-vanilla-base%2F1.7.5uu1',
    cpu_cores: '2',
    memory: '2048',
    ipv4: '192.168.56.10'
  },
  'dc02' => {
    box: 'alse-vanilla-base/1.7.5uu1',
    box_url: 'https://dl.astralinux.ru/vagrant/alse-vanilla-base%2F1.7.5uu1',
    cpu_cores: '2',
    memory: '2048',
    ipv4: '192.168.56.11'
  }
}

Vagrant.configure(2) do |config|
  boxes.each do |hostname, cfg|
    config.vm.define hostname do |host|
      host.vm.boot_timeout = 600
      host.vm.hostname = hostname
      host.vm.box = cfg[:box]
      host.vm.box_url = cfg[:box_url]
      host.vm.provider 'virtualbox' do |v|
        v.cpus = cfg[:cpu_cores]
        v.memory = cfg[:memory]
      end
      host.vm.network 'private_network', ip: cfg[:ipv4]
    end
  end
end

Настройка состоит из двух частей:

  • Первая часть boxes задает параметры двух ВМ.

  • Вторая часть описывает создание этих ВМ с использованием параметров, заданных в структуре boxes.

Удаление ВМ и образов#

Для удаления неиспользуемых ресурсов выполните следующие действия:

  1. Определите список существующих ВМ:

    vagrant global-status
    
  2. Удалите ненужные ВМ с помощью команды:

    vagrant destroy <VM_name>
    
  3. Получите список образов, загруженных на компьютер:

    vagrant box list
    
  4. Удалите ненужные образы:

    vagrant box remove <box_name>