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


40

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

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

回答:


29

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

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

system('./myscript.sh')

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

2
Vagrantトリガーは、まさに私が必要とするもののように見えます。
デジタル14

このsystem()関数はどこで見つけましたか?私は...どこでも、それについてのドキュメントを見つけることができません
クリスティアーノFontes

1
@CristianoFontes、それはKernelモジュールにあり、ここ文書化されていますKernelモジュールに含まれObject、その方法は、すべてのスコープで利用可能であるので、クラス。
tmatilai

1
バカな私。浮浪者のドキュメントを探していました。ありがとう!
クリスティアーノ・フォンテス

26

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

(受け入れられた答えはユーザーが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

1
こんにちは、ミック...素敵な回答ありがとうございます。しかし、[#{ARGV [0]} = 'up'];の場合、取得できません。Windows上で動作します。これは、引数見つけたことがない
クリスティアーノFontes

1
これは、Vagrantfile内の位置に関係なく、他の何かが実行される前に最初にスクリプトを実行します。それはあなたがやってますがしている何のために十分であるかもしれない浮浪者-トリガプラグイン私が必要だったものを...
Vigintas Labakojis

3
@CristianoFontesを使用すると、システムコールの外でルビーでargvテストを実行できます。これは、Windowsおよび* nixで動作します。これを使用して、コマンドラインでupまたはprovisionコマンドを探すことでプロビジョニングが行われていることを示すグローバルルビー変数を設定します:if ARGV [0] =〜/ ^ up | provision $ / i and not ARGV.include?( " --no-provision ")$ provisioning = true else $ provisioning = false
end-ルバーブ

これは、Vagrantが推奨しているように、実際には悪い習慣です。「up」コマンドにフックするプラグインを作成する必要があります。実行前、実行後、実行中のいずれかを指定できます。
SilentICE

1
@MickはVagrantのドキュメント(docs.vagrantup.com/v2/plugins/commands.html)からだけです。また、呼び出しの場合にargv [0]がフラグを言うのではなく 'up'であることを確認できないため、脆弱なスクリプトにもなります。また、生のルビーにドロップインしている場合、フレームワークが提供するはずのカプセル化をちょっと破っています。正しく私見ので、あなたは、可能な限りそれらを使用する必要があり、これを行うにさらさメカニズムがあります
SilentICE

9

これを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を移植可能にする場合は、考慮する必要がありますが、これで開始できます。


1
良い答えです。これを使用して、低ポート転送をセットアップします。
poindexter

6

@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/


これは、これまでで最もエレガントな回答です。これと同様のスニペットを内部に配置することconfig.vm.defineは必須ではありません。内部に配置することもできますVagrant.configure("2") do |config| ... end。最後の注意点として、Windowsホストでは、Vagrantは.ps1拡張子を持つPowershellスクリプトも喜んで実行します。
ベンジョンソン

4

@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の最初の行にします。それは最初の放浪ファブリックプラグイン、ファブリックや神社をインストールします。この方法で(せずに最初の試みますsudoためvirtualenvsとしてsudoいるが失敗した場合)して、行のコメントそのもの。


Vagrantfileのコメントを外すよりも、単にgag vagrantプラグインリストをgrepする方が簡単です。これは、チームの他のユーザーに問題を引き起こす可能性があります。if [[ $(vagrant plugin list | grep -c vagrant-host-shell) == "0" ]] then vagrant plugin install vagrant-host-shell fi
ヨルダン

これに伴う問題は、それが他のコマンド、何を実行した場合にトリガされることであるvagrant status前にvagrant up...
ミック・
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.