
У меня есть файл конфигурации Vagrant с тремя настроенными в нем виртуальными машинами. Все они идентичны, за исключением того, что у одной из них статический IP, а у двух других — DHCP. Две машины, которым назначены IP-адреса DHCP, могут общаться друг с другом без каких-либо проблем, но с той, у которой статический IP, другие не могут связаться.
Другими словами ping client0
-> client1
работает
пинг client1
-> client0
работает
пинг client1
-> server
не
Это мой Vagrantfile:
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "precise64"
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
config.vm.provision "chef_solo" do |chef|
chef.cookbooks_path = "provision/cookbooks"
chef.add_recipe "apt"
chef.add_recipe "python"
end
config.vm.provision :shell, :path => "provision/python-modules.py"
config.vm.define :server do |server|
server.vm.hostname = "server"
server.vm.network :private_network, ip: "172.28.128.2"
end
config.vm.define :client0 do |client0|
client0.vm.hostname = "client0"
client0.vm.network :private_network, type: :dhcp
end
config.vm.define :client1 do |client1|
client1.vm.hostname = "client1"
client1.vm.network :private_network, type: :dhcp
end
end
Есть идеи, как сделать так, чтобы server
машина была доступна другим по статическому IP? Я использую провайдера virtualbox.
решение1
После обширных исследований и экспериментов выяснилось, что Vagrant назначал каждой виртуальной машине отдельную подмаску, поэтому они не могли подключиться друг к другу. По сути, они все находились в разных сетях.
Оказывается, вы можете это переопределить. Чтобы сделать это, просто настройте сетевую маску для одного из них, как показано ниже.
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "precise64"
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
config.vm.provision "chef_solo" do |chef|
chef.cookbooks_path = "provision/cookbooks"
chef.add_recipe "apt"
chef.add_recipe "python"
end
config.vm.provision :shell, :path => "provision/python-modules.py"
config.vm.define :server do |server|
server.vm.hostname = "server"
server.vm.network :private_network, ip: "172.28.128.2", :netmask => "255.255.0.0"
end
config.vm.define :client0 do |client0|
client0.vm.hostname = "client0"
client0.vm.network :private_network, type: :dhcp, :netmask => "255.255.0.0"
end
config.vm.define :client1 do |client1|
client1.vm.hostname = "client1"
client1.vm.network :private_network, type: :dhcp, :netmask => "255.255.0.0"
end
end
На данный момент я не уверен, можно ли переопределить сетевую маску для всех в глобальной конфигурации, при этом сохраняя некоторые виртуальные машины с DHCP, а другие со статическим IP. Я поэкспериментирую с этим, как только вернусь на более мощную машину, так что уничтожение и создание виртуальной машины каждый раз будет быстрее.
решение2
Вы также можете сделать что-то вроде ниже, если вы предоставляете несколько виртуальных машин с помощью DHCP. В разделе необязательных виртуальных машин вы можете упомянуть/назвать несколько требуемых виртуальных машин.
# -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = '2'
DOMAIN = '.example.com'
PUPPETMASTER_HOSTNAME = 'puppet' + DOMAIN
#Requires box with puppetlabs repo setup, but puppet not installed
DEFAULT_BOX = 'precise64'
DEFAULT_BOX_URL = 'http://files.vagrantup.com/precise64.box'
REQUIRED_HOSTS = [
'puppetdb',
'puppetdb-postgres'
]
OPTIONAL_HOSTS = [
'ldap01',
'ldap02'
]
HOSTS = REQUIRED_HOSTS + OPTIONAL_HOSTS
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
#VBox config to avoid mac address collisions
config.vm.provider :virtualbox do |vb|
vb.customize ['modifyvm', :id, '--natnet1', '10.200/16']
#vb.gui = true
end
config.vm.box = DEFAULT_BOX
config.vm.box_url = DEFAULT_BOX_URL
#Add network interface
config.vm.network :private_network, :type => :dhcp, :netmask => '255.255.0.0'
#Defines puppet master
config.vm.define :puppet_master do |puppetmaster|
puppetmaster.vm.hostname = PUPPETMASTER_HOSTNAME
puppetmaster.vm.synced_folder '../puppet/', '/vagrant_sync/puppet', :create => true
puppetmaster.vm.provision :shell, :path => 'scripts/bootstrap_puppetmaster.sh'
end
HOSTS.each do |host_name, opts|
config.vm.define host_name do |box|
fqdn = host_name + DOMAIN
box.vm.hostname = fqdn
box.vm.provision :shell, :inline => 'yum install -y puppet'
box.vm.provision :puppet_server do |puppet|
puppet.puppet_server = PUPPETMASTER_HOSTNAME
end
end
end
end