0

いくつかの VM を定義する Vagrant プロジェクトがあります。そのうちの 1 つで、いくつかのコマンドを実行してカーネル パラメータを調整し、リモートの場所からファイルをダウンロードし、デーモンを開始する必要があります。現在、私は次のように定義していますcookbooks/*/recipes/default.rb:

execute "sudo tune-kernel-parameter"
execute "curl http://something/ > /tmp/some-file"
execute "sudo some-daemon --config /tmp/some-file"

私が最初のときはすべてうまくいきvagrant upます。しかしもちろん、マシンが再起動した場合、これらのコマンドは init スクリプトの一部ではないため、再度実行されることはありません。

VM を再起動するためにいつでも実行できると思いvagrant reloadますが、直接再起動できるようにしたいのです。つまり、永続的な「サービス」を提供します。

上記のコマンドの一部(カーネル チューニング) は/etc、これらのファイルの正しい構文を調べるために時間を費やしたい場合 (直接のコマンドが正しいことを確認する作業を既に行った後)、 のファイルを変更することで置き換えることができます。私がしたいことをしてください)。また、他のもの (デーモンの開始) については、定義済みのサービス、つまり、構成してリソース/etcの使用を開始できるサービスを定義する Ubuntu パッケージを使用できる場合があります。service

ただし、上記のダウンロードのような特異なコマンドがあります (これはデーモンが開始する前に実行する必要があります)。おそらく、templateリソースを使用してスクリプトを定義し、プロビジョニング時にそれを開始するために/etc/init.d/使用できます (ただし、シェフ、サービスが作成される前に init.d スクリプトを作成するテンプレートを実行する方法は、これが思ったよりもさらに多くの作業であることを意味します) )。service

しかし、プロビジョニング中とその後の再起動時に短いインライン スクリプトを実行するように単純に要求する標準的な方法はありませんか? executeとの間の何かservice、例えば

init_script <<-END
    sudo tune-kernel-parameter
    curl http://something/ > /tmp/some-file
    sudo some-daemon --config /tmp/some-file
END

(スクリプトは冪等であると想定しています。つまりvagrant provision、同じ VM セッションで変更されたバージョンを再度実行しても問題ありません。killall some-daemon最初に実行する必要がある場合、それは簡単です。)

4

1 に答える 1

1

おそらくそのために使用できます/etc/rc.local

file "/etc/rc.local" do
  content <<-EOC
    sudo tune-kernel-parameter
    curl http://something/ > /tmp/some-file
    sudo some-daemon --config /tmp/some-file
  EOC
  mode 0755
  notifies :run, "execute[rc.local]"
end

execute "rc.local"
  command "/etc/rc.local"
  action :nothing
end

ブロックはa をexecute宣言するresourceだけですが:nothing、それを行います。file実行時にディスク上のファイルを変更するnotifiesと、executeリソースは:run.

于 2013-08-17T19:11:08.580 に答える