Vagrant. Возможности Vagrantfile

vagrantfileВ предыдущей статье шла речь о создании и первом запуске своего собственного vagrant образа (box-a). Теперь пришло время познакомиться с возможностями Vagrantfile. Это файл в котором описывается базовая конфигурация виртуальной площадки. Принцип работы весьма прост – есть глобальный файл в котором нужно прописать все нужные настройки для виртуальных машин (hostname, RAM, shared folders, etc.) используя vagrant синтаксис и API нужного провайдера.

Лучший способ знакомства – это практика. Предположим, что нам нужно поднять тестовую площадку из 2-х серверов приложений (СП) и 2-х серверов баз данных(СБД). Для СП нужно выделить по 2000 ГБ RAM и для СБД по 1000ГБ но с двумя HDD по 10ГБ. В данном случаи Vagrantfile будет выглядеть следующим образом.

PS D:\vagrant_test> cat .\Vagrantfile
# Префикс для LAN сети
BRIDGE_NET="192.168.1."
# Префикс для Internal сети
INTERNAL_NET="192.168.15."
# Домен который будем использовать для всей площадки
DOMAIN="sample.com"
# Массив из хешей, в котором заданы настройки для каждой виртуальной машины
servers=[
  {
    :hostname => "app1." + DOMAIN,
    :ip => BRIDGE_NET + "150",
	:ip_int => "1",
	:ram => 2000
  },
  {
    :hostname => "app2." + DOMAIN,
    :ip => BRIDGE_NET + "151",
	:ip_int => "2",
	:ram => 2000
  },
  {
    :hostname => "db1." + DOMAIN,
    :ip => BRIDGE_NET + "152",
	:ip_int => "3",
	:ram => 1000,
	:hdd_name => "db1_hdd.vdi",
	:hdd_size => "10000"
  },
  {
    :hostname => "db2." + DOMAIN,
    :ip => BRIDGE_NET + "153",
	:ip_int => "4",
	:ram => 1000,
	:hdd_name => "db2_hdd.vdi",
	:hdd_size => "10000"
  }
]

# Входим в Главную конфигурацию vagrant версии 2
Vagrant.configure(2) do |config|
	# Добавить шару между хостовой и гостевой машиной
	#config.vm.synced_folder "D://hostmachine/shared/folder", "/src/shara"
	# Отключить дефолтную шару
	config.vm.synced_folder ".", "/vagrant", disabled: true
	# Проходим по элементах массива "servers"
	servers.each do |machine|
		# Применяем конфигурации для каждой машины. Имя машины(как ее будет видно в Vbox GUI) находится в переменной "machine[:hostname]"
		config.vm.define machine[:hostname] do |node|
			# Поднять машину из образа "ubuntu 14.04", который мы создали в предыдущей статье
			node.vm.box = "ubuntu 14.04"
			# Также, можно указать URL откуда стянуть нужный box если такой есть
			#node.vm.box_url = "http://files.vagrantup.com/precise64.box"
			# Пул портов, который будет использоваться для подключения к каждый VM через 127.0.0.1
			node.vm.usable_port_range = (2200..2250)
			# Hostname который будет присвоен VM (самой ОС)
			node.vm.hostname = machine[:hostname]
			#VBoxManage.exe list bridgedifs overwrite NAT adapter :adapter=>1
			# Добавление и настройка Bridge сетевого адаптера(моста). Чтобы узнать точное название birdge адаптера, нужно использовать VBoxManage.exe (смотрите ниже)
			node.vm.network "public_network", ip: machine[:ip], bridge: 'Intel(R) Centrino(R) Wireless-N 130'
			# Добавление и настройка внутреннего сетевого адаптера (Intnet)
			node.vm.network "private_network", ip: machine[:ip_int], virtualbox__intnet: "intnet"
			# Настройка SSH доступа
			# Домен/IP для подключения
			#node.ssh.host = machine[:ip]
			# Для доступа по ранее добавленному ключу
			#node.ssh.private_key_path = "private_key"
			# SSH логин пользователя
			# node.ssh.username = "alex"
			# SSH пароль
			node.ssh.password = "vagrant"
			# Тонкие настройки для конкретного провайдера (в нашем случаи - VBoxManage)
			node.vm.provider "virtualbox" do |vb|
				# Размер RAM памяти
				vb.customize ["modifyvm", :id, "--memory", machine[:ram]]
				# Можно перезаписать название VM в Vbox GUI
				vb.name = machine[:hostname]
				# Добавление жесткого диска, если такой указан в конфигурации
				if (!machine[:hdd_name].nil?)
					# Не создавать диск, если он уже существует
					unless File.exist?(machine[:hdd_name])
						vb.customize ["createhd", "--filename", machine[:hdd_name], "--size", machine[:hdd_size]]
					end
					# Подключить созданный диск к поточной VM
					vb.customize ["storageattach", :id, "--storagectl", "SATA", "--port", 1, "--device", 0, "--type", "hdd", "--medium", machine[:hdd_name]]
				end
				# Где хранить snapshot
				#vb.customize ["modifyvm", :id, "--snapshotfolder", "D:\\test"]
				# Еще один способ сменить название VM в Vbox GUI
				#vb.customize ["modifyvm", :id, "--name", "Gangnam Style"]
			end
		end
	end
end

В этот конфигурационный файл я постарался вместить побольше информации с комментариями и различными способами управления Vagrant настройками. Это наиболее употребляемые опции. Для определения имени birdge адаптера нужно использовать VBoxManage.exe.

PS C:\Program Files\Oracle\VirtualBox> .\VBoxManage.exe list bridgedifs
Name:            Intel(R) Centrino(R) Wireless-N 130
GUID:            50eecb81-e9b2-4411-9a10-67f138f83fcf
DHCP:            Enabled
IPAddress:       192.168.1.249
NetworkMask:     255.255.255.0
IPV6Address:     fe80:0000:0000:0000:884a:0681:3262:a3a3
IPV6NetworkMaskPrefixLength: 64
HardwareAddress: b8:03:05:84:3a:d2
MediumType:      Ethernet
Status:          Up
VBoxNetworkName: HostInterfaceNetworking-Intel(R) Centrino(R) Wireless-N 130

Name:            TAP-Windows Adapter V9
GUID:            c2ec121c-b51b-43af-bde1-a7bae6d97962
DHCP:            Enabled
IPAddress:       169.254.230.192
NetworkMask:     15.0.0.0
IPV6Address:     fe80:0000:0000:0000:0cd1:0d91:4ac1:e6c0
IPV6NetworkMaskPrefixLength: 64
HardwareAddress: 00:ff:c2:ec:12:1c
MediumType:      Ethernet
Status:          Down
VBoxNetworkName: HostInterfaceNetworking-TAP-Windows Adapter V9

Name:            Bluetooth Device (Personal Area Network)
GUID:            3c129c13-9c7b-4c69-8f4b-223e35854147
DHCP:            Enabled
IPAddress:       169.254.183.86
NetworkMask:     15.0.0.0
IPV6Address:     fe80:0000:0000:0000:f0fd:9fe3:f823:b756
IPV6NetworkMaskPrefixLength: 64
HardwareAddress: b8:03:05:84:3a:d6
MediumType:      Ethernet
Status:          Down
VBoxNetworkName: HostInterfaceNetworking-Bluetooth Device (Personal Area Network)

Name:            Realtek PCIe GBE Family Controller
GUID:            ee765d67-2248-4025-aebc-7d50163b2055
DHCP:            Enabled
IPAddress:       169.254.255.132
NetworkMask:     15.0.0.0
IPV6Address:     fe80:0000:0000:0000:a5c9:7661:0827:ff84
IPV6NetworkMaskPrefixLength: 64
HardwareAddress: e8:03:9a:a4:92:f0
MediumType:      Ethernet
Status:          Down
VBoxNetworkName: HostInterfaceNetworking-Realtek PCIe GBE Family Controller

Name:            Kerio Virtual Network Adapter
GUID:            ff3d916a-da5b-4eeb-bbcf-cdbe9a4af947
DHCP:            Enabled
IPAddress:       169.254.202.41
NetworkMask:     255.255.0.0
IPV6Address:     fe80:0000:0000:0000:39ca:96e6:c038:ca29
IPV6NetworkMaskPrefixLength: 64
HardwareAddress: 44:45:53:54:4f:53
MediumType:      Ethernet
Status:          Up
VBoxNetworkName: HostInterfaceNetworking-Kerio Virtual Network Adapter

Здесь Name – это имя адаптера, которое нужно прописать в Vagrantfile.
Теперь можно поднять тестовую площадку.

PS D:\vagrant_test> vagrant up
Bringing machine 'app1.sample.com' up with 'virtualbox' provider...
Bringing machine 'app2.sample.com' up with 'virtualbox' provider...
Bringing machine 'db1.sample.com' up with 'virtualbox' provider...
Bringing machine 'db2.sample.com' up with 'virtualbox' provider...
==> app1.sample.com: Clearing any previously set forwarded ports...
==> app1.sample.com: Clearing any previously set network interfaces...
==> app1.sample.com: Preparing network interfaces based on configuration...
    app1.sample.com: Adapter 1: nat
    app1.sample.com: Adapter 2: bridged
    app1.sample.com: Adapter 3: intnet
==> app1.sample.com: Forwarding ports...
    app1.sample.com: 22 => 2222 (adapter 1)
==> app1.sample.com: Running 'pre-boot' VM customizations...
==> app1.sample.com: Booting VM...
==> app1.sample.com: Waiting for machine to boot. This may take a few minutes...
    app1.sample.com: SSH address: 127.0.0.1:2222
    app1.sample.com: SSH username: vagrant
    app1.sample.com: SSH auth method: password
    app1.sample.com: Warning: Connection timeout. Retrying...
    app1.sample.com: Warning: Remote connection disconnect. Retrying...
==> app1.sample.com: Machine booted and ready!
==> app1.sample.com: Checking for guest additions in VM...
==> app1.sample.com: Setting hostname...
==> app1.sample.com: Configuring and enabling network interfaces...
==> app1.sample.com: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> app1.sample.com: flag to force provisioning. Provisioners marked to run always will still run.
==> app2.sample.com: Clearing any previously set forwarded ports...
==> app2.sample.com: Fixed port collision for 22 => 2222. Now on port 2200.
==> app2.sample.com: Clearing any previously set network interfaces...
==> app2.sample.com: Preparing network interfaces based on configuration...
    app2.sample.com: Adapter 1: nat
    app2.sample.com: Adapter 2: bridged
    app2.sample.com: Adapter 3: intnet
==> app2.sample.com: Forwarding ports...
    app2.sample.com: 22 => 2200 (adapter 1)
==> app2.sample.com: Running 'pre-boot' VM customizations...
==> app2.sample.com: Booting VM...
==> app2.sample.com: Waiting for machine to boot. This may take a few minutes...
    app2.sample.com: SSH address: 127.0.0.1:2200
    app2.sample.com: SSH username: vagrant
    app2.sample.com: SSH auth method: password
    app2.sample.com: Warning: Connection timeout. Retrying...
==> app2.sample.com: Machine booted and ready!
==> app2.sample.com: Checking for guest additions in VM...
==> app2.sample.com: Setting hostname...
==> app2.sample.com: Configuring and enabling network interfaces...
==> app2.sample.com: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> app2.sample.com: flag to force provisioning. Provisioners marked to run always will still run.
==> db1.sample.com: Clearing any previously set forwarded ports...
==> db1.sample.com: Fixed port collision for 22 => 2222. Now on port 2201.
==> db1.sample.com: Clearing any previously set network interfaces...
==> db1.sample.com: Preparing network interfaces based on configuration...
    db1.sample.com: Adapter 1: nat
    db1.sample.com: Adapter 2: bridged
    db1.sample.com: Adapter 3: intnet
==> db1.sample.com: Forwarding ports...
    db1.sample.com: 22 => 2201 (adapter 1)
==> db1.sample.com: Running 'pre-boot' VM customizations...
==> db1.sample.com: Booting VM...
==> db1.sample.com: Waiting for machine to boot. This may take a few minutes...
    db1.sample.com: SSH address: 127.0.0.1:2201
    db1.sample.com: SSH username: vagrant
    db1.sample.com: SSH auth method: password
    db1.sample.com: Warning: Connection timeout. Retrying...
==> db1.sample.com: Machine booted and ready!
==> db1.sample.com: Checking for guest additions in VM...
==> db1.sample.com: Setting hostname...
==> db1.sample.com: Configuring and enabling network interfaces...
==> db1.sample.com: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> db1.sample.com: flag to force provisioning. Provisioners marked to run always will still run.
==> db2.sample.com: Clearing any previously set forwarded ports...
==> db2.sample.com: Fixed port collision for 22 => 2222. Now on port 2202.
==> db2.sample.com: Clearing any previously set network interfaces...
==> db2.sample.com: Preparing network interfaces based on configuration...
    db2.sample.com: Adapter 1: nat
    db2.sample.com: Adapter 2: bridged
    db2.sample.com: Adapter 3: intnet
==> db2.sample.com: Forwarding ports...
    db2.sample.com: 22 => 2202 (adapter 1)
==> db2.sample.com: Running 'pre-boot' VM customizations...
==> db2.sample.com: Booting VM...
==> db2.sample.com: Waiting for machine to boot. This may take a few minutes...
    db2.sample.com: SSH address: 127.0.0.1:2202
    db2.sample.com: SSH username: vagrant
    db2.sample.com: SSH auth method: password
    db2.sample.com: Warning: Connection timeout. Retrying...
==> db2.sample.com: Machine booted and ready!
==> db2.sample.com: Checking for guest additions in VM...
==> db2.sample.com: Setting hostname...
==> db2.sample.com: Configuring and enabling network interfaces...
==> db2.sample.com: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> db2.sample.com: flag to force provisioning. Provisioners marked to run always will still run.

Площадка поднята. Можно проверить SSH доступ к каждой из машин, чтобы проверить размер RAM и наличие дополнительных дисков.

root@app1:~# free -m | egrep -o 'Mem:\s+[0-9]+'
Mem:           1860

root@app2:~# free -m | egrep -o 'Mem:\s+[0-9]+'
Mem:           1860

root@db1:~# free -m | egrep -o 'Mem:\s+[0-9]+'
Mem:           930
root@db1:~# fdisk -l | egrep 'Disk /'
Disk /dev/sdb doesn't contain a valid partition table
Disk /dev/sda: 8589 MB, 8589934592 bytes
Disk /dev/sdb: 10.5 GB, 10537418240 bytes

root@db2:~# free -m | egrep -o 'Mem:\s+[0-9]+'
Mem:           930
root@db2:~# fdisk -l | egrep 'Disk /'
Disk /dev/sdb doesn't contain a valid partition table
Disk /dev/sda: 8589 MB, 8589934592 bytes
Disk /dev/sdb: 10.5 GB, 10537418240 bytes

Также, у нас в локальной папке создались два диска, размер которых будет расти до 10ГБ.

PS D:\vagrant_test> ls

    Directory: PS D:\vagrant_test>

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        11/16/2015   9:44 PM            .vagrant
-a---        11/17/2015   9:03 PM    2097152 db1_hdd.vdi
-a---        11/17/2015   9:03 PM    2097152 db2_hdd.vdi
-a---        11/17/2015   8:47 PM       2910 Vagrantfile

Если вам нужно добавить CD-ROM, CPU и т.п. просто открывайте страницу с настройками VBoxManage и смотрите опции. На этом все.

Автор: admin, 18 ноября 2015
Рубрики: Системы виртуализации
Метки:

Написать комментарий

Последние статьи

Яндекс.Метрика
?>