systemd Vagrant e VirtualBox: aguarde a pasta sincronizada para montar

6

Estou tentando configurar um serviço systemd em uma caixa do Vagrant que requer que a pasta sincronizada do Vagrant seja montada antes de iniciar.

Vagrantfile

Vagrant.configure(2) do |config|
    config.vm.box = "ubuntu/yakkety64"
    config.vm.synced_folder ".", "/usr/local/src"
    config.vm.provision "shell", path: "bootstrap/bootstrap"
end

/etc/systemd/system/my-server.service

[Service]
ExecStart=/usr/bin/node /usr/local/src/index.js
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=my-server
User=ubuntu
Group=ubuntu

[Unit]
Requires=remote-fs.target
After=vboxguest.service
After=virtualbox-guest-utils.service

[Install]
WantedBy=remote-fs.target

Se eu não ativar o serviço meu servidor , a pasta sincronizada será montada corretamente. Mas quando tento ativar o serviço meu-servidor , o serviço não consegue localizar os arquivos montados. Se eu fizer login na caixa Vagrant, a pasta não será montada. Parece que a tentativa do serviço de carregar arquivos desse caminho interfere no Vagrant.

Então, como eu espero que as pastas sejam montadas antes do início do meu serviço?

Outras soluções são insuficientes de várias maneiras, exigindo intervenção manual para iniciar o serviço, o que é inaceitável.

    
por rich remer 10.10.2016 / 23:01

2 respostas

5

Acabei de resolver esse tipo de problema adicionando:

[Install]
WantedBy=multi-user.target var-www-example.com.mount'

em que var-www-example.com corresponde a:

config.vm.synced_folder ".", "/var/www/example.com"

no Vagrantfile .

Assim, o Vagrant tem uma unidade systemd de XXX.mount para cada um dos seus pontos de montagem de pasta sincronizados. Você pode encontrar o seu com:

# systemctl list-units | fgrep .mount
    
por 15.03.2017 / 11:42
3

Eu tive um problema semelhante em que um dos meus serviços do systemd exigia que um sistema de arquivos sincronizado vagrant estivesse presente antes de o serviço ser executado para iniciar com êxito. Eu trabalhei em torno do problema por ter um provisionador de shell do vagrant reiniciar o serviço automaticamente em todas as partidas. Isso funciona porque o provisionador é executado após o vagrant ter montado os sistemas de arquivos sincronizados.

config.vm.provision "shell", run: "always", inline: "systemctl restart my-server"

Não sei por que o seu serviço interferiria no seu sistema de arquivos sincronizado. O Vagrant sincroniza a pasta na qual seu arquivo vagrant está, por padrão, em / vagrant. Poderia ter sido montado duas vezes?

    
por 14.11.2016 / 08:02