如何在特定的流浪主机上运行ansible playbook

如何在特定的流浪主机上运行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

我有一个创建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 "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上执行,所以我错过了什么?