Vagrant Сравнение версий

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
wiki:vagrant [2016/07/25 20:54]
[Provisioning with shell]
wiki:vagrant [2016/08/26 22:44] (текущий)
[Provisioning with Puppet]
Строка 6: Строка 6:
 ===== Установка vagrant + VirtualBox===== ===== Установка vagrant + VirtualBox=====
 Устанавливать будем с официального сайта, скачав подходящие deb-пакеты. Устанавливать будем с официального сайта, скачав подходящие deb-пакеты.
-При этом нужно учесть,​ что последняя версия vagrant(1.8.4) **НЕ** поддерживает последнюю версию VirtualBox(5.1.0). 
  
 [[http://​download.virtualbox.org/​virtualbox/​5.0.24/​virtualbox-5.0_5.0.24-108355~Ubuntu~trusty_amd64.deb|ссылка на х64 версию VirtualBox для 14.04]] [[http://​download.virtualbox.org/​virtualbox/​5.0.24/​virtualbox-5.0_5.0.24-108355~Ubuntu~trusty_amd64.deb|ссылка на х64 версию VirtualBox для 14.04]]
Строка 162: Строка 161:
 и адрес назначится автоматически. и адрес назначится автоматически.
  
-больше информации ​и приватных сетях+больше информации ​о приватных сетях
 [[https://​www.vagrantup.com/​docs/​networking/​private_network.html|тут]] [[https://​www.vagrantup.com/​docs/​networking/​private_network.html|тут]]
  
Строка 248: Строка 247:
  
 ===== Синхронизация каталогов===== ===== Синхронизация каталогов=====
-"Из коробки"​ vagrant синхронизирует каталог хоста с Vagrantfile в директорию /vagrant +"Из коробки"​ vagrant синхронизирует каталог хоста с Vagrantfile в директорию /vagrant виртуальной машины.
-виртуальной машины.+
  
-Для того, чтоб указать дополнительный каталоги для синхронизации,​ нужно добавить +Для того, чтоб указать дополнительный каталоги для синхронизации,​ нужно добавить следующую строку в Vagrantfile:​
-следующую строку в Vagrantfile:​+
 <​code>​ <​code>​
 config.vm.synced_folder "​src/",​ "/​var/​www/​html" ​ config.vm.synced_folder "​src/",​ "/​var/​www/​html" ​
Строка 258: Строка 255:
  
 Первым указывается путь на хосте, вторым - гостевой путь. Первым указывается путь на хосте, вторым - гостевой путь.
-Если на хостовой машине указывать относительный путь, то корневым будет каталог +Если на хостовой машине указывать относительный путь, то корневым будет каталог с Vagrantfile.
-с Vagrantfile.+
  
 Если абсолютный путь, то он абсолютный :) Если абсолютный путь, то он абсолютный :)
  
-Путь на гостевой машине должен быть *только* абсолютный.+Путь на гостевой машине должен быть ​**только** абсолютный.
 Если директорий не существует,​ они будут созданы рекурсивно. Если директорий не существует,​ они будут созданы рекурсивно.
  
 Дополнительные опции: Дополнительные опции:
-  * **disabled** - если указать True, то синхронизация будет отключена. Удобно,​ если +  * **disabled** - если указать True, то синхронизация будет отключена. Удобно,​ если нам не нужна "​изкоробочная"​ синхронизация. 
-нам не нужна "​изкоробочная"​ синхронизация. +  * **mount_options** - дополнительные параметры,​ которые будут переданы команде mount при монтировании
-  * **mount_options** - дополнительные параметры,​ которые будут переданы команде +
-    ​mount при монтировании+
   *  **type** - полезная опция, которая позволяет выбрать тип синхронизации. Доступны следующие варианты:​   *  **type** - полезная опция, которая позволяет выбрать тип синхронизации. Доступны следующие варианты:​
     * NFS     * NFS
Строка 280: Строка 274:
 <note important>​ тип NFS доступен только для Linux-host!</​note>​ <note important>​ тип NFS доступен только для Linux-host!</​note>​
  
-Если эта поция не указана,​ то vagrant выберет сам ​самую ​подходящую.+Если эта поция не указана,​ то vagrant выберет сам подходящую.
  
-Я рекомендую для Linux-гостей использовать rsync - этот тип //не// требует +Я рекомендую для Linux-гостей использовать rsync - этот тип //не// требует дополнений гостевых систем,​ автоматически установить rsync на всех гостей. 
-дополнений гостевых систем,​ автоматически установить rsync на всех гостей. +Также, доступны дополнительные плюшки,​ такие как vagrant rsync и vagrant rsync-auto ( о них ниже)
-Также, доступны дополнительные плюшки,​ такие как vagrant rsync и vagrant +
-rsync-auto ( о них ниже)+
   * **id** - имя, которое будет показываться при команде mount в гостевой   * **id** - имя, которое будет показываться при команде mount в гостевой
     машине. Имеет смысл использовать,​ если у вас несколько расшареных каталогов     машине. Имеет смысл использовать,​ если у вас несколько расшареных каталогов
Строка 292: Строка 284:
 ==Рассмотрим подробнее вариант rsync== ==Рассмотрим подробнее вариант rsync==
 Первое - этот тип **работает** только **в одну сторону** Первое - этот тип **работает** только **в одну сторону**
-Каталоги,​ которые синхронизированы через rsync синхронизируются автоматически +Каталоги,​ которые синхронизированы через rsync синхронизируются автоматически только один раз - при инициализации машины (vagrant up\vagrant reload).
-только один раз - при инициализации машины (vagrant up\vagrant reload).+
 Принудительно синхронизировать можно двумя путями:​ Принудительно синхронизировать можно двумя путями:​
   - vagrant rsync   - vagrant rsync
Строка 304: Строка 295:
 reload. </​note>​ reload. </​note>​
  
-Второй же работает в режиме демона и отслеживает изменения на хосте. +Второй же работает в режиме демона и отслеживает изменения на хосте. Это удобно,​ так как один каталог можно шарить на несколько машин сразу, передавая изменения на всех гостей.
-Это удобно,​ так как один каталог можно шарить на несколько машин сразу, +
-передавая изменения на всех гостей.+
  
 <note important>​Если вы хотите сделать изменения в Vagrantfile,​ для начали <note important>​Если вы хотите сделать изменения в Vagrantfile,​ для начали
Строка 405: Строка 394:
 ===== Конфигурирование нескольких машин===== ===== Конфигурирование нескольких машин=====
  
-В одном Vagrantfile может быть столько мащин, сколько нам нужно.+В одном Vagrantfile может быть столько машин, сколько нам нужно.
 Задать их можно двумя способами:​ Задать их можно двумя способами:​
   * Используя цикл   * Используя цикл
-  * Отдельно задавая каждую мащину+  * Отдельно задавая каждую машину
  
 Очевидно,​ что циклом удобно поднимать машины,​ которые буду отличаться только Очевидно,​ что циклом удобно поднимать машины,​ которые буду отличаться только
Строка 712: Строка 701:
 использования (мастер-агент,​ без мастера,​ запуск локально). использования (мастер-агент,​ без мастера,​ запуск локально).
  
 +Автоматически provision запускается только в двух случаях:​
 +
 +vagrant up и vagrant reload. Если вы хотите запустить подготовку машин
 +принудительно,​ то необхожимо это явно указать. Например:​
 +
 +<​code>​
 +vagrant resume --provision %machine_name
 +</​code>​
 +
 +<​code>​
 +vagrant provision %machine_name
 +</​code>​
  
 Рассмотрим самый простой вариант - shell. Рассмотрим самый простой вариант - shell.
Строка 843: Строка 844:
 Если же у вас скрипт необходимо запустить из определённой директории внутри Если же у вас скрипт необходимо запустить из определённой директории внутри
 гостевой машины,​ vagrant позволяет делать и это. гостевой машины,​ vagrant позволяет делать и это.
 +Необходимо лищь указать необходимую директорию командой **upload_path.**
  
 +====Provisioning with Ansible====
 +
 +<note important>​ Тут не будет рассматриваться работа непосредстваенно Ansible,
 +рассматривается взаимодействие vagrant и Ansible! </​note>​
 +
 +Если вы не знакомы с Ansible, то рекомендую,​ для начала прочесть [[Ansible
 +|вот эту]] статью.
 +
 +При необходимости создать полноценное окружение разработчика,​ или если нужно
 +развернуть СУБД и БД из дампа, то более целесообразно использовать более мощные
 +инструменты.
 +Одним из таких инструментов является Ansible.
 +
 +Чтобы применить Ansible через vagrant необходимо сделать следующее:​
 +  * на хостовой машине должен быть установлен Ansible
 +  * прописать в Vagrantfile ((В этом разделе листинги взяты с официального сайта vagrant)) примерно следующее:​
 +<​code>​
 +Vagrant.configure("​2"​) do |config|
 +
 +  #
 +  # Run Ansible from the Vagrant Host
 +  #
 +  config.vm.provision "​ansible"​ do |ansible|
 +    ansible.playbook = "​playbook.yml"​
 +  end
 +
 +end
 +</​code>​
 +
 +При этом, Playbook.yml должен находиться в одном каталоге с Vagrantfile.
 +После того, как машина будет поднята,​ vagrant запустит Ansible.
 +
 +
 +Так как сам по себе Ansible не требует никакого агента на целевой машине (ноде),
 +то всё, что нужно сделать - указать верные данные в инвентори-файле.
 +Если используется публичная сеть, то указываем ip ноды, если используется
 +приватная сеть, то необходимо указать ip локалхоста (обычно 127.0.0.1) и порт.
 +
 +Для Ansible имеется достаточно много опций, узнать их можно на
 +[[https://​www.vagrantup.com/​docs/​provisioning/​ansible_common.htmlё|странице
 +официальной документации vagrant]]
 +
 +Помимо того, что можно запускать Ansible с хоста, его можно также запускать и в
 +самой гостевой мащине. Называется это [[https://​www.vagrantup.com/​docs/​provisioning/​ansible_local.html|Ansible local]].
 +
 +Преимущество в том, что нет необходимости устанавливать Ansible на хост. Вы
 +можете просто загрузить роль с вашего репозитория или с Ansible galaxy и она
 +выполнится.
 +
 +Недостатки - на каждую машину необходимо устанавливать Ansible (есть хук, о нём ниже), отсутствие централизованного управления. То есть, если в дальнейшем будет необходимость управлять машинами посредством Ansible, то этот метод не для вас.
 +
 +
 +По-умолчанию,​ vagrant попробует сам установить Ansible на гостувую машину,​ для этот предусмтрено несколько опций:
 +
 +**install_mode** - по-факту,​ это выбор репозитория,​ откуда будет устанавливаться
 +Ansible. Если оставить значение __default__,​ то будет выбран:​
 +
 +  -ppa:​ansible/​ansible - для гостя Ubuntu + family
 +  -EPEL - RedHat-family
 +  -main repo - Debian, OpenSuse, FreeBSD, Arch, etc.
 +
 +Есть другое значение - pip. Тогда установка будет производиться посредтсвом pip.
 +vagrant сначала установит pip на гостя, а затем установит Ansible.
 +
 +Этот вариант предпочтительней,​ так как это гарантирует,​ что версия будет свежая
 +и одинаковая для всех нод.
 +
 +Часть Vagrantfile,​ которая отвечает ​ за Ansible local практически ничем не
 +отличается от обычного Ansible:
 +
 +<​code>​
 +Vagrant.configure("​2"​) do |config|
 +  config.vm.provision "​ansible_local"​ do |ansible|
 +    ansible.playbook = "​playbook.yml"​
 +  end
 +end
 +</​code>​
 +
 +
 +Подробнее о хуке, а именно о том, как использовать Ansible local для создания полноценной инфраструктуры. С помощью одного Vagrantfile можно создать ноды, которые будут разворачиваться Ansible, который установлен в виртуальной машине.
 +
 +Всё, что нужно сделать вам - написать Vagrantfile,​ роли для Ansible с inventory
 +и немного подправить конфигурацию Ansible.
 +
 +Разберём всё подробнее.
 +
 +Vagrantfile:​
 +
 +<​code>​
 +Vagrant.configure("​2"​) do |config|
 +
 +  config.vm.box = "​ubuntu/​trusty64"​
 +
 +  config.vm.define "​node1"​ do |machine|
 +    machine.vm.network "​private_network",​ ip: "​172.17.177.21"​
 +  end
 +
 +  config.vm.define "​node2"​ do |machine|
 +    machine.vm.network "​private_network",​ ip: "​172.17.177.22"​
 +  end
 +
 +  config.vm.define '​controller'​ do |machine|
 +    machine.vm.network "​private_network",​ ip: "​172.17.177.11"​
 +
 +    machine.vm.provision :​ansible_local do |ansible|
 +      ansible.playbook ​      = "​example.yml"​
 +      ansible.verbose ​       = true
 +      ansible.install ​       = true
 +      ansible.limit ​         = "​all"​
 +      ansible.inventory_path = "​inventory"​
 +    end
 +  end
 +
 +end
 +
 +</​code> ​
 +
 +Создаём две машины - node1 и node2. Это будут машины,​ которые мы будем
 +конфигурировать с помощью Ansible, который установим на третью машину -
 +controller.
 +
 +vagrant сам установит на нужную машину Ansible. Что нам нужно - так это сделать
 +нормальный инвентори файл, в котором будут указаны ip адреса наших нод.
 +
 +Вот пример для этого файла:
 +
 +
 +<​code>​
 +controller ansible_connection=local
 +node1      ansible_ssh_host=172.17.177.21 ansible_ssh_private_key_file=/​vagrant/​.vagrant/​machines/​node1/​virtualbox/​private_key
 +node2      ansible_ssh_host=172.17.177.22 ansible_ssh_private_key_file=/​vagrant/​.vagrant/​machines/​node2/​virtualbox/​private_key
 +</​code> ​
 +
 +И этот файлик положим в директорию с Vagrantfile,​ в корень.
 +
 +Последний штрих - нам необходимо создать свой файл Ansible.cfg. В нём мы укажем,​
 +некоторые опции для ssh-коннекта,​ а именно - подключаться ко всем хостам без
 +подтверждения
 +
 +<​code>​
 +[defaults]
 +host_key_checking = no
 +
 +[ssh_connection]
 +ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o UserKnownHostsFile=/​dev/​null -o IdentitiesOnly=yes
 +
 +</​code>​
 +
 +Всё, можно делать vagrant up и смотреть,​ как создаётся окружение.
 +
 +====Provisioning with Puppet====
 +
 +<note important>​ Тут не будет рассматриваться работа непосредстваенно Puppet,
 +рассматривается взаимодействие vagrant и Puppet! </​note>​
 +
 +Для тех, кто привык использовать [[https://​puppet.com/​|Puppet]],​ есть возможность использовать этот
 +инструмент с vagrant.
 +
 +Для этого нам нужна следующая структура Vagrantfile:​
 +<​code>​
 + ​config.vm.provider "​virtualbox"​ do |vb|
 +     ​vb.gui = false
 +     ​vb.memory=256
 +     ​vb.cpus=1
 +     ​vb.check_guest_additions=false
 + ​config.vm.box="​puppetlabs/​centos-7.2-64-puppet"​
 +end
 + ​config.vm.define "​node1"​ do |n1|
 +   ​n1.vm.network "​private_network",​ ip: "​192.168.0.101"​
 +   ​n1.vm.network "​forwarded_port",​ guest: 80, host: 8081
 +   ​n1.vm.hostname ="​node1"​
 + end
 +</​code>​
 +Основное изменение,​ которое отличает vagrant и Puppet, от vagrant и Ansible -
 +vagrant **не** может сам установить Puppet в гостя, поэтому строкой
 +<​code>​
 +config.vm.box="​puppetlabs/​centos-7.2-64-puppet"​
 +</​code>​
 +Мы сказали,​ что в качестве основы для гостя необходимо использовать специальный,​
 +официальный дистрибутив от команды Puppet, в котором уже будет присутствовать
 +агент.
 <​note>​ <​note>​
-Дописать аплоад,​ ансибл, ​докер, паппет.+докер, паппет.
 </​note>​ </​note>​