構成管理ツールfairy support runで行うサーバー管理入門
基本機能紹介1(apache httpサーバーのインストールを例に)

準備

前回fairy support runのインストールと基本的な動かし方を紹介しました
今回はhttpサーバーのインストールを例に基本機能の紹介を行います
こちらからサンプルをダウンロードしてください

実行環境の起動

前回vagrantを起動したままにしている場合vagrant haltでシャットダウンしてください
ダウンロードしてきたサンプル内のvagrantフォルダに移動
vagrant up
と入力

cd vagrant
vagrant up

VirtualBoxマネージャーを起動すると仮想環境が2つ起動しているのが確認できます

環境の初期化

立ち上げた仮想環境はDNSの設定もされていませんし、yumのupdateもされてないので、fairy support runを使って行っていきます
ダウンロードしてきたサンプル内のfairysupport_runフォルダに移動
java -jar com_fairysupport_run.jar dnsを実行
java -jar com_fairysupport_run.jar yum_initを実行

cd fairysupport_run
java -jar com_fairysupport_run.jar dns
java -jar com_fairysupport_run.jar yum_init

java -jar com_fairysupport_run.jar dnsでDNSの設定が行われました
java -jar com_fairysupport_run.jar yum_initでyumのupdateと必要なソフトウェアのインストールが行われました

シェルの作成

apache httpサーバーをインストールシェルを作っていきましょう
ダウンロードしてきたサンプル内のfairysupport_runフォルダに移動
apache_testというフォルダを作成します
作成したapache_testフォルダ内にmain.shというファイルを作成します
改行コードにCRが入らないようにしましょう。CR+LFでなく、LFで保存

main.sh
#!/bin/bash

sudo -S yum -y install httpd

sudo -S firewall-cmd --permanent --zone=public --add-service=http
sudo -S firewall-cmd --permanent --zone=public --add-service=https
sudo -S firewall-cmd --reload

sudo -S systemctl start httpd.service
sudo -S systemctl enable httpd.service

main.shの内容
yumでhttpdをインストールしています
firewalldにhttp、httpsを許可しています
httpdを起動します
httpdの自動起動を有効にします


ファイル構成
     |-- fairysupport_run
     |   |-- apache_test
     |   |   `-- main.sh
     |   |-- com_fairysupport_run.jar
     |   |-- env.txt
     |   `-- server.properties.local
     |-- vagrant
     |   `-- Vagrantfile

server.propertiesの切り替え

前回server.propertiesを作成しましたが、サンプルはserver.properties.localというファイルになっています
env.txtの中身を見てみましょう。localと記載されています。env.txtという名前のファイルを用意するとserver.propertiesの接尾辞を記載しておくことができます
server.properties.local、server.properties.dev、server.properties.stg、server.properties.prdとファイルを用意した場合、env.txtの中身を変えれば、使用するserver.propertiesを切り替えることが可能となります

fairy support runの実行

実行してみます
com_fairysupport_run.jarの置いてあるフォルダに移動
java -jar com_fairysupport_run.jar apache_test
と入力

cd fairysupport_run
java -jar com_fairysupport_run.jar apache_test

実行すると出力内容でapache httpサーバーがインストールされたのがわかると思います
ブラウザでhttp://localhost:8080にアクセスしてみましょう
ブラウザでhttp://localhost:8181にアクセスしてみましょう
両方とも正常にページが表示されていると思います
2つの環境にapache httpサーバーをインストールすることができました
今までjava -jarと入力してきましたが、毎回java -jarと入力するのは面倒です
サンプル内のfairysupport_run配下にfairysupport_run.batとfairysupport_run.shがあります
これを利用すれば毎回java -jarと入力する必要はありません。使用しているOSによってbatを使うかshを使うか選んでください。下記で実行可能です

fairysupport_run.bat apache_test
./fairysupport_run.sh apache_test

ファイルのアップロード

apache httpサーバーのインストールができましたが、通常この後、設定ファイルをカスタマイズしなければなりません。
設定ファイルを用意し、どのサーバーに対しても同じ設定ファイルを設置するようにしていきましょう
ダウンロードしてきたサンプル内のfairysupport_run/apache配下のhttpd.confをコピーし、先ほど作成したapache_testフォルダ内にペーストしましょう

ファイル構成
     |-- fairysupport_run
     |   |-- apache_test
     |   |   |-- httpd.conf
     |   |   `-- main.sh
     |   |-- com_fairysupport_run.jar
     |   |-- env.txt
     |   `-- server.properties.local
     |-- vagrant
     |   `-- Vagrantfile

設定ファイルを設置できるようにシェルを修正しましょう

main.sh
#!/bin/bash

sudo -S yum -y install httpd

sudo -S mv /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bk

sudo -S \cp -f ./httpd.conf /etc/httpd/conf/httpd.conf
sudo -S chmod 644 /etc/httpd/conf/httpd.conf

sudo -S semanage fcontext -a -t httpd_config_t /etc/httpd/conf/httpd.conf
sudo -S restorecon -v /etc/httpd/conf/httpd.conf

sudo -S firewall-cmd --permanent --zone=public --add-service=http
sudo -S firewall-cmd --permanent --zone=public --add-service=https
sudo -S firewall-cmd --reload

sudo -S systemctl restart httpd.service
sudo -S systemctl enable httpd.service

main.shの修正内容
mvで設定ファイルのバックアップを取っています
apache_test内のファイルはfairy support runの実行でアップロードされるので、アップロードされた設定ファイルをcpで置き換えます。cpの前についている\はfオプションを有効にするため意図的につけています
chmodで権限設定しています
semanage、restoreconでSELinux対応をしています
これでfairy support runを実行するとhttpd.confのバックアップを取り、httpd.confの置き換えが行われます


共通処理化

バックアップを取ったり、ファイルを置き換えたり、ファイルのラベルを設定する処理はよく行う処理です
あらかじめ共通処理にまとめておきましょう
apache_testと同階層にcommon_testというフォルダを作成します
作成したcommon_testフォルダ内にcommon.shというファイルを作成します
改行コードにCRが入らないようにしましょう。CR+LFでなく、LFで保存

common.sh

bk_cp_mode_label() {
  sudo -S mv "${2}" "${2}.bk"
  sudo -S \cp -f "${1}" "${2}"
  sudo -S chmod ${3} "${2}"
  sudo -S semanage fcontext -a -t "${4}" "${2}"
  sudo -S restorecon -v "${2}"
}

common.shの内容
上記で修正したmain.shのバックアップからSELinux対応までを関数にしました


apache_testフォルダ内にinclude.txtというファイルを作成します
include.txtの内容は../common_testとします
include.txtという名前のファイルを作成すると、fairy support runはinclude.txtに書かれているフォルダを実行時に一緒にアップロードします

include.txt
../common_test

共通処理を利用するようにシェルを修正しましょう

main.sh
#!/bin/bash

. ../common_test/common.sh

sudo -S yum -y install httpd

bk_cp_mode_label "./httpd.conf" "/etc/httpd/conf/httpd.conf" 644 httpd_config_t

sudo -S firewall-cmd --permanent --zone=public --add-service=http
sudo -S firewall-cmd --permanent --zone=public --add-service=https
sudo -S firewall-cmd --reload

sudo -S systemctl restart httpd.service
sudo -S systemctl enable httpd.service

main.shの修正内容
共通関数が書かれたファイルを読み込みます。. ../common_test/common.shを追記しています。ドット半角スペースcommon.shへの相対パスとなります。半角スペースの前にドットを忘れると共通関数が使えません
common.sh内に作成した関数bk_cp_mode_labelを呼んでいます


ファイル構成
     |-- fairysupport_run
     |   |-- apache_test
     |   |   |-- httpd.conf
     |   |   |-- include.txt
     |   |   `-- main.sh
     |   |-- common_test
     |   |   `-- common.sh
     |   |-- com_fairysupport_run.jar
     |   |-- env.txt
     |   `-- server.properties.local
     |-- vagrant
     |   `-- Vagrantfile

これでfairy support runを実行するとcommon_testフォルダも一緒にアップロードされているのがわかります

実行ファイルの作成と引数

今度はenv.txtの内容をシェルに渡して、env.txtの内容によってhttpd.confを変える処理を入れてみましょう
今まではfairy support runの引数にフォルダ名を渡していましたが、ファイル名を与えることができます
引数に与えることができるファイルを作成してみましょう
com_fairysupport_run.jarと同階層にrun_apache_test.txtというファイルを作成してください
run_apache_test.txtの内容は下記です


run_apache_test.txt
apache_test ${ENV} -f server.properties

run_apache_test.txtの内容
${ENV}と書くとfairy support runの実行時にenv.txtの内容になります
${ENV}の他に使用できる特殊変数は下記です
${整数}:引数、${DATE}:実行日、${HH}:実行時刻の時部分、${MM}:実行時刻の分部分、${SS}:実行時刻の秒部分
fオプションはサーバ情報が記載されたファイルを指定するオプションです。今までfオプションを指定しませんでしたが、fオプションを省略した場合、server.propertiesを指定したことになります


次にダウンロードしてきたサンプル内のfairysupport_run/apache配下のhttpd.conf.dev、httpd.conf.localをコピーし、apache_testフォルダ内にペーストしましょう


次にシェルを修正しましょう

main.sh
#!/bin/bash

. ../common_test/common.sh

sudo -S yum -y install httpd

bk_cp_mode_label "./httpd.conf.${1}" "/etc/httpd/conf/httpd.conf" 644 httpd_config_t

sudo -S firewall-cmd --permanent --zone=public --add-service=http
sudo -S firewall-cmd --permanent --zone=public --add-service=https
sudo -S firewall-cmd --reload

sudo -S systemctl restart httpd.service
sudo -S systemctl enable httpd.service

main.shの修正内容
bk_cp_mode_labelの第1引数を./httpd.conf.${1}にしました。apache_testの第1引数に${ENV}を指定したので、env.txtの内容が${1}に格納されています


ファイル構成
     |-- fairysupport_run
     |   |-- apache_test
     |   |   |-- httpd.conf.dev
     |   |   |-- httpd.conf.local
     |   |   |-- include.txt
     |   |   `-- main.sh
     |   |-- common_test
     |   |   `-- common.sh
     |   |-- com_fairysupport_run.jar
     |   |-- env.txt
     |   |-- run_apache_test.txt
     |   `-- server.properties.local
     |-- vagrant
     |   `-- Vagrantfile

実行してみましょう。下記のように拡張子まで含めてファイル名を与えると実行できます

fairysupport_run.bat run_apache_test.txt

./fairysupport_run.sh run_apache_test.txt

httpd.conf.localが/etc/httpd/conf/配下にhttpd.confとして置かれます

冪等性

上記のapache_testを何回も実行すると毎回シェルに記載した内容が全て実行されてしまいます。
ツールによっては独自記法の中で1回しか行わないように自動的に制御するものや、実行させない為のif文をYAMLやJSONで記載させるものもあります。
fairy support runは自分でif文を書くことになります。しかし、これは大したif文ではありません。非常に簡単なif文だけで実現できます
ツールがコマンドを実行してくれる条件を調べる必要もないですし、実行させないためのYAMLやJSONの独自記法を覚える必要もありません
実際に書いてみましょう

common.sh

yum_installed_exit() {
  if sudo -S yum list installed | grep "${1}" > /dev/null 2>&1; then
    echo "${2}"
    exit 0
  fi
}

bk_cp_mode_label() {
  sudo -S mv "${2}" "${2}.bk"
  sudo -S \cp -f "${1}" "${2}"
  sudo -S chmod ${3} "${2}"
  sudo -S semanage fcontext -a -t "${4}" "${2}"
  sudo -S restorecon -v "${2}"
}

common.shの修正内容
yum_installed_exitという関数を追加しました
yum list installedコマンドで既にインストール済みか確認して、インストール済みならメッセージを出力してシェルを終了するというだけです


シェルに上記で追加した関数を入れてみましょう

main.sh
#!/bin/bash

. ../common_test/common.sh

yum_installed_exit "httpd" "Apache HTTP SERVER is already installed"

sudo -S yum -y install httpd

bk_cp_mode_label "./httpd.conf.${1}" "/etc/httpd/conf/httpd.conf" 644 httpd_config_t

sudo -S firewall-cmd --permanent --zone=public --add-service=http
sudo -S firewall-cmd --permanent --zone=public --add-service=https
sudo -S firewall-cmd --reload

sudo -S systemctl restart httpd.service
sudo -S systemctl enable httpd.service

main.shの修正内容
yum_installed_exitの呼び出しを追記しました
これでhttpdがインストール済みの場合、yum_installed_exitより下行は実行されません


これで十分だと思うのですが、他のコマンドも必要な時だけ実行される関数を作成してみましょう

common.sh

yum_installed_exit() {
  if sudo -S yum list installed | grep "${1}" > /dev/null 2>&1; then
    echo "${2}"
    exit 0
  fi
}

yum_install() {
  if ! sudo -S yum list installed | grep "${1}" > /dev/null 2>&1; then
     sudo -S yum -y install "${2}"
  fi
}

bk_cp_mode_label() {
  if ! sudo -S diff "${1}" "${2}" > /dev/null 2>&1; then
    sudo -S mv "${2}" "${2}.bk"
    sudo -S \cp -f "${1}" "${2}"
    sudo -S chmod ${3} "${2}"
    sudo -S semanage fcontext -a -t "${4}" "${2}"
    sudo -S restorecon -v "${2}"
  fi
}

systemctl_start() {
  if sudo -S systemctl status "${1}" | grep "Active: inactive" > /dev/null 2>&1; then
    sudo -S systemctl start "${1}.service"
  fi
}

systemctl_enable() {
  if sudo -S systemctl is-enabled "${1}" | grep disabled > /dev/null 2>&1; then
    sudo -S systemctl enable "${1}.service"
  fi
}

firewalld_add_service() {
  if ! echo " `sudo -S firewall-cmd --list-services --permanent --zone=public` " | grep " ${1} " > /dev/null 2>&1; then
      sudo -S firewall-cmd --permanent --zone=public --add-service="${1}"
      sudo -S firewall-cmd --reload
  fi
}

common.shの修正内容
yum_installという関数を追加しました。yumでインストール済みでない場合、yum installが実行される関数です
bk_cp_mode_labelという関数を修正しました。コピー元のファイルとコピー先のファイルの内容が異なる場合のみ、処理が実行されるように修正しました
systemctl_startという関数を追加しました。サービスが停止状態の場合、サービスがstartされる関数です
systemctl_enableという関数を追加しました。サービスが自動起動しない場合、サービスを自動起動設定にする関数です
firewalld_add_serviceという関数を追加しました。サービスがpublicゾーンに無い場合、publicゾーンに追加する関数です


シェルに上記で追加した関数を入れてみましょう

main.sh
#!/bin/bash

. ../common_test/common.sh

yum_installed_exit "httpd" "Apache HTTP SERVER is already installed"

yum_install httpd httpd

bk_cp_mode_label "./httpd.conf.${1}" "/etc/httpd/conf/httpd.conf" 644 httpd_config_t

firewalld_add_service http
firewalld_add_service https

systemctl_start httpd
systemctl_enable httpd

main.shの修正内容
common.shに増やした関数を呼び出すように修正しました


実行してみましょう

fairysupport_run.bat run_apache_test.txt

./fairysupport_run.sh run_apache_test.txt

httpdがインストール済みなら
Apache HTTP SERVER is already installed
とメッセージが出力されて処理が終了します

server.propertiesの分割

server.properties.localにサーバー情報を2つ記載して、2つの環境に対して処理を実行してきましたが、httpサーバーのインストールはwebサーバーにのみ行う作業です
しかし、ユーザー追加やグループ追加はwebサーバーにもDBサーバーにも行う作業です
server.properties.localに記載したserver1をwebサーバー、server2をDBサーバーに見立ててserver.propertiesを分割してみましょう

server_web.properties.local
server1.user=vagrant
server1.password=vagrant
server1.address=127.0.0.1
server1.port=2230
server1.keyPath=C:\\fairy_support_run_sample\\.vagrant\\machines\\vm1\\virtualbox\\private_key
server1.passphrase=
server_db.properties.local
server1.user=vagrant
server1.password=vagrant
server1.address=127.0.0.1
server1.port=2240
server1.keyPath=C:\\fairy_support_run_sample\\.vagrant\\machines\\vm2\\virtualbox\\private_key
server1.passphrase=
server_all.txt
server_web.properties
server_db.properties
run_all_apache_test.txt
apache_test ${ENV} -i server_all.txt
run_apache_test.txt
apache_test ${ENV} -f server_web.properties
ファイル構成
     |-- fairysupport_run
     |   |-- apache_test
     |   |   |-- httpd.conf.dev
     |   |   |-- httpd.conf.local
     |   |   |-- include.txt
     |   |   `-- main.sh
     |   |-- common_test
     |   |   `-- common.sh
     |   |-- com_fairysupport_run.jar
     |   |-- env.txt
     |   |-- run_apache_test.txt
     |   |-- run_all_apache_test.txt
     |   |-- server_all.txt
     |   |-- server_web.properties.local
     |   `-- server_db.properties.local
     |-- vagrant
     |   `-- Vagrantfile

server_web.properties.local、server_db.properties.local、server_all.txt、run_all_apache_test.txtの4ファイルを作成しました
run_apache_test.txtを修正しました
run_all_apache_test.txtにはiオプションでserver_all.txtが指定されています。server_all.txtには2つのpropertiesファイル名が書かれています
見た通り、分割したproperties名を記載したファイルをiオプションでfairy support runに渡し、複数のサーバー上でシェルを実行することができます

実行してみましょう

fairysupport_run.bat run_all_apache_test.txt

./fairysupport_run.sh run_all_apache_test.txt

server_web.properties.localとserver_db.properties.localに記載されたサーバー上でシェルが実行されます


fairysupport_run.bat run_apache_test.txt

./fairysupport_run.sh run_apache_test.txt

server_web.properties.localに記載されたサーバー上でのみシェルが実行されます


次ページmysql dumpを例にfairy support runの機能を紹介

目次