Как использовать Vagrant с Libvirt в Linux

В этом руководстве мы рассмотрим, как использовать Vagrant с Libvirt в Linux. Vagrant — это программное обеспечение с открытым исходным кодом, написанное на Ruby, чтобы помочь вам создавать и поддерживать портативные виртуальные среды разработки программного обеспечения, например для VirtualBox, Hyper-V, контейнеров Docker, VMware, Libvirt и AWS. Vagrant упрощает создание, остановку и уничтожение виртуальных машин.

Самым популярным вариантом использования на локальных машинах является использование провайдера VirtualBox. Если вы являетесь пользователем KVM и QEMU, эта статья для вас. KVM, как известно, имеет лучшую производительность и меньшее использование ресурсов по сравнению с Virtualbox.

Vagrant с Libvirt в Linux — редварительные требования:

    • Установлен Vagrant
    • Установлены Libvirt и QEMU-KVM
    • Установка плагина libvirt для Vagrant

Установка плагина для Vagrant

После того, как вы установили Vagrant и KVM, вы должны быть готовы установить плагин libvirt, чтобы вы могли начать управлять виртуальными машинами KVM с помощью Vagrant.

Но сначала убедитесь, что установлен пакет разработки libvirt:

# CentOS/Fedora

$ sudo yum -y install libvirt-devel

$ sudo yum -y groupinstall "Development Tools"

Затем установите плагин Vagrant libvirt:

$ vagrant plugin install vagrant-libvirt

Installing the 'vagrant-libvirt' plugin. This can take a few minutes...

Building native extensions. This could take a while...

Building native extensions. This could take a while...

Installed the plugin 'vagrant-libvirt (0.0.45)'!

Если вы столкнулись с ошибкой, как показано ниже:

ERROR: Failed to build gem native extension.



current directory: /home/jmutai/.vagrant.d/gems/2.5.1/gems/nokogiri-1.8.4/ext/nokogiri

/usr/bin/ruby -r ./siteconf20180704-25314-14hvlbq.rb extconf.rb

checking if the C compiler accepts ... yes

Building nokogiri using system libraries.

pkg-config could not be used to find libxml-2.0

Please install either `pkg-config` or the pkg-config gem per

gem install pkg-config -v "~> 1.1"

 

Тогда запустите:

$ gem install nokogiri

$ vagrant plugin install pkg-config

И попробуйте установить плагин еще раз.

$ vagrant plugin install vagrant-libvirt

После завершения установки вы можете подтвердить, что плагин установлен, используя следующую команду:

$ vagrant plugin list

vagrant-libvirt (0.0.45)

Скачивание боксов Vagrant

Бокс Vagrant для Libvirt представляет собой tar-архив с 3 файлами в нем.

    • Базовый VagrantFile
    • Файл metadata.json
    • Образ в формате QCOW2

Если вы заинтересованы в создании собственных боксов Vagrant, взгляните на использование шаблонов сборки Packer и Packer для Vagrant в репозитории chef/bento на github. Это поможет вам легко начать работу.

В этом примере мы будем использовать готовый шаблон. Давайте добавим коробки CentOS 7 и CentOS 6.

$ vagrant box add centos/7 --provider=libvirt

==> box: Loading metadata for box 'centos/7'

box: URL: https://vagrantcloud.com/centos/7

==> box: Adding box 'centos/7' (v1902.01) for provider: libvirt



$ vagrant box add centos/8 --provider=libvirt

Добавьте Ubuntu 20.04 Vagrant box:

$ vagrant box add generic/ubuntu2004 --provider=libvirt

Проверьте список коробок, представленных на месте.

$ vagrant box list 

centos/7 (libvirt, 1902.01)

fedora/29-cloud-base (libvirt, 29.20181024.1)

generic/ubuntu1804 (libvirt, 1.9.8)

Создать Vagrantfile виртуальной машины

Vagrant нужен файл конфигурации для получения сведений и настроек создаваемой виртуальной машины. Создадим единый Vagrantfile виртуальной машины.

$ mkdir ~/vagrant-vms

$ cd ~/vagrant-vms

Создайте Vagrantfile с содержимым, аналогичным приведенному ниже:

# -*- mode: ruby -*-

# vi: set ft=ruby :



ENV['VAGRANT_DEFAULT_PROVIDER'] = 'libvirt'




Vagrant.configure("2") do |config|



  ##### DEFINE VM #####

  config.vm.define "cent-01" do |config|

  config.vm.hostname = "cent-01"

  config.vm.box = "centos/7"

  config.vm.box_check_update = false

  config.vm.network "private_network", ip: "192.168.18.9"

  config.vm.provider :libvirt do |v|

    v.memory = 1024

    end

  end

end

Чтобы запустить виртуальную машину, запустите:

$ vagrant up

Bringing machine 'cent-01' up with 'libvirt' provider...

==> cent-01: Creating image (snapshot of base box volume).

==> cent-01: Creating domain with the following settings...

==> cent-01: -- Name: centos-01_cent-01

==> cent-01: -- Domain type: kvm

==> cent-01: -- Cpus: 1

==> cent-01: -- Feature: acpi

==> cent-01: -- Feature: apic

==> cent-01: -- Feature: pae

==> cent-01: -- Memory: 1024M

==> cent-01: -- Management MAC:

==> cent-01: -- Loader:

==> cent-01: -- Nvram:

==> cent-01: -- Base box: centos/7

==> cent-01: -- Storage pool: default

==> cent-01: -- Image: /var/lib/libvirt/images/centos-01_cent-01.img (41G)

==> cent-01: -- Volume Cache: default

==> cent-01: -- Kernel:

==> cent-01: -- Initrd:

==> cent-01: -- Graphics Type: vnc

==> cent-01: -- Graphics Port: -1

==> cent-01: -- Graphics IP: 127.0.0.1

==> cent-01: -- Graphics Password: Not defined

==> cent-01: -- Video Type: cirrus

==> cent-01: -- Video VRAM: 9216

==> cent-01: -- Sound Type:

==> cent-01: -- Keymap: en-us

==> cent-01: -- TPM Path:

==> cent-01: -- INPUT: type=mouse, bus=ps2

==> cent-01: Creating shared folders metadata...

==> cent-01: Starting domain.

==> cent-01: Waiting for domain to get an IP address...

==> cent-01: Waiting for SSH to become available...

cent-01:

cent-01: Vagrant insecure key detected. Vagrant will automatically replace

cent-01: this with a newly generated keypair for better security.

cent-01:

cent-01: Inserting generated public key within guest...

cent-01: Removing insecure key from the guest if it's present...

cent-01: Key inserted! Disconnecting and reconnecting using new SSH key...

==> cent-01: Setting hostname...

==> cent-01: Configuring and enabling network interfaces...

cent-01: SSH address: 192.168.121.159:22

cent-01: SSH username: vagrant

cent-01: SSH auth method: private key

==> cent-01: Rsyncing folder: /home/jmutai/hacks/vagrant/labs/centos-01/ => /vagrant

Vagrant создаст мост Linux в хост-системе.

$ brctl show virbr1

bridge name	bridge id		STP enabled	interfaces

virbr1		8000.5254005351c7	yes		virbr1-nic

							vnet0



$ ip addr show dev virbr1

8: virbr1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000

    link/ether 52:54:00:53:51:c7 brd ff:ff:ff:ff:ff:ff

    inet 192.168.121.1/24 brd 192.168.121.255 scope global virbr1

       valid_lft forever preferred_lft forever

 

Запустите  virsh list,  чтобы увидеть, получите ли вы список виртуальных машин.

$ virsh list

Id Name State

-----------------------------------

3 centos-01_cent-01 running

Чтобы подключиться к виртуальной машине по ssh, используйте  команду vagrant ssh.

$ vagrant ssh

Last login: Fri Apr 19 07:40:17 2019 from 192.168.121.1



[vagrant@cent-01 ~]$ cat /etc/redhat-release

CentOS Linux release 7.6.1810 (Core)

Для вывода. ssh/config допустимый синтаксис для подключения к этой среде через ssh, запустите  команду ssh-config. Вам нужно будет поместить предоставленный вывод в каталог ~/.ssh/config в ssh.

$ vagrant ssh-config

Host cent-01

  HostName 192.168.121.159

  User vagrant

  Port 22

  UserKnownHostsFile /dev/null

  StrictHostKeyChecking no

  PasswordAuthentication no

  IdentityFile /home/jmutai/hacks/vagrant/labs/centos-01/.vagrant/machines/cent-01/libvirt/private_key

  IdentitiesOnly yes

  LogLevel FATAL

 

Чтобы перенаправить вывод в файл конфигурации ssh, используйте:

vagrant ssh-config >>~/.ssh/config

Затем используйте команду ssh для входа в систему с указанным выше именем:

$ ssh cent-01

Last login: Fri Apr 19 07:40:42 2019 from 192.168.121.1

[vagrant@cent-01 ~]$

Чтобы выключить виртуальную машину, запустите:

$ vagrant halt

==> cent-01: Halting domain…

Чтобы установить виртуальную машину в исходное состояние, очистив все данные, используйте  vagrant destroy:

$ vagrant destroy

cent-01: Are you sure you want to destroy the 'cent-01' VM? [y/N] y

==> cent-01: Removing domain…