シェルスクリプト達はGitリポジトリにあるので、作業用のディレクトリにコピーする。そのとき使うのが PROV.sh 。その他のファイルは
- config.sh → Global.conf.sh にリネーム
- functions.sh
- main.sh → 削除
- wrap.sh → 削除
- *.prov.sh
- *.conf.sh
- *.Sample
作業用ディレクトリにコピーしてから、いじる必要があるのは *.conf.sh だけにしたい。
PROV.sh が行う作業は、
作業用ディレクトリで行う作業は、
- *.conf.sh ファイルを編集する
- その他 *.sh 以外のファイルはサンプルなので編集する。
- 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=止まらせる
- RUNTIME_PROV_DIR 廃止する。いったんは "." にセットする。
- PROV_FORCE_INSTALL インストールを必須と強制する。
- PROV_FORCE_CONFIG コンフィグレーションを必須と強制する。nginx.conf.sh にある。
- PROV_FORCE_CP 上書きになってもコピーする。意味あるか? nginx.conf.sh にある。
方式
シェルプロセスの環境変数をブラックボードとする通信方式。*.config.sh 達はブラックボードライターになる。*.prov.sh 達はブラックボードリーダーで、ライターとリーダーは完全に分離している。
複数のブラックボードライターがいるので、ライターによる上書きは起こるが、実行順が「一般 → 特殊」なので、問題は少ない。が、兄弟の関係の実行順だと、親の環境が兄により上書きされていて、弟にとって都合が悪いことがあるかも知れない。要注意。