Различия
Здесь показаны различия между двумя версиями данной страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
|
wiki:vagrant [2016/08/01 13:20] [Provisioning with Ansible] |
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 может быть столько машин, сколько нам нужно. |
| Задать их можно двумя способами: | Задать их можно двумя способами: | ||
| * Используя цикл | * Используя цикл | ||
| - | * Отдельно задавая каждую мащину | + | * Отдельно задавая каждую машину |
| Очевидно, что циклом удобно поднимать машины, которые буду отличаться только | Очевидно, что циклом удобно поднимать машины, которые буду отличаться только | ||
| Строка 861: | Строка 850: | ||
| <note important> Тут не будет рассматриваться работа непосредстваенно Ansible, | <note important> Тут не будет рассматриваться работа непосредстваенно Ansible, | ||
| рассматривается взаимодействие vagrant и Ansible! </note> | рассматривается взаимодействие vagrant и Ansible! </note> | ||
| + | |||
| + | Если вы не знакомы с Ansible, то рекомендую, для начала прочесть [[Ansible | ||
| + | |вот эту]] статью. | ||
| При необходимости создать полноценное окружение разработчика, или если нужно | При необходимости создать полноценное окружение разработчика, или если нужно | ||
| Строка 869: | Строка 861: | ||
| Чтобы применить Ansible через vagrant необходимо сделать следующее: | Чтобы применить Ansible через vagrant необходимо сделать следующее: | ||
| * на хостовой машине должен быть установлен Ansible | * на хостовой машине должен быть установлен Ansible | ||
| - | * прописать в Vagrantfile примерно следующее: | + | * прописать в Vagrantfile ((В этом разделе листинги взяты с официального сайта vagrant)) примерно следующее: |
| <code> | <code> | ||
| Vagrant.configure("2") do |config| | Vagrant.configure("2") do |config| | ||
| Строка 903: | Строка 895: | ||
| выполнится. | выполнится. | ||
| - | Недостатки - на каждую машину необходимо устанавливать Ansible, отсутствие | + | Недостатки - на каждую машину необходимо устанавливать Ansible (есть хук, о нём ниже), отсутствие централизованного управления. То есть, если в дальнейшем будет необходимость управлять машинами посредством Ansible, то этот метод не для вас. |
| - | централизованного управления. То есть, если в | + | |
| - | дальнейшем будет необходимость управлять машинами посредством Ansible, то этот | + | |
| - | метод не для вас. | + | |
| - | По-умолчанию, vagrant попробует сам установить Ansible на гостувую машину, для | + | По-умолчанию, vagrant попробует сам установить Ansible на гостувую машину, для этот предусмтрено несколько опций: |
| - | этот предусмтрено несколько опций: | + | |
| **install_mode** - по-факту, это выбор репозитория, откуда будет устанавливаться | **install_mode** - по-факту, это выбор репозитория, откуда будет устанавливаться | ||
| Ansible. Если оставить значение __default__, то будет выбран: | Ansible. Если оставить значение __default__, то будет выбран: | ||
| - | ppa:ansible/ansible - для гостя Ubuntu + family | + | -ppa:ansible/ansible - для гостя Ubuntu + family |
| - | EPEL - RedHat-family | + | -EPEL - RedHat-family |
| - | main repo - Debian, OpenSuse, FreeBSD, Arch, etc | + | -main repo - Debian, OpenSuse, FreeBSD, Arch, etc. |
| Есть другое значение - pip. Тогда установка будет производиться посредтсвом pip. | Есть другое значение - pip. Тогда установка будет производиться посредтсвом pip. | ||
| Строка 925: | Строка 913: | ||
| и одинаковая для всех нод. | и одинаковая для всех нод. | ||
| + | Часть 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> | ||