準備
前回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で保存
#!/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で保存
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に書かれているフォルダを実行時に一緒にアップロードします
../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の独自記法を覚える必要もありません
実際に書いてみましょう
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.shyum_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を分割してみましょう
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.propertiesrun_all_apache_test.txt
apache_test ${ENV} -i server_all.txtrun_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の機能を紹介
目次