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で、この値を利用しています。