Vagrant: operação do Provisionador de Shell em um ambiente com várias máquinas

0

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.

    
por Karl Vietmeier 05.07.2018 / 23:55

2 respostas

0

Isso impede que o script bootscrap.sh seja executado várias vezes:

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

Ainda não consigo descobrir como fazer com que eles parem de ser executados. Acho que entendo por que eles serão processados todas as vezes, mas não tenho certeza de como pará-lo. Eles precisam ser executados apenas para a VM que está sendo configurada e após os scripts de autoinicialização. Eu não posso ser a única pessoa que já quis fazer isso, eu simplesmente não consigo encontrá-lo documentado em lugar algum.

  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
    
por 06.07.2018 / 00:46
0

Solução final:

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

Eu tenho um arquivo "servers.yml" que adicionei outra propriedade da VM para "script". Eu apenas chamo explicitamente em script.path.

Tudo está funcionando perfeitamente agora e meu Vagrantfile está atualizado.

    
por 06.07.2018 / 01:58

Tags