代码之家  ›  专栏  ›  技术社区  ›  DenCowboy

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

  •  1
  • DenCowboy  · 技术社区  · 7 年前

    我有一个创建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之后执行?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Matthew Schuchard    7 年前

    以你为例 Vagrantfile 你的理论 playbook2.yml 仅在上执行 server2 playbook1.yml 在…上 server1

    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
    

    同样值得注意的是,如果你想精确的订购,你可以 vagrant up server1 然后 vagrant up server2 vagrant up .

    Vagrant.configure 有一个作用域影响范围内的所有VM config.vm . 通过使用实例化,可以将其范围限制为特定VM config.vm.define 就像你在上面做的那样。使用 config.vm.define 具有与基础相同的成员/属性 config .

    注意:如果需要,您也可以这样做:

    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
    

    针对每台服务器的特定剧本。这取决于你的内心到底是什么 // 虽然特定于每个VM,并且如果您想要第三个VM的第三个剧本。

        2
  •  2
  •   masseyb    7 年前

    将执行以下示例 playbook1.yml 在每台服务器上首先执行 playbook2.yml 仅在server1上(此示例假定 可以并行化):

    # -*- 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
    

    此示例构建在中提供的示例之上 Tips and Tricks 这个 ansible-playbook 的是并行的,两者的作用域都是并行的 ansible-playbooks 的值受 ansible.limit 配置选项(例如a vagrant up 将首先启动虚拟机,然后针对所有主机或主机子集逐个执行剧本)。

    笔记 字体 ubuntu/bionic64 (virtualbox, 20190131.0.0) 盒子里有 /usr/bin/python3 安装,以便获得副本&粘贴示例,为了使用动态库存,我特意保留了 server.vm.provision :shell, inline: "sudo apt install -y python" 在这个例子中是这样的 ansible-playbook (2.7.6) 不会用炸弹爆炸 "/bin/sh: 1: /usr/bin/python: not found\r\n 错误(参考。 How do I handle python not having a Python interpreter at /usr/bin/python on a remote machine? ).举例 playbook1.yml playbook2.yml Vagrantfile ):

    ---
    
    - hosts: all
      tasks:
      - debug: 
          msg: 'executing on {{ inventory_hostname }}'
    

    结果: enter image description here

    推荐文章