Squidをchefでソースからアップデートする

ウェブサーバのリバースプロクシとしてSquidを利用しています。セキュリティ上の理由から、apachesquidは細心のソースからビルドして利用しています。いままではこれを数台あるウェブサーバそれぞれで手動でやっていたんですが、chefでやってみました。

まずレシピのテンプレートを作成

$ knife cookbook create squid -o ./site-cookbooks

attributeを準備する

squidのtarballは squid-(version).tar.gz という形式なので、versionのところをattributeとして記述します。次回はこのattributeにかかれたバージョン番号だけを変更すればOK。
ついでにソースを展開するディレクトリもattributeに記述します。

site-cookbooks/squid/attribuites/default.rbに以下を追記。

default['squid'][:version] = "3.4.10"
default['squid'][:makedir] = "/home/hoge/squid"

レシピを記述

site-cookbooks/squid/recipes/default.rbにレシピを記述します。
attributeを展開、サービスの定義、Squidをmakeして、notificationでmakeが動作したときだけインストールのスクリプトと、サービスの再起動を実施。
ソースが展開されたディレクトリの有無でmakeするかしないかを判断しています。
install_squidのaction:をnothingにしておかないと、cookしたときに毎度動作してしまいます。

#
# Cookbook Name:: squid
# Recipe:: default
#
# Copyright 2014, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#

makedir = node['squid']['makedir']
version = node['squid']['version']

service "squid" do
    supports :status => false, :restart => true, :reload => false
    action [ :enable, :start ]
end


script "make_squid" do
    not_if {File.exists?("#{makedir}/squid-#{version}")}
    interpreter "bash"
    user "hoge"
    group "hoge"
    cwd node['squid']['makedir']
    code <<-EOH
        wget -nc http://www.squid-cache.org/Versions/v3/3.4/squid-#{version}.tar.gz
        tar -zxvf squid-#{version}.tar.gz
        cd squid-#{version}
        ./configure
        make -j8
    EOH
    notifies :run , 'script[install_squid]'
    notifies :restart , 'service[squid]'
end

script "install_squid" do
    interpreter "bash"
    user "root"
    group "root"
    cwd node['squid']['makedir']
    code <<-EOH
        cd squid-#{version}
        make install
    EOH
    action :nothing
end

file "#{makedir}/squid-#{version}.tar.gz" do
    action :delete
end