Я строю среду с несколькими машинами и ломаю голову над поведением, которое я вижу, когда обрабатывается Vagrantfile.

Моя цель: создать n виртуальных машин с 3 разными ролями. Все n виртуальных машин будут использовать общий сценарий «bootstrap.sh», тогда каждая роль будет запускать другой сценарий на основе имени хоста / роли.

Vagrantfile здесь:Vagrantfile

Все отдельные части / разделы работают, сценарии выполняются, и дополнительные диски создаются в правильных виртуальных машинах и в правильном количестве. Я пытаюсь понять, почему "встроенный" провайдер ведет себя по-разному, чтобы убедиться, что специфичные для роли скрипты выполняются в нужное время.

Первый вопрос - почему этот код выполняется только один раз?

      config.vm.provision "Setup shell environment", type: "shell" do |s|
    s.inline = <<-SHELL
      # Install some tools
      #yum install -y net-tools traceroute git ansible gcc make python > /dev/null 2>&1 
      # Add the public key
      mkdir /root/.ssh
      chmod 700 /root/.ssh
      touch /root/.ssh/authorized_keys
      echo "Appending user@Laptop keys to root and vagrant authorized_keys"
      echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys
      echo #{ssh_pub_key} >> /root/.ssh/authorized_keys
      echo "Appending AdminVM keys to root and vagrant authorized_keys"
      echo #{adminvm_karlvkey} >> /home/vagrant/.ssh/authorized_keys
      echo #{adminvm_karlvkey} >> /root/.ssh/authorized_keys
      echo #{adminvm_rootkey} >> /home/vagrant/.ssh/authorized_keys
      echo #{adminvm_rootkey} >> /root/.ssh/authorized_keys

      # Copy /etc/hosts
      #if [ -e /vagrant/files/hosts ]
      #  then sudo cat /vagrant/files/hosts >> /etc/hosts
      #elif [ -e /home/vagrant/sync/files/hosts ]
      #  then sudo cat /home/vagrant/sync/files/hosts >> /etc/hosts
      #fi     
    SHELL
  end # inline shell provisioner config.provision

Но выполнить ли это один раз для каждого элемента в хэше, который был проанализирован? Так что для первой виртуальной машины в хэше "admin" все работает правильно. Но в последующих итерациях он запускается один раз для каждого предыдущего элемента? Таким образом, к шестой виртуальной машине она работает шесть раз.

 config.vm.provision :shell, :path => "../../scripts/bash/config/bootstrap.sh"

То же самое для них:

  # - OSD Node
  if ("#{servers["name"]}").include? "osd"
    puts "I'm an OSD"
    puts servers["name"]
    config.vm.provision :shell, :path => "../../scripts/bash/ceph/osd.sh"
  end

Я подозреваю, что мне не удалось применить какой-то основной принцип. Я просмотрел весь интернет, даже дошел до края интернета и не смог найти хорошего объяснения.

2 ответа2

0

Это останавливает выполнение скрипта bootscrap.sh несколько раз:

  config.vm.provision "bootstrap", type: "shell" do |script|
     script.path = "../../scripts/bash/config/bootstrap.sh"
  end

Я до сих пор не могу понять, как заставить их остановить выполнение. Я думаю, что понимаю, почему они будут оправдываться каждый раз, просто не знаю, как это остановить. Они должны работать только для той виртуальной машины, которая была настроена, и после сценариев начальной загрузки. Я не могу быть единственным человеком, который когда-либо хотел это сделать, я просто не могу найти это нигде.

  if ("#{servers["name"]}").include? "osd"
    config.vm.provision "Configure OSD Node", type: "shell" do |script|
       script.path = "../../scripts/bash/ceph/osd.sh"
    end
  end

  # - Monitor Node
  if ("#{servers["name"]}").include? "mon"
    config.vm.provision "Configure Monitor Node", type: "shell" do |script|
       script.path = "../../scripts/bash/ceph/monitor.sh"
    end
  end

  # - Admin Node
  if ("#{servers["name"]}").include? "admin"
    config.vm.provision "Configure Admin Node", type: "shell" do |script|
       script.path = "../../scripts/bash/ceph/admin.sh"
    end
  end
0

Окончательное решение:

  ### External shell scripts for configuration
  # - Run on every node
  config.vm.provision "bootstrap", type: "shell" do |script|
     script.path = "../../scripts/bash/config/bootstrap.sh"
  end

  # Role based setup is in the servers.yml file - pull it out as a key:value
  config.vm.provision "Role", type: "shell" do |script|
     script.path = "../../scripts/bash/ceph/#{servers["script"]}"
  end

У меня есть файл "servers.yml", к которому я добавил еще одно свойство виртуальной машины, "скрипт". Я тогда просто вызываю это явно в script.path.

Теперь все работает отлично, и мой Vagrantfile обновляется.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .