Eu estou construindo um ambiente multi-máquina e estou confuso sobre o comportamento que estou vendo como o Vagrantfile é processado.
Meu objetivo:
Crie um número n de máquinas virtuais com 3 funções diferentes. Todas as n VMs usarão um script "bootstrap.sh" comum, em seguida, cada função executará outro script com base no hostname / role.
O Vagrantfile está aqui:
Vagrantfile
Todas as partes / seções individuais funcionam, os scripts são executados e os discos extras são criados nas VMs corretas e no número correto. O que estou tentando entender é por que o provisionador "in-line" se comporta de maneira diferente para garantir que os scripts específicos da função sejam executados no momento correto.
Primeira pergunta - por que esse código é executado apenas uma vez?
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
Mas isso é executado uma vez para cada elemento no hash que foi analisado? Então, para a primeira VM no hash, "admin" tudo funciona corretamente. Mas nas iterações subseqüentes, ele é executado uma vez para cada elemento precedente? Então, pela sexta VM, ela está sendo executada seis vezes.
config.vm.provision :shell, :path => "../../scripts/bash/config/bootstrap.sh"
O mesmo para estes:
# - 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
Eu suspeito que não estou conseguindo encaixar algum princípio básico aqui. Olhei por toda a internet, cheguei até a beira da internet e não consegui encontrar uma boa explicação.