ブログ

ryuzeeによるブログ記事。不定期更新

Vagrantのインスタンスの破棄の際にChef Serverのnodeも同時に削除する方法

タイトルが長くて何を言っているのか分かりにくいのですが、Vagrant 1.1 + Chef Serverを使ってインスタンスを作り、一端インスタンスを破棄して再度作ろうとすると、Chef Serverが、そのノードは既に登録中だから登録できねーよ、という409エラーを吐いてしまい、プロビジョニングに失敗します。

たとえばこんな感じのVagrantfileを使う場合にdestroyして作りなおすと上記の事象が発生するわけです。

Vagrant.configure("2") do |config|
  config.vm.box = "centos_63_x86_64_ja"
  config.vm.network :private_network, ip: "192.168.33.10"
  config.vm.hostname = "test07" # この名前がnodeとして登録される
  config.vm.provision :chef_client do |chef|
    chef.chef_server_url = "http://chef.ryuzee.com:4000"
    chef.validation_key_path = "~/.chef/validation.pem"
    chef.environment = "development"
    chef.validation_client_name = "chef-validator"
    chef.client_key_path = "/etc/chef/client.pem"
    chef.add_recipe "apache_mysql_php"
  end
end

もちろんインスタンスを破棄したあとに

knife node delete test07
knife client delete test07

みたいにknifeコマンドを使っても良いのですが、毎回手作業でやるのも馬鹿馬鹿しいし、たまに実行すると必ず忘れます。

ということで、Vagrant 1.1系でのプラグインの作り方の練習がてら、自分でプラグインを作ってみました。

https://github.com/ryuzee/vagrant-chefnode

このプラグインを使うと、vagrant destroyを実行した際に、最後にChef Serverからnodeとclientを削除するかどうか質問され、yを選択すれば、削除を実行します。以下のような感じです。

プラグインのインストールは

vagrant plugin install vagrant-chefnode

としてください。

また動作させるためにはknifeが正しく設定されていて、$HOME/.chef/knife.rbが存在している必要があります。

その他

  • Chefのgemを使っているのでVagrant 1.1.3以降くらいで動作します(net-ssh問題のため)
  • MultiVMでも動作します
  • Vagrantfileの中でProvisioningにChef Serverを使っていない場合は、destroy時に質問したりはしないようになっています
  • 同様にknife.rbで定義されているChef ServerのURLとVagrantfileの中のChef ServerのURLが違う場合は削除しないようになってます
  • 動作確認は、MacOSXとUbuntu12.04でおこないました
  • 今のところVirtualBoxだけに対応していると思うので--provider=awsと指定した場合は削除されないと思います

アジャイルコーチングやトレーニングを提供しています

株式会社アトラクタでは、アジャイル開発に取り組むチーム向けのコーチングや、認定スクラムマスター研修などの各種トレーニングを提供しています。ぜひお気軽にご相談ください。

詳細はこちら