我有一台多机Vagrantfile设置5节点环境。
我一直在四处寻找您对配置顺序的控制程度,但它非常有限:
https://docs.vagrantup.com/v2/multi-machine/
我想配置5个节点,然后返回到第一个节点,然后在那里运行其他配置步骤。
我的意思是你有一个像这样的Vagrant文件:
Vagrant.configure('2') do |config|
config.vm.provision some stuff
config.vm.define 'node1' do |node1|
node1.vm.provision some more stuff
end
config.vm.define 'node2' do |node2|
node2.vm.provision some other stuff
end
... node3 node4 node 5 ...
end
但是在vagrant完成启动并将所有机器配置到node5之后,我想在node1上运行另一个配置器。有谁知道如何做到这一点?也许是一些红宝石的hackery?
答案 0 :(得分:2)
如果您希望在所有计算机vagrant up
之后让其他配置程序立即自动运行,那么很遗憾到目前为止还没有办法做到这一点据我所知,Vagrant将会运行指定的所有配置程序(除非你告诉它只运行它们的一部分)。
您可以模拟的唯一方法是为每台计算机配备不同类型的配置程序,并根据需要有选择地运行它们。因此,例如,您vagrant up --provision --provision-with=shell
然后运行vagrant provision --provision-with chef_solo
以使shell配置程序先运行,然后运行chef_solo配置
但是,如果你想在所有机器启动后手动启动一个配置器,你可以使用vagrant provision
命令来完成它。
答案 1 :(得分:2)
这样做的一种可能方法是在ssh的机器之间执行命令。您需要做的唯一事情是将流浪汉不安全的私钥复制到每个访客。
然后你可以在群集中的机器之间进行ssh(总是很方便),也可以这样做:
Vagrant.configure('2') do |config|
config.vm.provision some stuff
config.vm.define 'node1' do |node1|
node1.vm.provision some more stuff
end
config.vm.define 'node2' do |node2|
node2.vm.provision "shell", inline: "/vagrant/bootstrap-webserver.sh"
node2.vm.provision "shell", inline: "ssh vagrant@node1 sh /vagrant/trigger-build.sh"
end
config.vm.define 'node3' do |node3|
node3.vm.provision "shell", inline: "/vagrant/create-database.sh"
node3.vm.provision "shell", inline: "ssh vagrant@node1 sh /vagrant/initialise-database.sh"
end
... node4 node 5 ...
end
您可能还想在guest虚拟机的sshd_config中设置“PasswordAuthentication no”,并在上面的ssh命令中添加“-o StrictHostKeyChecking = no”以使其工作。
答案 2 :(得分:1)
如果您想更轻松地使用sshpass命令而不是ssh,那么您无需担心密钥。
node3.vm.provision“shell”,内联:sshpass -pvagrant ssh -oStrictHostKeyChecking = no vagrant @ node1“sudo sh /vagrant/initialise-database.sh”
该命令假定您的虚拟框中有流浪汉用户,密码为vagrant且具有sudo访问权限。
答案 3 :(得分:1)
我认为公认的答案不是最好的方法。
您要做的是创建一个命名节点列表,并在列表中的最后一个位置完成最后的配置。
NODES = [
{ :hostname => "api1", :ip => "192.168.0.11" },
{ :hostname => "api2", :ip => "192.168.0.12" },
{ :hostname => "controller", :ip => "192.168.0.2" }
]
Vagrant.configure("2") do |config|
// Do whatever global config here
NODES.each do |node|
config.vm.define node[:hostname] do |nodeconfig|
nodeconfig.vm.hostname = node[:hostname]
// Do config that is the same across each node
if node[:hostname] == "controller"
// Do your provisioning for this machine here
else
// Do provisioning for the other machines here
end
end
end
// Do any global provisioning
end
全局设置将首先在每个节点上发生,而范围设置将紧随其后。通过将控制器放在列表的末尾,它将是最后一次运行其范围设置的控制器。您可以通过更改其列表顺序并创建条件来登台。这就是我的设置方式,以便可以将ssh密钥复制到我的节点,并且最后运行Ansible控制器。这样,剩下的机器就可以通过Ansible进行最后的配置了。