В предыдущей статье шла речь о создании и первом запуске своего собственного 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 и смотрите опции. На этом все.