17

以前にVMインスタンスが再プロビジョニングされている場合は、再プロビジョニングを回避するためにシェルプロビジョナーを取得しようとしています。

次のVagrantfileについて考えてみます。

Vagrant::Config.run do |config|
  config.vm.define :minimal do |config|
    # Base image
    config.vm.box = "lucid32"
    config.vm.box_url = "http://files.vagrantup.com/lucid32.box"

    config.vm.provision :shell, :inline => "mkdir /tmp/foobar"
  end
end

を実行するvagrant up minimalと、ボックスが作成され、最初にプロビジョニングされます。次に実行vagrant provision minimalすると、ボックスの再プロビジョニングが試行されますが、失敗します(/ tmp / foobarディレクトリがすでに存在するため)。

Vagrantに過去にマシンをプロビジョニングしたかどうかを記憶させ、後で再プロビジョニングしないようにする方法はありますか?

その他のコンテキスト:実行vagrant up minimalし、ホストマシンを再起動してvagrant up minimalから再度実行すると、ボックスの再プロビジョニングが試行され、失敗します。VirtualBoxがホストマシンでカーネルパニックを頻繁に引き起こすため、これはかなり頻繁に発生します。

4

5 に答える 5

10

これはあなたが望む答えではないかもしれませんが、それをに変更すると、うまくいきますmkdir; mkdir -p

ただし、真面目な話として、Vagrantは、プロビジョナーがべき等であることを期待していると思います(つまり、2回目の実行の場合、アクションは実行されません)。

プロビジョニングスクリプトで実際に行っていることによっては、真のべき等性を実現するのは難しいかもしれませんがmkdir -p、良いスタートです。システム上にフラグファイルを作成し、そのフラグファイルの存在を最初に確認することもできます。存在する場合は、exit 0

于 2013-05-23T01:02:54.520 に答える
6

bashプロビジョニングスクリプトを使用している場合、べき等ではない可能性があります。

2回のプロビジョニングを回避する方法の簡単な例を次に示します。

PROVISIONED="/some-app-dir/PROVISIONED";

if [[ -f $PROVISIONED ]]; then
  echo "Skipping provisioning";
  exit;
else
  echo "Provisioning";
fi

#...do provisioning things

touch $PROVISIONED;
于 2014-11-12T22:45:19.517 に答える
5

これを調べましたか?

vagrant up --no-provision

$ vagrant up --help
Usage: vagrant up [vm-name] [options] [-h]

    --[no-]provision             Enable or disable provisioning
    --provision-with x,y,z       Enable only certain provisioners, by type.
    --[no-]parallel              Enable or disable parallelism if provider supports it.
    --provider provider          Back the machine with a specific provider.
-h, --help                       Print this help
于 2013-06-28T06:52:25.473 に答える
4

Vagrantは通常、最初 vagrant up vagrant provisionプロビジョニングコードを実行し、withやなどのように具体的に指示した場合にのみ実行しますvagrant reload --provision。プロビジョニングスクリプトの再実行を回避するために、邪魔になる必要はありません。(ただし、質問を投稿したときはそうではなかった可能性があります。)

プロビジョニングにChefまたはPuppetを使用している場合、それらはすべてをべき等にするようにすでに設計されています。SaltとAnsibleについても同じことが言えると思います。

シェルスクリプトを使用していて、それらをべき等にしたい場合は、ifステートメントで何らかの条件(ファイルの存在など)を確認できます。

if [[! -f "$HOME/bin/something.sh" ]]; then
  # install something.sh into ~/bin
fi

mkdir /tmp/foobarそれはあなたが達成しようとしていることではないと思っているので、私は非常に一般的な答えを出しましたが、そうであれば、を追加し-pます。

于 2014-02-19T18:39:28.187 に答える
-1

エラーを再現できません。ボックスが起動すると、明示的にそれを実現するための機能を使用しない限り、プロビジョニングすることは想定されていません。

さらに重要なことに、プロビジョニングは常にidempotent他の多くの人が指摘しているようにする必要があります。

べき等レシピは同じシステムで複数回実行でき、結果は常に同じになります。リソースはレシピで定義され、レシピはシステムで実行されるアクションを定義します。chef-clientは、リソースが変更されていない場合にアクションが実行されないこと、および実行されるアクションが毎回同じ方法で実行されることを保証します。レシピが再実行され、何も変更されていない場合、chef-clientは何もしません。

参照:https ://docs.getchef.com/chef_why.html#idempotence

于 2014-09-06T20:57:08.440 に答える