Septeni Engineer's Blog

セプテーニエンジニアが綴る技術ブログ

初めてchef recipeを書く人向け、優しいrecipeの書き方。

こんにちは、貴子です。
最近は一ヶ月の半分くらいchefのresipeを書いていたので、
よく使ったrecipeの書き方をまとめて紹介します。

Install


・package インストール

package "curl-devel" do
  action :install
end

・gem インストール
gem_binaryはインストールに使うgemの場所を指定しています。
rbenv等で複数rubyを使い分けている方はぜひ利用してください。

gem_package mackerel-client do
  gem_binary("/root/.rbenv/shims/gem")
  action :install
end

rpm インストール
rpmでのnginxのインストールrecipeです。
まずnot_ifで既にインストールされているか確認して、されてなければremote_fileでrepositoryを取ってきています。
その後rpm_packageでインストールを行います。

# install repo
  remote_file "#{Chef::Config[:file_cache_path]}/nginx-release-rhel-6-0.el6.ngx.noarch.rpm" do
    source "http://nginx.org/packages/rhel/6/noarch/RPMS/nginx-release-rhel-6-0.el6.ngx.noarch.rpm"
    not_if "rpm -qa | grep -q '^nginx-release'"
    action :create
    notifies :install, "rpm_package[nginx-release]", :immediately
  end

 rpm_package "nginx-release" do
    source "#{Chef::Config[:file_cache_path]}/nginx-release-rhel-6-0.el6.ngx.noarch.rpm"
    action :nothing
  end

template


テンプレートを置いて、更新があったらnotifiesで指定したServiceをrestartします。

template "/etc/td-agent/td-agent.conf" do
  mode "0644"
  source td-agent.conf
  notifies :restart, 'service[td-agent]', :delayed
end

## Service restart
service "td-agent"

Download


wgetコマンドでtomcat7を取ってきているところのrecipeです。
tomcat7.tar.gzがpackage_pathにない場合のみ、ダウンロードを実行してもってきます。

package_name = "tomcat-#{tomcat_version}"
package_path = "#{Chef::Config[:file_cache_path]}/#{package_name}.tar.gz"
source_url = "http://archive.apache.org/dist/tomcat/tomcat-#{major_version}/v#{tomcat_version}/bin/apache-tomcat-#{tomcat_version}.tar.gz"

# Download
remote_file package_path do
  source source_url
  not_if { File.exist?(package_path) }
end

attribute


attributeから変数を引き継ぎます
・attribute側で変数のデフォルト値をsetします

default["app-base"]["template_name"] = "app-base.conf.erb"

・recipeで変数を受け取ります

app-base_conf = node["app-base"]["template_name"]

配列

パッケージのインストールをまとめて実行することもできます。

# install basic rpms
%w{ntp wget git screen dstat vim-enhanced tar gzip}.each do |pkg|
  package pkg do
    action :install
  end
end

attributeで変数を持たせる場合はこう書きます。
・attribute

default['app-base']['plugins'] = ["ntp","wget","git","dstat","vim-enhanced","tar","gzip"]

・recipe

node['app-base']['plugins'].each do |plugin|
  package plugin do
    action :install
  end
end

crontab

crontabの設定方法です。

cron "logManager.sh" do
    minute "00"
    hour "01"
    user "root"
    command "/data/shell/logManager.sh"
end

こんな感じにcronが設定されます。

# Chef Name: logManager.sh
00 01 * * * /data/shell/logManager.sh

Qiitaにも同じ内容を投稿しています。
ぜひストックしてください!
http://qiita.com/takako/items/af7940cc63872f6e1621