Syntax highlighting of c0f3a80 ~( devops/vagrant)

# Vagrant

[TOC]

## Refs

https://www.vagrantup.com

[Vagrantfile refs](https://www.vagrantup.com/docs/vagrantfile)


## Install

Go to [downdload page](https://www.vagrantup.com/downloads.html)

```bash
sudo apt install virtualbox
sudo dpkg -i vagrant_X_Y_Z.deb
```

## Images

[search](https://app.vagrantup.com/boxes/search)

[ubuntu all](https://app.vagrantup.com/ubuntu)

[kalilinux/rolling](https://app.vagrantup.com/kalilinux/boxes/rolling) | [kalilinux/rolling-light](https://app.vagrantup.com/kalilinux/boxes/rolling-light)

## plugins

https://github.com/devopsgroup-io/vagrant-hostmanager


## Commands

```bash
# ---	список образов
vagrant box list

# ---	состояние глабального окружения
vagrant global-status
# ---	состояние vagrant в текущем проекте
vagrant status
# --- 	запуск VM
#		при необходимости скачивается образ системы и создается VM
vagrant up
# --- 	остановка окружения
#		VM переводится в состояние poweroff
vagrant halt
# ---	приостановка окружения
#		VM "ставится на паузу", занимает доп. пространство HDD
vagrant suspend
# ---	возобновление работы приостановленной VM
vagrant resume
# ---	остановка и удаление VM, образ системы не удаляется
vagrant destroy
# ---	перезапуск VM
vagrant reload

# ---	доступ к окружению
vagrant ssh
# или
ssh -p2222 vagrant@127.0.0.1
# username: vagrant
# password: vagrant

# ---	создание образа для текущего окружения
#		box-файл создается в текущей директории
vagrant package --output my-package-name.box

# ---	добавление образа в общую директорию
#		box-файл скопируется в $VAGRANT_HOME/.vagrant.d/boxes/my-shared-package-name.box
vagrant box add my-shared-package-name my-package-name.box
```

## Recipes

### HostOnly

Для включения режима сети HostOnly запускаем VirtualBox, далее Файл -> Менеджер сетей хоста -> Создать (если нет). Запоминаем имя сети

В Vagrantfile указываем:
```ruby
config.vm.network "private_network", type: "dhcp", name: "vboxnet0" 
```
где vboxname - имя из сети.

После загрузки командой смотрим IP, например
```bash
hostname -I
```

### ssh vagrant

Конфигурация ssh клиента, при использовании которой можно подключаться через `ssh vagrant` и информация в *known_hosts* не заносится. Полезно, при пересоздании ВМ.
Используется ключ, сгенерированный при создании машины.

```bash
# --- ~/.ssh/config
HOST vagrant
	HostName 127.0.0.1
	Port 2222
	StrictHostKeyChecking no
	PasswordAuthentication no
	UserKnownHostsFile /dev/null
	IdentitiesOnly yes
	IdentityFile /home/username/path/to/project/.vagrant/machines/default/virtualbox/private_key
	LogLevel FATAL
	User vagrant
```
Альтернативно, можно использовать свой собственный ключ, который копируется в ВМ. Из конфигурации выше необходимо убрать опцию `IdentifyFile` и в Vagrantfile добавить:
```ruby
  ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip
  config.vm.provision 'shell', inline: "echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys", privileged: false
```

## troubleshooting

### VT-x is not available

Для запуска virtualbox через vagrant требуется включить в биосе "аппаратную виртуализацию".

### ERROR: could not insert 'vboxdrv': Operation not permitted

https://crazytechgo.com/modprobe-error-could-not-insert-vboxdrv-operation-not-permitted/#:~:text=The%20issue%20is%20that%20the,vboxdrv'%3A%20Operation%20not%20permitted%20.

При установке virtualbox  отображается ошибка. Т.к. процесс установки изменен, требуются дополнительные действия, связанные с MOK.
Во время установки вводится пароль. После установки необходимо перезагрузить систему и на синем экране выбрать опцию Enroll MOK -> Continue -> Yes -> Password: -> Reboot

После перезагрузки проверяем состояние сервиса
```bash
sudo systemctl status virtualbox
```