无业游民的多机预配 [英] Vagrant multi-machine provisioning
问题描述
我正在尝试使用Ansible作为预配器在Vagrant中创建多计算机环境.
I'm trying to create multi-machine environment in Vagrant using Ansible as provisioner.
我的Vagrantfile如下所示:
My Vagrantfile looks like next:
Vagrant.configure("2") do |config|
config.vm.provision "ansible" do |ansible|
ansible.limit = "all"
ansible.playbook = "main.yml"
ansible.inventory_path = "staging"
ansible.verbose = "-vvvv"
end
config.vm.define "machine1" do |machine1|
machine1.vm.box = "ubuntu/trusty64"
machine1.vm.network "private_network", ip:"192.168.77.10"
machine1.vm.hostname = "machine1"
machine1.vm.provider :virtualbox do |vb|
vb.name = "machine1"
end
end
config.vm.define "machine2" do |machine2|
machine2.vm.box = "ubuntu/trusty64"
machine2.vm.network "private_network", ip:"192.168.77.11"
machine2.vm.hostname = "machine2"
machine2.vm.provider :virtualbox do |vb|
vb.name = "machine2"
end
end
config.vm.define "machine3" do |machine3|
machine3.vm.box = "ubuntu/trusty64"
machine3.vm.network "private_network", ip:"192.168.77.12"
machine3.vm.hostname = "machine3"
machine3.vm.provider :virtualbox do |vb|
vb.name = "machine3"
end
end
end
库存:
[AppServers]
192.168.77.10
192.168.77.11
192.168.77.12
[WebServers]
192.168.77.11
192.168.77.12
[WebLoadBalancers]
192.168.77.10
[SlaveDbServers]
192.168.77.10
192.168.77.12
[MasterDbServers]
192.168.77.11
[DbLoadBalancers]
192.168.77.11
main.yml:
- hosts: all
roles:
- Common
- ConsulServer
- ConsulAgent
- hosts: WebServers
roles:
- WebServer
- hosts: WebLoadBalancers
roles:
- LoadBalancer
- hosts: MasterDbServers
roles:
- DbServer
我想买三台机器.它们都必须包含公用软件(Consul服务器和代理,vim等).还有一些附加功能-每台机器都拥有.但是一旦我运行"vagrant up"
,仅创建的第一台计算机,预配器运行失败,因为未创建其他2台.
创建所有计算机之后,是否可以在 之后运行预配器?还是我的方法不正确,我应该以其他方式执行此操作?
谢谢您的时间.
I want to get 3 machines. All of them have to contain common soft(Consul servers and agents, vim etc). And some additional - own for each machine. But once i'm running "vagrant up"
only first machine created, provisioner runs, fails because other 2 not created.
Is it possible to run provisioner after all machines created? Or my approach is incorrect and i should perform this in other way?
Thank you for your time.
推荐答案
我遇到的第一个问题是ERROR: cannot find role in...
.我假设您具有这些角色,为简洁起见将它们排除在外.我的建议是,在测试时,请准备一本简单的 Ansible 剧本:
The first problem I had was ERROR: cannot find role in...
. I'm assuming you have these roles and excluded them for brevity. My advice here is to have a simple Ansible playbook when you are testing this:
---
- hosts: all
gather_facts: false
tasks:
- command: hostname -f
第二,当前的问题涉及静态清单文件的使用以及其中的警告.您会看到一个错误,因为 Ansible供应商在第一台计算机启动后无法运行时找不到所有主机,而其他计算机则找不到.
Secondly, the problem at hand surround the use of static inventory file and caveats therein. You are seeing an error because the Ansible provisioner is failing to find all hosts when it runs after the first machine is up but the others are not.
最后,每台计算机将具有不同的密钥,您必须传递该密钥.因此,遵循 Vagrant 的记录的方法进行多Ansible并在此解决方法的帮助下实现机器并行我建议您的 Vagrantfile 外观如下:
Lastly, each machine will have a different key, which you must pass. So, following Vagrant's documented approach for multi-machine parallelism with Ansible and with help from this work-around, here is what I recommend your Vagrantfile look like:
Vagrant.configure("2") do |config|
N = 3
VAGRANT_VM_PROVIDER = "virtualbox"
ANSIBLE_RAW_SSH_ARGS = []
(1..N-1).each do |machine_id|
ANSIBLE_RAW_SSH_ARGS << "-o IdentityFile=.vagrant/machines/machine#{machine_id}/#{VAGRANT_VM_PROVIDER}/private_key"
end
(1..N).each do |machine_id|
config.vm.define "machine#{machine_id}" do |machine|
machine.vm.box = "ubuntu/trusty64"
machine.vm.hostname = "machine#{machine_id}"
machine.vm.network "private_network", ip: "192.168.77.#{10+machine_id-1}"
# Only execute once the Ansible provisioner,
# when all the machines are up and ready.
if machine_id == N
machine.vm.provision :ansible do |ansible|
# Disable default limit to connect to all the machines
ansible.limit = "all"
ansible.playbook = "main.yml"
ansible.inventory_path = "staging"
ansible.verbose = "-v"
ansible.raw_ssh_args = ANSIBLE_RAW_SSH_ARGS
end
end
end
end
end
这篇关于无业游民的多机预配的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!