過去スクリプトの使い方 2

シェルスクリプト達はGitリポジトリにあるので、作業用のディレクトリにコピーする。そのとき使うのが PROV.sh 。その他のファイルは

  1. config.sh → Global.conf.sh にリネーム
  2. functions.sh
  3. main.sh → 削除
  4. wrap.sh → 削除
  5. *.prov.sh
  6. *.conf.sh
  7. *.Sample

作業用ディレクトリにコピーしてから、いじる必要があるのは *.conf.sh だけにしたい。

PROV.sh が行う作業は、

  1. 変更しないで使うプロビジョニングスクリプトをコピー
  2. 変更して使うスクリプト/ファイルのサンプルである *.Sample を .Sample 拡張子を取った名前でコピー

作業用ディレクトリで行う作業は、

  1. *.conf.sh ファイルを編集する
  2. その他 *.sh 以外のファイルはサンプルなので編集する。
  3. run.sh を実行する。


以下に function.sh を貼る。

#!/bin/sh
# -*- coding: utf-8-unix -*-

echo This is functions.

function file_not_exist {
    [ ! -f $1 ]
}

function need_install {
    [ ! -f $1 -o -n "$PROV_FORCE_INSTALL" ]
}

function need_config {
    [ ! -f $1 -o -n "$PROV_FORCE_CONFIG" ]
}

function start_message {
    name=$1
    echo ""
    echo "***"
    echo "*** Setting up $name."
    echo "***"
}

# 無意味だった
function show_this_file {
    echo "* This is $0."
}

function show_env {
    var_name=$1
#    eval "echo \* $var_name=\${${var_name}}" # old style
    echo "* $var_name=${!var_name}" # new style
}

function message {
    echo "* $0: " $*
}

function make_prev {
    path=$1
    rm -f $path.prev
    if [ -f $path ]; then
	cp $path $path.prev
    fi
}

function make_diff {
    path=$1
    diff -u $path.prev $path > $path.diff
}

#* 特定のファイルが存在しない場合に、指定のパッケージをインストールする
function install_unless {
    file=$1
    pkg=$2

    if [ ! -f $file -o -n "$PROV_FORCE_INSTALL" ]; then
	yum -y install $pkg
    fi
}

#* 特定のコマンドがwhichで見つからない場合に、そのコマンドをインストールする
# コマンド名とパッケージ名が同じ時にしか使えないので注意。
function install_which {
    cmd=$1

    which $1
    if [ $? -ne 0 ]; then
	yum -y install $cmd
    fi
}


function cp_unless {
    src=$1
    dst=$2
    if [ ! -f $dst -o -n "$PROV_FORCE_CP" ]; then
	echo "* copy $src --> $dst"
	cp $src $dst
    fi
}

function source_if {
    src=$1

    if [ -f $src ]; then
	source $src
    fi
}

function stop_service {
    service=$1
    service $service status
    if [ $? -eq 1 ]; then
	return
    fi
    service $service status | grep running > /dev/null
    if [ $? -eq 0 ]; then
	service $service stop
    fi
}

function set_service {
    service=$1
    service $service status
    if [ $? -eq 1 ]; then
	return
    fi

    service $service status | grep running > /dev/null
    if [ $? -eq 0 ]; then
	service $service reload
    else
	service $service start
    fi
    chkconfig $service on
    echo "chkconfig:"
    chkconfig --list $service
}

function unset_service {
    service=$1
    service $service status
    if [ $? -ne 0 ]; then
	return
    fi

    service $service status | grep running > /dev/null
    if [ $? -eq 0 ]; then
	service $service stop
    fi
    chkconfig $service off
    echo "chkconfig:"
    chkconfig --list $service
}
気づいたこと
  • show_this_file は show_this_script_name とかがいい。使ってないようだけど。
  • show_this_file が無意味なのは、call ではなくて soruce でスクリプト連鎖しているので、親プロセスのシェルの名前が $0 に入っている。結局、当該のスクリプトの名前は出ない。
  • yum に依存している。AlmaLinux でもしばらくは名前 "yum" を使えるようだ。
  • which = /usr/bin/which は使えないことがある。
  • ネーミングルール unless=存在しないなら、if=存在するなら
  • ネーミングルール set=動くようにする、unset=止まらせる

環境変数

  1. RUNTIME_PROV_DIR 廃止する。いったんは "." にセットする。
  2. PROV_FORCE_INSTALL インストールを必須と強制する。
  3. PROV_FORCE_CONFIG コンフィグレーションを必須と強制する。nginx.conf.sh にある。
  4. PROV_FORCE_CP 上書きになってもコピーする。意味あるか? nginx.conf.sh にある。
方式

シェルプロセスの環境変数をブラックボードとする通信方式。*.config.sh 達はブラックボードライターになる。*.prov.sh 達はブラックボードリーダーで、ライターとリーダーは完全に分離している。

複数のブラックボードライターがいるので、ライターによる上書きは起こるが、実行順が「一般 → 特殊」なので、問題は少ない。が、兄弟の関係の実行順だと、親の環境が兄により上書きされていて、弟にとって都合が悪いことがあるかも知れない。要注意。