Showing posts with label vagrant. Show all posts
Showing posts with label vagrant. Show all posts

Monday, 25 April 2022

Vagrantfile features.


Всем привет.

Уверен что вы с VirtualBox командную строку используете намного реже чем GUI. Но есть одна причина не пользоваться ни тем ни другим - это Vagrant.  Vagrant этакая надстройка для виртуальных провайдеров 2-го уровня, которая позволяет автоматизировать многие  повторяющиеся процессы по развертыванию виртуалок. Все описание процесса создания ВМ определенной конфигурации попадает в единый файл Vagrantfile. Полное его описание не последует в рамках данного поста, а последуют его фишки которые мне понравились от одного умного автора.

Например, чтобы сказать что: 

- мы хотим развернуть виртуальную машину из образа, имя которого задается переменной окружения 'box_name',  

- при этом следует проигнорировать Vagrantfile, включенный в состав этого образа как файл по умолчанию,

- машина в этом образе относится к классу Linux,

- по завершении запуска машины нужно вывести в консоль сообщение "Machine started".

Тогда следует в Vagrantfile написать так:

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

    config.vm.box = ENV['box_name']

    config.vm.ignore_box_vagrantfile = true 

    config.vm.guest = :linux

    config.vm.post_up_message = "Machine started"

end

Можно создать отдельный раздел, определяющий какие ресурсы хостовой машины мы выделяем для гостевой машины.  Делается это через доступ к свойствам отдельных провайдеров (гипервизоров), т.е обращаемся к свойствам VirtualBox:

    config.vm.provider :virtualbox do |v, override|

         v.gui = true # Display the VirtualBox GUI when booting the machine

        v.customize ["modifyvm", :id, "--memory", ENV['ram_memory_size_mb']]

        v.customize ["modifyvm", :id, "--cpus", ENV['cpu_count']]

        v.customize ["modifyvm", :id, "--vram", 64] # Video memory 64 MB

     end

где ram_memory_size_mb и cpu_count переменные окружения.

Thursday, 10 March 2022

Vagrant с Ansible.

Всем привет. 

Допустим у нас есть десяток машин. Некоторые из них одинаковы - ноды с приложением и машины со средой для разработки. В данном случае имеет смысл использовать подготовку машин. Vagrant для этого позволяет использовать несколько решений:

  • Puppet
  • Ansible
  • Salt
  • Shell
  • Chef
  • Docker

При чём некоторые из них, например, Chef, Puppet, Salt имеют несколько вариантов использования (мастер-агент, без мастера, запуск локально).

Автоматически provision запускается только в двух случаях: vagrant up и vagrant reload. Если вы хотите запустить подготовку машин принудительно, то необхожимо это явно указать. Например:

vagrant resume --provision %machine_name%

vagrant provision %machine_name

Самый простой вариант - shell. Но сегодня мы рассмотрим вариант с Ansible.


Чтобы применить Ansible через vagrant необходимо сделать следующее:

- на хостовой машине должен быть установлен Ansible

- прописать в Vagrantfile примерно следующее:

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

  # Run Ansible from the Vagrant Host

  config.vm.provision "ansible" do |ansible|

    ansible.playbook = "playbook.yml"

  end

end

При этом, Playbook.yml должен находиться в одном каталоге с Vagrantfile. После того, как машина будет поднята, vagrant запустит Ansible. Так как сам по себе Ansible не требует никакого агента на целевой машине (ноде), то всё, что нужно сделать - указать верные данные в инвентори-файле. Если используется публичная сеть, то указываем ip ноды, если используется приватная сеть, то необходимо указать ip локалхоста (обычно 127.0.0.1) и порт. Для Ansible имеется достаточно много опций, узнать их можно на странице официальной документации vagrant. Помимо того, что можно запускать Ansible с хоста, его можно также запускать и в самой гостевой мащине. Называется это Ansible local. Преимущество в том, что нет необходимости устанавливать Ansible на хост. Вы можете просто загрузить роль с вашего репозитория или с Ansible galaxy и она выполнится. 

Недостатки - на каждую машину необходимо устанавливать Ansible, отсутствие централизованного управления. То есть, если в дальнейшем будет необходимость управлять машинами посредством Ansible, то этот метод не для вас.

По-умолчанию, vagrant попробует сам установить Ansible на гостевую машину, для этот предусмотрено несколько опций:

install_mode - по факту, это выбор репозитория, откуда будет устанавливаться Ansible. Если оставить значение default, то будет выбран:

1.ppa:ansible/ansible - для гостя Ubuntu + family

2.EPEL - RedHat-family

3.main repo - Debian, OpenSuse, FreeBSD, Arch, etc.

Есть другое значение - pip. Тогда установка будет производиться посредтсвом pip. vagrant сначала установит pip на гостя, а затем установит Ansible. Этот вариант предпочтительней, так как это гарантирует, что версия будет свежая и одинаковая для всех нод. Часть Vagrantfile, которая отвечает за Ansible local практически ничем не отличается от обычного Ansible:

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

  config.vm.provision "ansible_local" do |ansible|

    ansible.playbook = "playbook.yml"

  end

end

Wednesday, 18 November 2020

Vagrant и proxy.


Всем привет.

Используя vagrant в своей DevOps-практике я столкнулся с проблемой его работы через прокси. Установив версию vagrant 2.2.10 я попытался добавить бокс alpine-сборки Linux:

vagrant box add generic/alpine38

На что получил ошибку resolving-а в отношении портала vagrant. Тогда я по подсказке самого портала прописал в моем окружении переменные для vagrant:

set http_proxy=http://UserName01:password10@proxy2.forza.com:9090

set VAGRANT_HTTP_PROXY=%http_proxy%

set VAGRANT_HTTPS_PROXY=%http_proxy%

set VAGRANT_NO_PROXY="127.0.0.1"


И попробовал добавить бокс alpine-сборки еще раз. Увы, ошибка resolving-а повторилась.

Тогда я переключил vagrant в режим отладки:

VAGRANT_LOG=info vagrant up

vagrant up --debug &> vagrant.log


И получил вот такую вот строку в конце продолжительного журнала vagrant.log:

C:/HashiCorp/Vagrant/embedded/mingw64/lib/ruby/2.6.0/net/http/response.rb:122:in 

`error!': 407 "authenticationrequired" (Net::HTTPServerException)


Что говорит о том что моему vagrant-у нужна авторизация для того чтобы пробиться в интернет.

В одной из веток портала я нашел информацию что для работы vagrant через проски может помочь плагин vagrant-proxyconf. Для его использвания достаточно указать в своем vagrantfile следующее: 

  config.vm.box = "alpine/latest"

  if Vagrant.has_plugin?("vagrant-proxyconf")

     config.proxy.http     = "http://UserName01:password10@proxy2.forza.com:9090"

     config.proxy.https    = "http://UserName01:password10@proxy2.forza.com:9090"

     config.proxy.no_proxy = "localhost,127.0.0.1,.example.com"

  end


Замечательно. "Наконец то решение!" решил я. И поспешил его установить.

Я пробовал так:

vagrant plugin install vagrant-proxyconf

И так:

vagrant plugin install --plugin-clean-sources --plugin-source https://rubygems.org vagrant-proxyconf

И даже так:

vagrant plugin install C:\HashiCorp\Vagrant\vagrant-proxyconf-2.0.10.gem


Меня ждало разочарование. Оказалось чтобы установить проски-плагин vagrant требует все тот же прокси. Круг замкнулся. Попытка решить мою проблему через issue с разработчиком к результату не привела.

Возможно вы знаете ответ?



Версия на печать

Популярное