如何在特定的流浪主机上运行ansible playbook
我有一个创建3台服务器的文件。我有两本游戏书。playbook1应该首先在每台服务器上执行。第二个playbook2只能在服务器1上执行,而不能在服务器2和服务器3上执行 我如何用我的文件管理这个如何在特定的流浪主机上运行ansible playbook,ansible,vagrant,vagrantfile,Ansible,Vagrant,Vagrantfile,我有一个创建3台服务器的文件。我有两本游戏书。playbook1应该首先在每台服务器上执行。第二个playbook2只能在服务器1上执行,而不能在服务器2和服务器3上执行 我如何用我的文件管理这个 Vagrant.configure("2") do |config| config.vm.box = "ubuntu/bionic64" config.vm.define "server1" do |server1| // end config.vm.define "se
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/bionic64"
config.vm.define "server1" do |server1|
//
end
config.vm.define "server2" do |server2|
//
end
config.vm.define "server3" do |server3|
//
end
config.vm.provision "ansible" do |ansible|
ansible.playbook = "playbook1.yml"
end
end
上述命令在所有服务器上执行playbook1。如何为playbook2.yml添加配置,使其仅在server1上和playbook1之后执行?鉴于您的示例文件和理论playbook2.yml仅在server1上playbook1.yml之后的server2上执行,我们将得出以下解决方案:
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/bionic64"
config.vm.define "server1" do |server1|
//
# restrict scope of ansible provisioner to server1 by invoking on its class method off the constructor
server1.vm.provision :ansible do |ansible|
ansible.playbook = 'playbook1.yml'
end
end
config.vm.define "server2" do |server2|
//
# perform similarly for server2, which executes after server1 provisioning due to the imperative ruby dsl
server2.vm.provision :ansible do |ansible|
ansible.playbook = 'playbook2.yml'
end
end
config.vm.define "server3" do |server3|
//
end
end
还值得注意的是,如果您想精确地进行订购,可以先漫游服务器1,然后再漫游服务器2,而不是一个多功能漫游服务器
基本上,在Vagrant.configure中有一个作用域影响config.vm中的所有vm。您可以通过像上面一样使用config.vm.define进行实例化,将其范围限制在特定的vm上。使用config.vm.define实例化的对象vm具有与基本配置相同的成员/属性
注意:如果需要,您也可以这样做:
Vagrant.configure('2') do |config|
...
(1..3).each do |i|
config.vm.define "server#{i}" do |server|
//
server.vm.provision :ansible do |ansible|
ansible.playbook = "playbook#{i}.yml"
end
end
end
end
针对每台服务器的特定剧本。这取决于//中的具体内容,尽管特定于每个虚拟机,如果您希望为第三个虚拟机提供第三个剧本。鉴于您的示例文件和您的理论剧本2.yml仅在server1上的playbook1.yml之后在server2上执行,我们将得出以下解决方案:
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/bionic64"
config.vm.define "server1" do |server1|
//
# restrict scope of ansible provisioner to server1 by invoking on its class method off the constructor
server1.vm.provision :ansible do |ansible|
ansible.playbook = 'playbook1.yml'
end
end
config.vm.define "server2" do |server2|
//
# perform similarly for server2, which executes after server1 provisioning due to the imperative ruby dsl
server2.vm.provision :ansible do |ansible|
ansible.playbook = 'playbook2.yml'
end
end
config.vm.define "server3" do |server3|
//
end
end
还值得注意的是,如果您想精确地进行订购,可以先漫游服务器1,然后再漫游服务器2,而不是一个多功能漫游服务器
基本上,在Vagrant.configure中有一个作用域影响config.vm中的所有vm。您可以通过像上面一样使用config.vm.define进行实例化,将其范围限制在特定的vm上。使用config.vm.define实例化的对象vm具有与基本配置相同的成员/属性
注意:如果需要,您也可以这样做:
Vagrant.configure('2') do |config|
...
(1..3).each do |i|
config.vm.define "server#{i}" do |server|
//
server.vm.provision :ansible do |ansible|
ansible.playbook = "playbook#{i}.yml"
end
end
end
end
针对每台服务器的特定剧本。这取决于//中的具体内容,尽管特定于每个虚拟机,并且如果您希望为第三个虚拟机提供第三个playbook。以下示例将首先在每个服务器上执行playbook1.yml,然后仅在服务器1上执行playbook2.yml。此示例假设playbook1.yml可以并行化:
# -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
N = 3
(1..N).each do |server_id|
config.vm.define "server#{server_id}" do |server|
server.vm.box = "ubuntu/bionic64"
server.vm.hostname = "server#{server_id}"
server.vm.network "private_network", ip: "172.28.128.25#{server_id}"
server.vm.provision :shell, inline: "sudo apt install -y python"
# only execute once the ansible provisioner,
# when all the machines are up and ready.
if server_id == N
server.vm.provision :ansible do |ansible|
# disable default limit to connect to all the machines
# execute playbook1 on all hosts
ansible.limit = "all"
ansible.playbook = "playbook1.yml"
ansible.compatibility_mode = "2.0"
end
server.vm.provision :ansible do |ansible|
# limit the connection to server1 and execute playbook2
ansible.limit = "server1"
ansible.playbook = "playbook2.yml"
ansible.compatibility_mode = "2.0"
end
end
end
end
end
此示例建立在中提供的示例之上,ansible playbook是并行的,两个ansible playbook的范围都受到ansible.limit配置选项的限制,例如,一个流浪者将首先启动虚拟机,然后针对所有主机或主机子集逐个执行playbook
注意:ubuntu/bionic64 virtualbox,20190131.0.0安装了/usr/bin/python3,为了复制粘贴示例和使用动态资源清册,我特意保留了server.vm.provision:shell,内联:示例中的sudo apt install-y python,这样ansible playbook 2.7.6就不会出现/bin/sh:1:/usr/bin/python:not found\r\n errors ref。示例playbook1.yml和playbook2.yml与文件位于同一目录中:
结果:
以下示例将首先在每台服务器上执行playbook1.yml,然后仅在服务器1上执行playbook2.yml。此示例假设playbook1.yml可以并行化:
# -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
N = 3
(1..N).each do |server_id|
config.vm.define "server#{server_id}" do |server|
server.vm.box = "ubuntu/bionic64"
server.vm.hostname = "server#{server_id}"
server.vm.network "private_network", ip: "172.28.128.25#{server_id}"
server.vm.provision :shell, inline: "sudo apt install -y python"
# only execute once the ansible provisioner,
# when all the machines are up and ready.
if server_id == N
server.vm.provision :ansible do |ansible|
# disable default limit to connect to all the machines
# execute playbook1 on all hosts
ansible.limit = "all"
ansible.playbook = "playbook1.yml"
ansible.compatibility_mode = "2.0"
end
server.vm.provision :ansible do |ansible|
# limit the connection to server1 and execute playbook2
ansible.limit = "server1"
ansible.playbook = "playbook2.yml"
ansible.compatibility_mode = "2.0"
end
end
end
end
end
此示例建立在中提供的示例之上,ansible playbook是并行的,两个ansible playbook的范围都受到ansible.limit配置选项的限制,例如,一个流浪者将首先启动虚拟机,然后针对所有主机或主机子集逐个执行playbook
注意:ubuntu/bionic64 virtualbox,20190131.0.0安装了/usr/bin/python3,为了复制粘贴示例和使用动态资源清册,我特意保留了server.vm.provision:shell,内联:示例中的sudo apt install-y python,这样ansible playbook 2.7.6就不会出现/bin/sh:1:/usr/bin/python:not found\r\n errors ref。示例playbook1.yml和playbook2.yml与文件位于同一目录中:
结果:
是否符合您所述的要求,例如,应首先在每台服务器上执行playbook1。第二个playbook2应该只在服务器1上执行,还是因为您接受的解决方案导致playbook1在服务器1上执行而不是在服务器2或服务器3上执行,playbook2在服务器2上执行而不是在服务器1或服务器3上执行?这些要求是否如您所述,例如,playbook1应该首先在每台服务器上执行。第二个playbook2应该只在服务器1上执行,还是因为您接受的解决方案导致playbook1在服务器1上而不是在服务器2或服务器3上执行,playbook2在服务器2上而不是在服务器1或服务器3上执行,所以我错过了什么?