opscodeのCookBook(selinux)を読む
まずは、比較的難しいことをしておらず、シンプルなopscodeのCookBookを読んでみます。 今回の読んでみるCookBookは、opscode-cookbooks/selinux · GitHub です。
ディレクトリ構成は次のようになっています。
`-- selinux |-- CHANGELOG.md |-- CONTRIBUTING |-- LICENSE |-- README.md |-- attributes | `-- default.rb |-- metadata.rb |-- providers | `-- state.rb |-- recipes | |-- default.rb | |-- disabled.rb | |-- enforcing.rb | `-- permissive.rb |-- resources | `-- state.rb `-- templates `-- default `-- sysconfig `-- selinux.erb
Cookbook内のディレクトリの意味を知りたい場合は、サーバー設定ツール「Chef」の概要と基礎的な使い方のCookbookの構造の箇所が参考になります。
resourcesを見てみると、Recipe内で使われる設定対象が確認できるので確認します。 ここでは、利用できるactionやattributeを確認できます。
default_action :nothing actions :enforcing, :disabled, :permissive attribute :state, :default => nil
README.mdを見てもわかりますが、実際にこのcookbookを実行する際にはrun_listに、次のように指定します。
{ "run_list":[ "recipe[selinux::disabled]" ] }
それぞれのrecipeを見てみると大体構成は次のようになっており、selinux_stateという独自のリソース(LWRP)が定義されています。
selinux_state "SELinux Disabled" do action :disabled end
このリソース(selinux_state)は、providersのstate.rbにあります。 これは、リソースの名前は、大体『cookbook名_provider内のソース名 』という命名規則になっていることから、どのソースで定義されているかが判断できます。
state.rbでは、selinux_stateリソースで利用可能な、actionが定義されています。
action :disabled do unless @current_resource.state == "disabled" execute "selinux-disabled" do only_if "selinuxenabled" command "setenforce 0" end se_template = render_selinux_template("disabled") end end
それぞれのactionの中で@current_resourceが定義されていて、@current_resourceにアクセスするとload_current_resourceメソッドが呼ばれます。
def load_current_resource @current_resource = Chef::Resource::SelinuxState.new(new_resource.name) s = shell_out("getenforce") @current_resource.state(s.stdout.downcase) end
load_current_resourceの中で、@current_resource.stateにgetenforceの結果を設定して、それぞれのactionで、この値を利用しています。