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と指定した場合は削除されないと思います
アジャイルコーチングやトレーニングを提供しています
株式会社アトラクタでは、アジャイル開発に取り組むチーム向けのコーチングや、認定スクラムマスター研修などの各種トレーニングを提供しています。ぜひお気軽にご相談ください。
詳細はこちら