humangas's blog

自分用のメモなので雑です。

入門Chef Solo:15-任意のシェルスクリプトを実行したい - Execute, Script

入門Chef Solo - Infrastructure as Code

入門Chef Solo - Infrastructure as Code

やりたいことがほかのResourceを使ってもなかなか実現できない場合にExecuteやScriptリソースを使う。

  • ExecuteやScriptは任意のコマンドやスクリプトを実行できる
  • ほとんど抽象化されておらず、冪等性も自分で担保する
  • Execute, Scriptともに任意のコマンドを実行するResource
  • bash, perl, rubyなど指定したインタプリタを使う場合はScriptを使う

Script(bash)

実行ユーザー

デフォルトではrootユーザー(正確にはchef soloを実行したユーザー)の権限で動く。

cwd

スクリプト実行時のcurrent working directoryを指定。

code

セットしたスクリプトを実行する。
ヒアドキュメントを用いて、レシピの中にシェルのコードを書ける。

creates

冪等性を保証するために使用するので重要。
createsは、このリソースで結果的に作成されるファイルを指定し、既にそのファイルが存在する場合にはコマンドを実行しない。

not_if, only_if

詳細な条件分岐を記述できる。

  • not_if: 指定した条件が真でないならコマンドを実行する。
  • only_if: 指定した条件が真のときのみコマンドを実行する。

条件として与えられた値によって、条件判定の仕様が異なる。

  • 文字列が与えられたとき:インタプリタ(例:bash)で実行してその終了ステータスを判定
  • Rubyのブロックが与えれたとき:与えられたコードブロックをrubyで解釈して真偽値で判定

処理の実行に使われるユーザーやディレクトリ、環境変数を指定できる。
例)

not_if <<-EOC, :user => 'vagrant', :environment => {'HOME' => '/home/vagrant'}
    ...
EOC

not_ifonly_ifはどのResourceでも記述できるが、よく使うのはScript Resource

EC2のマイクロインスタンスにスワップファイルを作る例

EC2のマイクロインスタンスは、インスタンス起動直後にはスワップ領域が設定されていない。そのためスワップを使うにはスワップイメージを作ってスワップを有効化する。

コード:よく使いそうだからコピペできるように書いときます

bash 'create swapfile' do
    code <<-EOC
        dd if=/dev/zero of=/swap.img bs=1M count=2048 &&
        chmod 600 /swap.img
        mkswap /swap.img
    EOC
    only_if { not node[:ec2].nil? and node[:ec2][:instance_type] == 't1.micro' }
    creates "/swap.img"
end

mount '/dev/null' do # swap file entry for fstab
    action :enable # cannot mount; only add to fstab
    device '/swap.img'
    fstype 'swap'
    only_if { not node[:ec2].nil? and node[:ec2][:instance_type] == 't1.micro' }
end

bash 'activate swap' do
    code 'swapon -ae'
    only_if "test `cat /proc/swaps | wc -l` -eq 1"
end

参考: 『EC2にSWAP領域を作成』suz-lab