web-dev-qa-db-ja.com

放浪中にホストマシンでスクリプトを実行する

Vagrantがサーバーをプロビジョニングするときに、ホストマシンでbashスクリプトを実行したいのですが。

これを達成するための最良の方法は何でしょうか?

40
digital

役立つはずの少なくとも2つのプラグイン:

スクリプトが(ほぼ)すべてのvagrantコマンドで実行されることを気にしない場合は、Vagrantfileでシェルアウト(またはこれまでに使用したRuby magic)を使用)することもできます。

system('./myscript.sh')

Vagrant.configure('2') do |config|
  # ...
end
32
tmatilai

シンプルな(そして完全な)ソリューション

(受け入れられた答えはユーザーがvagrant upを使用しているかどうかをチェックしないため、私は完了と言います。したがって、スクリプトは各コマンドで実行されますが、OPはそれを望んでいません。)

ただし、これには簡単な解決策があります。

ARGV[0]は、入力したコマンドの最初の引数で、updownstatusなどにすることができます。ARGV[0]の値を確認するだけですあなたのVagrantfileで。


このような何かが行います:

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
29
Mick

これを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

次に、次のようにVagrantfileを呼び出すだけです。

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

そして、このようなコマンドラインを介して:

vagrant provision --provision-with list-files

これはプラグインのように見えるハックの一種ですが、実際にはそうではありません(実行しても表示されませんvagrant plugin list)。プラグインをインストールする必要がないという利点があることを除いて、この方法で行うことはお勧めしません。そのため、Vagrantfileは最新の構成バージョン(これを書いている時点ではバージョン2)をサポートするすべてのマシンで動作します。これは移植性が高いように思えますが、発行する実際のコマンドのクロスプラットフォーム全体の問題もあります。 Vagrantfileを移植可能にする場合は考慮に入れる必要がありますが、これで開始できます。

10
Joel B

@tmatilaiの回答に基づいて2019年に更新され、vagrant-triggersがVagrantに統合されました。これで、次のようなことができるようになります。

node.trigger.before [:up, :provision] do |trigger|
  trigger.info = "Running ./myscript.sh locally..."
  trigger.run = {path: "./myscript.sh"}
end

このブロックはconfig.vm.define。詳細なドキュメント: https://www.vagrantup.com/docs/triggers/

8
Sean Hood

@tmatilaiが使用について言ったことに沿って

_system('./myscript.sh')
_

システムにインストールされていない可能性のあるvagrantコマンドや一部のプロビジョナーのインストールなど、1回限りのコマンドには非常に役立ちます。 vagrantを自動コメントするsedを追加することにより、Vagrantfileコマンドを呼び出すたびに再実行されるのを回避します。

例えば:

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

そして、それをVagrantfileの最初の行にします。この方法では、最初にvagrant-fabricプラグイン、ファブリック、ジンジャ(Sudoの場合はvirtualenvsなしで、失敗した場合はSudo付きで最初に試行します)をインストールしてから、コメント行を追加します。自体。

4
user412793