Cookbook情報
- 名称: package_installer
- 開発元:Heavy Water Software Inc.
- Opscode site:http://community.opscode.com/cookbooks/package_installer
- source: https://github.com/hw-cookbooks/package_installer
- 評価したバージョン: 0.0.1
概要
Chefのビルトインリソースpackage
をラップして、各種パッケージの構成をAttribute
として管理できるCookbook。
解説
レシピが内部DSLで良かったと思える一品、package
リソースが対応するプラットフォームすべてに有効だ。
パッケージの導入&削除およびバージョン指定&自動更新をEnvironment
やRole
のメタデータとして管理できるので多少の構成変更ならCookbookの変更が不要になることも大きい。
もしパッケージをインストール/アンインストールするだけのCookbookを書いていたらpackage_installerに統合したらよい。
recipe
defaultが一つだけ、そして10行しか無いのでまるごと掲載する。
余談だがattributeの指定にシンボルを使うのはFoodcritic FC001に引っかかるので、一応覚えておこう。
default
node[:package_installer][:packages].each do |pkg_name, pkg_info| if(pkg_info) pkg_action = pkg_info[:action] || :install pkg_version = pkg_info[:version] end package pkg_name do action pkg_action version pkg_version if pkg_version end end
バージョンを貰えば指定つきで、各種パッケージを指定したactionで構成するだけと非常にシンプルだ。
Attributes
- ['package_installer']['packages']
- ['package_installer']['packages']['$pkgname']
- ['action']:省略時は
:install
- ['version']: 省略可
- ['action']:省略時は
Attribute設定の例
このCookbookに限った話ではないが、packages以下の要素を複数のRole,Environmentで同じように指定した場合上書きでなくマージされる。
あるRoleでvimを指定して、
"package_installer": { "packages": { "vim": nill } }
ほかのRoleでtmuxを指定したとする。
"package_installer": { "packages": { "tmux": {"action": "upgrade"} } }
Nodeの持つ最終的なAttributesはこのようになる。
"package_installer": { "packages": { "vim": null, "tmux": {"action": "upgrade"} } }
当然どこかでrun_list
にrecipe[package_installer]を一度入れておけば、Chef-clientサーバの状態をそのようにしておいてくれる。
適用例1
ubuntu_baseというRoleを作って、よく使うユーティリティをdefault_attiributes
にて指定するというような使い方が便利だろう。
{"name": "base_ubuntu", "description": "Server Basic Settings", "json_class": "Chef::Role", "default_attributes": { "package_installer": { "packages": { "dstat": null, "vim": null, "curl": { "action": "upgrade" }, "yajl-tools": null, "tmux": null, "iotop": null, "nano": { "action": "remove" }, "bsd-mailx": null } } }, "override_attributes": {}, "chef_type": "role", "run_list": [ "recipe[package_installer::default]" ], "env_run_lists": {} }
例ではopscodeのaptのCookbookも入れている、Chefサーバかcookbookのパスに一緒に入れておくことをお勧め。
実行ログ例1
INFO: Processing package[curl] action upgrade (package_installer::default line 7) INFO: package[curl] upgraded from uninstalled to 7.22.0-3ubuntu4 INFO: Processing package[tmux] action install (package_installer::default line 7) INFO: Processing package[bsd-mailx] action install (package_installer::default line 7) INFO: Processing package[yajl-tools] action install (package_installer::default line 7) INFO: Processing package[nano] action remove (package_installer::default line 7) INFO: package[nano] removed INFO: Processing package[dstat] action install (package_installer::default line 7) INFO: Processing package[iotop] action install (package_installer::default line 7) INFO: Processing package[vim] action install (package_installer::default line 7)
適用例2
syslog-ngのレシピを適用したいが、他のsyslog系を止めたい。これをRoleに書くことでCookbook修正の手間を軽減できる。
-- snip -- "default_attributes": { "package_installer": { "packages": { "rsyslog": { "action": "remove" }, "syslog": { "action": "remove" } } } }, "run_list": [ "recipe[syslog-ng::default]" ] -- snip --
この場合はもちろん、How to write a good Chef cookbookのようにレシピ内で書いても良いが。
あとがき
このCookbookはOpscode作でなくコミュニティでShareされているもので、なおかつ1コミットで終了してライセンス表記もない。
しかし『Chef導入≠レシピ書く』を印象付けるのにとてもわかりやすいため紹介することにした。
採用!!
返信削除