web-dev-qa-db-ja.com

ゲストが再起動するたびにVagrantがスクリプトまたはコマンドを実行する(Vagrant up)

プロビジョニングスクリプトについては知っていますが、これは別のスクリプトです。ゲストを再起動するたびにスクリプトを実行したい。

シェルプロビジョニングツールを使用しています。

config.vm.provision :Shell, path: "vagrant/bootstrap.sh"

再起動のたびに実行したいコマンドをこのスクリプトに入れることはできません。

基本的に、ユーザーがvagrant upを実行すると、アプリケーションの1つが開始されるようにします。

私のゲストはubuntu 14.04 trustyであり、私が見つけた解決策の1つは私のゲストをフォローすることでした-

Sudo crontab -e
#add the following line 
@reboot sh /path/to/my_script_on_guest.sh

プロビジョニングスクリプトでこれを行うことはできますが、Sudo crontab -eはエディターを要求し、インタラクティブに行を追加する必要があります。 crontabファイルは修正されていないため、次のような1つのライナーファイルの編集が実行可能かどうかわかりません。

echo '@reboot sh /path/to/my_script_on_guest.sh' >> crontab_file

これはゲストOS固有のものであるに違いないと思います。

Vagrantを使用してこれを達成することは可能ですか?

編集:sshプロビジョニングからシェルプロビジョニングへの修正。

29
Pranav Shukla

run: 'always'を使用できます

config.vm.provision :Shell, path: "vagrant/bootstrap.sh", run: 'always'

これにより、VMが起動するたびにコマンドが実行されるようになります(浮浪者のアップまたは浮浪者のリロード)

特定のコマンドのみを常に実行する必要がある場合は、スクリプトを分割できます

config.vm.provision :Shell, path: "vagrant/bootstrap1.sh"
config.vm.provision :Shell, path: "vagrant/bootstrap2.sh", run: 'always'
config.vm.provision :Shell, path: "vagrant/bootstrap3.sh"

スクリプトが順番に実行され、マシンが最初にプロビジョニングされたときにbootstrap1、2、3の順に実行されます

vagrant up(またはリロード)を実行すると、bootstrap2のみが実行されます

48

ここで vagrant triggers を使用して、私のために働いた代替を提供しています。ドキュメントから直接この例を検討してください:

ゲストを破棄する前に、リモートスクリプトを実行してホストにデータベースを保存します。

Vagrant.configure("2") do |config|   
  config.vm.define "ubuntu" do |ubuntu|
    ubuntu.vm.box = "ubuntu"

    ubuntu.trigger.before :destroy do |trigger|
      trigger.warn = "Dumping database to /vagrant/outfile"
      trigger.run_remote = {inline: "pg_dump dbname > /vagrant/outfile"} 

      # or trigger.run = {...} to run the command on the Host instead 
      # of guest
    end
  end 
end

関連する vagrant-triggersプラグイン もあります

4
kip2

Ubuntu 18.04を使用しました。トリガーが機能しなかったため、ポストプロビジョニングスクリプトをvmボックスにコピーし、マスタースクリプトから目的のポストプロビジョニングを実行することを選択しました。

config.trigger.before :provisioner_run, type: :hook do |t|
    t.info = "Before the provision!"
  end

  config.vm.provision "Shell" do |s|
    s.inline = "echo $1  "
    s.args   = [" '--->' Provisioning the environment!"]
  end 
  config.vm.provision "file", source: "scripts/post-provision/.", destination: "/home/vagrant"
  config.vm.provision "Shell", path: "scripts/install.sh"
  # config.vm.provision "Shell", path: "scripts/bootstrap.sh", run: 'always'

  # config.trigger.after :up do |trigger|
  #   trigger.info = "Installing Monitoring Stack..."
  #   trigger.run_remote = {path: "./install-monitor-stack.sh"}
  # end
end

マスタースクリプトの内容は、execを使用して新しいシェルを更新します。また使用することができます

リセットする

Sudo chmod  +x *.sh
exec /home/vagrant/install-monitor-stack.sh
exec /home/vagrant/bootstrap.sh
0