Pré-preencha o conteúdo da pasta sincronizada do vagrant

5

Atualmente, estou construindo uma pilha de servidores bastante complicada (um aplicativo ruby on rails) que eu quero que os desenvolvedores possam trabalhar sem precisar instalar tudo sozinhos. Portanto, eu uso o Vagrant para permitir que eles façam isso.

A idéia é que quando você instala a imagem pela primeira vez, ela extrai as fontes mais recentes e instala as dependências, as fontes são expostas por pastas sincronizadas (um recurso construído no vagrant) para que desenvolvedores possam criar fontes e editá-las. meio Ambiente. A caixa Vagrant é apenas para o servidor.

Entrada de pasta sincronizada no Vagrantfile:

config.vm.synced_folder "gameeso/", "/var/gameeso", :create => "true" 

A imagem é um servidor Ubuntu com um script upstart (o script é executado na inicialização e somente quando a conexão com a Internet é ativada) que:

  • Puxa o ramo de desenvolvimento mais recente do Github (se a pasta ainda não existir)

  • Instala as dependências (isso é feito por um script)

  • Inicia o servidor

Tudo isso acontece em uma pasta sincronizada. Eu tive alguns problemas com essa abordagem, principalmente porque o Vagrant limpa a pasta sincronizada no meu sistema convidado. Eu resolvi esse problema adicionando 'sleep 10' no script inicial, então ele pode esperar até que o Vagrant configure as pastas sincronizadas.

É claro que essa não é uma maneira segura de fazer isso (no caso de a inicialização demorar mais de 10 segundos, embora seja improvável nos dias de hoje, prefiro não gostar de descobrir;))

A minha pergunta é: Existe uma maneira melhor de permitir que o guest-host (a imagem vagante) preencha uma pasta sincronizada?

Claro, muito obrigado antecipadamente!

    
por user125756 17.06.2014 / 10:07

1 resposta

2

Os recursos provisionamento do Vagrant devem ser perfeitos para isso. Há um monte de maneiras que você poderia fazer, mas o mais simples é provavelmente pegar o script do Upstart e torná-lo um script de shell simples. Em seguida, coloque um desses blocos no seu Vagrantfile :

  1. Usando um script "inline". O Vagrant copiará o conteúdo do Vagrantfile para um script no diretório /tmp e o executará.

    $script = <<<SCRIPT
    // The contents of your script go here
    SCRIPT
    
    config.vm.provision "shell", inline: $script
    

    Note que o script aqui está dentro de um "heredoc" , o que significa que você precisa ser Tenha cuidado para garantir que o token SCRIPT que termina o heredoc esteja no lugar certo - ou seja, em uma linha sozinho, sem espaços em branco extras. (O link sobre heredoc acima mostra uma maneira de permitir espaços em branco, mas você precisa ser cuidadoso de qualquer maneira.)

  2. Apontando para um arquivo de script . O Vagrant irá copiar este arquivo para o diretório /tmp e executá-lo.

    config.vm.provision "shell", path: "setup.sh"
    

    Observe que o caminho aqui é relativo ao local Vagrantfile . No entanto , o arquivo não é executado a partir daquele local, então se você precisar que o arquivo esteja em um determinado diretório, você deve seguir o método # 3.

  3. Usando um script "in-line" que aponta para um arquivo de script. Dessa forma, você pode executar um script em um local escolhido (no exemplo abaixo, em /vagrant depois de ter feito pré-requisitos como chmod ou configuração de variáveis de ambiente.

    $script = <<SCRIPT
    chmod +x /vagrant/setup.sh
    cd /vagrant
    ./setup.sh
    SCRIPT
    
    config.vm.provision "shell", inline: $script
    

Você também pode usar um método de provisionamento que funcione por meio de um sistema "real" de implantação e provisionamento, mas dependendo de seus requisitos, que podem ser exagerados.

    
por 20.06.2014 / 00:55