redisのソースインストール(chef-solo)

こんにちは。opsのほうの小宮です。
redisのソースインストールをご依頼いただきCHEF-SOLOったのでその記録をのこしておきます。

★要件
バージョンについては2.8.4でお願いします。(2014/1時点で最新のソース)

★以下作業
・rpmで入るバージョンの確認(※同環境のサーバでyumで確認)
redis.x86_64 0:2.4.10-1.el6

※要件に合わないためソースインストールする必要がある

・chef-soloの下準備

[shell]$ ssh-copy-id -i ~/.ssh/id_dsa.pub server2
$ ssh-copy-id -i ~/.ssh/id_dsa.pub server1

$ knife solo prepare server1
$ knife solo prepare server2[/shell]

・role作成
[shell]$ vi roles/rankingAPI.json
{
"name":"rankingAPI",
"chef_type": "role",
"json_class":"Chef::Role",
"default_attributes":{
"base_setting": {
"swappiness": "0",
"tcp_tw_reuse": "0",
"tcp_tw_recycle": "0",
"tcp_fin_timeout": "10",
"tcp_max_syn_backlog": "8192",
"somaxconn": "8192",
"ntpserver1": "ntp.nict.jp"
}
},
"override_attributes":{},
"description":"rankingAPI’s role",
"run_list": [
"recipe[roles::rankingAPI]"
]
}

$ vi site-cookbooks/roles/recipes/rankingAPI.rb
include_recipe "base_setting::common-pkgs"
include_recipe "base_setting::sysctl"
include_recipe "base_setting::ntpd"
#include_recipe "base_setting::rps_cpus"
include_recipe "login-users::create_user"
include_recipe "login-users::key_copy"
#include_recipe "java::java"
#include_recipe "nginx::nginx"
#include_recipe "play::play"
#include_recipe "mysqld::mysql-client"
#include_recipe "git::git"
include_recipe "redis::redis"[/shell]

※作業対象でないレシピは、一旦コメントアウトしてます

・node編集
[shell]$ vi nodes/server1.json
$ vi nodes/server2.json
{
"run_list":[
"role[rankingAPI]"
]
}[/shell]

・クックブック作成
[shell]$ cd ~/chef-repo
$ knife cookbook create redis -o site-cookbooks[/shell]

・必要なファイル、deta_bags、レシピを用意
[shell]$ mkdir -p site-cookbooks/redis/files/default/usr/local/src
$ cd site-cookbooks/redis/files/default/usr/local/src
$ wget http://download.redis.io/releases/redis-2.8.4.tar.gz
$ cd ~/chef-repo
$ knife solo data bag create pkg_versions redis
{
"id": "redis",
"version": "2.8.4"
}
$ knife solo data bag edit pkg_versions redis

$ vim site-cookbooks/redis/recipes/redis.rb
—————————————-
version = data_bag_item(‘pkg_versions’,’redis’)[‘version’]
redis_pkg="redis-#{version}"
cookbook_file "/usr/local/src/#{redis_pkg}.tar.gz" do
not_if "ls /usr/local/src/#{redis_pkg}.tar.gz"
source "usr/local/src/#{redis_pkg}.tar.gz"
end

%W{tcl make gcc}.each do |pkg|
package pkg do
action :install
not_if "’rpm -qa|grep #{pkg}"
end
end

bash "redis-install" do
not_if "which redis-cli"
code <<-EOC
cd /usr/local/src
tar zxf #{redis_pkg}.tar.gz
cd #{redis_pkg}
make -j && make install
EOC
end

directory "/etc/redis" do
not_if "ls /etc/redis"
mode 0755
action :create
recursive false
end

directory "/usr/local/redis" do
not_if "ls /usr/local/redis"
mode 0755
action :create
recursive false
end

cookbook_file "/etc/init.d/redis" do
source "/etc/init.d/redis"
mode 0754
end

cookbook_file "/etc/redis/6379.conf" do
source "etc/redis/6379.conf"
mode 0644
notifies :restart, ‘service[redis]’
end

cookbook_file "/etc/logrotate.d/redis" do
source "etc/logrotate.d/redis"
mode 0644
end

service "redis" do
not_if "ps -ef|grep redis|grep -v grep"
supports :status => true, :restart => true
action [ :enable, :start ]
end
—————————————-

$ knife cookbook test redis

$ sudo cp -p utils/redis_init_script /etc/init.d/redis
$ diff /etc/init.d/redis /usr/local/src/redis-2.8.4/utils/redis_init_script
5,9d4
< # chkconfig: – 85 15
< # description: redis-server
< # processname: redis
<
< . /etc/rc.d/init.d/functions
14d8
< prog=$(basename $EXEC)
15a10
> PIDFILE=/var/run/redis_${REDISPORT}.pid
17d11
< PIDFILE=grep pidfile ${CONF} |awk '{print $2}'
19c13,14
< start() {

> case "$1" in
> start)
26,27d20
< sleep 2
< echo -100 > /proc/cat $PIDFILE/oom_score_adj
29,30c22,23
< }
< stop() {

> ;;
> stop)
45,60d37
< }
<
< rh_status() {
< status $prog
< }
<
< case "$1" in
< start)
< start
< ;;
< stop)
< stop
< ;;
< restart)
< stop
< start
62,64d38
< status)
< rh_status
< ;;

$ mkdir -p site-cookbooks/redis/files/default/etc/init.d
$ vim site-cookbooks/redis/files/default/etc/init.d/redis
—————————————-
#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
# chkconfig: – 85 15
# description: redis-server
# processname: redis

. /etc/rc.d/init.d/functions

REDISPORT=6379
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli
prog=$(basename $EXEC)

CONF="/etc/redis/${REDISPORT}.conf"
PIDFILE=grep pidfile ${CONF} |awk '{print $2}'

start() {
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis server…"
$EXEC $CONF
sleep 2
echo -100 > /proc/cat $PIDFILE/oom_score_adj
fi
}
stop() {
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping …"
$CLIEXEC -p $REDISPORT shutdown
while [ -x /proc/${PID} ]
do
echo "Waiting for Redis to shutdown …"
sleep 1
done
echo "Redis stopped"
fi
}

rh_status() {
status $prog
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
rh_status
;;
*)
echo "Please use start or stop as first argument"
;;
esac
—————————————-[/shell]
修正したのは、chkconfigに追加できるようにとrestartとstatusできるようにしたのと、oom_killer対策とpidはconfigから読むようにした程度。
restartやstatusできないとchef側のserviceリソースで起動できないようでした。
ソースパッケージに同梱されている起動スクリプトはrh系OS向けのはなさそうでした。

[shell]cd site-cookbooks/redis/files/default/usr/local/src
$ tar xf redis-2.8.4.tar.gz redis-2.8.4/redis.conf
mkdir -p ~/chef-repo/site-cookbooks/redis/files/default/etc/redis
cp -p redis-2.8.4/redis.conf ~/chef-repo/site-cookbooks/redis/files/default/etc/redis/6379.conf
vi ~/chef-repo/site-cookbooks/redis/files/default/etc/redis/6379.conf
$ diff ~/chef-repo/site-cookbooks/redis/files/default/etc/redis/6379.conf redis-2.8.4/redis.conf
37c37
< daemonize yes

> daemonize no
94c94
< logfile "/var/log/redis.log"

> logfile ""
178,179c178
< #dir ./
< dir /usr/local/redis

> dir ./

$ cd ~/chef-repo
$ mkdir -p site-cookbooks/redis/files/default/etc/logrotate.d/
$ vi site-cookbooks/redis/files/default/etc/logrotate.d/redis
/var/log/redis.log {
weekly
missingok
copytruncate
rotate 12
compress
notifempty
}[/shell]

・レシピ適用
[shell]$ knife solo cook server1
$ knife solo cook server2[/shell]

・確認(ssh後)
[shell]$ logrotate -d /etc/logrotate.d/redis
$ ps -ef|grep redis
$ netstat -lnpt
$ sudo service redis status
redis-server (pid 21560) is running…
$ redis-cli
$ cat /proc/cat /var/run/redis.pid/oom_score_adj
-100
$ tail /etc/sysctl.conf
$ ll /home
$ sudo su –
$ sudo ls -lha /home/*/.ssh/
$ ntpq -p[/shell]

・参考
さくらVPS(CentOS6.3)へのredisインストールとchkconfigへの登録 – えんたつの記録
redis 2.2.12のインストールメモ(amazon Linux) – developer’s diary
CentOS/Mac OSXへのRedis導入手順 – memcacheライクなKey-Value方式と、永続化対応のインメモリDB – 酒と泪とRubyとRailsと
[CentOS]redisインストール – Qiita [キータ]
Redis使おうとしていろいろやったメモ – Qiita [キータ]
redis-debian/src/etc/logrotate.d/redis-server at master · mpillar/redis-debian · GitHub
Download – Redis
OOM Killer に殺されないようにする – いますぐ実践! Linuxシステム管理 / Vol.238

以上、見ていただいてありがとうございました。

おすすめ記事