Как запустить сборник рассказов на конкретном бродячем хосте - PullRequest
0 голосов
/ 31 января 2019

У меня есть Vagrantfile, который создает 3 сервера.У меня есть две сборники пьес.playbook1 должен выполняться на каждом сервере в первую очередь.Вторая playbook2 должна выполняться только на сервере server1, а не на сервере server2 и server3.

Как я могу управлять этим с помощью моего Vagrantfile?

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 ]

0 голосов
/ 01 февраля 2019

В следующем примере сначала будет выполняться playbook1.yml на каждом сервере, а затем playbook2.yml только на сервере server1 (в этом примере предполагается, что 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-playbooks ограничена параметром конфигурации ansible.limit (например, 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 (ссылка Как мне обращаться с pythonне имеете интерпретатора Python на / usr / bin / python на удаленной машине? ).Пример playbook1.yml и playbook2.yml (присутствует в том же каталоге, что и Vagrantfile):

---

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

Результат: enter image description here

0 голосов
/ 01 февраля 2019

Учитывая ваш пример 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 есть область действиявлияет на все виртуальные машины в пределах config.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

для каждого-сервер конкретный playbook.Это зависит от того, что именно находится в вашем //, хотя и для каждой виртуальной машины, и от того, нужна ли вам третья книга воспроизведения для третьей виртуальной машины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...