Execute o script na máquina host durante o vagrant up

35

Gostaria de executar um script bash na máquina host quando vagrant provisionar o servidor.

Qual seria o melhor método para alcançar isso?

    
por digital 14.01.2014 / 23:04

4 respostas

28

Pelo menos dois plug-ins que devem ajudar:

Se você não se importa que o script seja executado em (quase) todos os comandos vagrant , você também pode simplesmente desembolsar (ou usar qualquer mágica do ruby) no Vagrantfile:

system('./myscript.sh')

Vagrant.configure('2') do |config|
  # ...
end
    
por 03.02.2014 / 14:55
22

Solução simples (e completa)

(Eu digo completo porque a resposta aceita não verifica se o usuário está usando o vagrant up. Portanto, o script é executado em cada comando, que não é o que o OP quer.)

Existe, no entanto, uma solução simples para isso.

ARGV[0] é o primeiro argumento do comando digitado e pode ser up , down , status , etc. Basta verificar o valor de ARGV[0] no seu Vagrantfile.

Algo como isso será feito:

system("
    if [ #{ARGV[0]} = 'up' ]; then
        echo 'You are doing vagrant up and can execute your script'
        ./myscript.sh
    fi
")

Vagrant.configure('2') do |config|
  # ...
end
    
por 15.04.2015 / 16:19
8

Coloque isso perto do topo do seu Vagrantfile:

module LocalCommand
    class Config < Vagrant.plugin("2", :config)
        attr_accessor :command
    end

    class Plugin < Vagrant.plugin("2")
        name "local_shell"

        config(:local_shell, :provisioner) do
            Config
        end

        provisioner(:local_shell) do
            Provisioner
        end
    end

    class Provisioner < Vagrant.plugin("2", :provisioner)
        def provision
            result = system "#{config.command}"
        end
    end
end

Em seguida, basta invocar em seu Vagrantfile assim:

config.vm.provision "list-files", type: "local_shell", command: "ls"

E através da linha de comando assim:

vagrant provision --provision-with list-files

Isso é uma espécie de hack, pois parece um plug-in, mas na verdade não é (ele não aparece quando você faz vagrant plugin list ). Eu não recomendo fazê-lo desta maneira, exceto que ele tem a vantagem de não precisar instalar um plugin, então seu Vagrantfile funcionará em qualquer máquina que suporte a última versão de configuração (versão 2 a partir da gravação deste). Embora isso pareça promissormente portátil, há também todo o problema de plataforma cruzada do comando real que você está emitindo. Você precisa levar em consideração se você quer que seu Vagrantfile seja portátil, mas isso deve começar.

    
por 27.10.2015 / 02:51
4

De acordo com o que @tmatilai disse sobre o uso de

system('./myscript.sh')

Eu achei bastante útil por um tempo comandos como instalar comandos vagrant ou algum provisionador que pode não estar instalado no sistema. Eu apenas evito que ele seja executado novamente toda vez que invoco os comandos vagrant adicionando um sed para comentar automaticamente o Vagrantfile .

Por exemplo:

system('vagrant plugin install vagrant-fabric && (pip install fabric jinja2 || sudo pip install fabric jinja2) && sed -i -e "s/^system/#system/g" Vagrantfile')

E eu faço a primeira linha do meu Vagrantfile. Dessa forma, ele instalará primeiro o plugin, tecido e jinja do vagrant-fabric (tentará primeiro sem sudo para virtualenvs e com sudo se isso falhar) e, em seguida, os comentários de linha em si.

    
por 27.01.2015 / 16:38

Tags