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