More Related Content Similar to 2014/11/08 第3回 一撃サーバー構築シェルスクリプト勉強会(懇親会もあるよ!) 発表資料 (20) More from Yasutaka Hamada (20) 2014/11/08 第3回 一撃サーバー構築シェルスクリプト勉強会(懇親会もあるよ!) 発表資料2. 第3回 一撃サーバー構築シェルスクリプト勉強会
[自己紹介]
名前: 濱田康貴 ( @nullpopopo )
USP友の会
http://www.usptomo.com/
Blog
http://nullpopopo.blogcube.info/
Facebook
https://www.facebook.com/nullpopopo
著書: USP Magazine
教えて先輩♡サーバー運用お助けTIPS
隔月(偶数月号)連載中
26. 第3回 一撃サーバー構築シェルスクリプト勉強会
中で何をしていたかというと・・・
1.yum update
2.fail2banのメール宛先と送信元をroot@localhostに変更
3.iptables設定
4.nginxインストール
5.phpインストール
6.mysqlインストール
7.mysqlパラメータ生成→mysql設定
8.php設定
9.WordPressインストール
10.nginx設定ファイル生成
11.OS再起動
31. 第3回 一撃サーバー構築シェルスクリプト勉強会
スクリプト起動
第1引数が create の場合
第1引数が delete の場合
第1引数が その他の場合
引数が6つでなければ、使い方を表示して異常終了する。
引数が6つであれば、関数CREATEを実行する。
引数が2つでなければ、使い方を表示して異常終了する。
引数が2つであれば、関数DELETEを実行する。
使い方を表示して異常終了する。
32. 第3回 一撃サーバー構築シェルスクリプト勉強会
使い方 (バーチャルホスト作成)
# VHMAINTE create www.example.com "ぬるぽぽぽのブログ"
nullpopopo BlogP@ssw0rd_is_here youremail@example.com
33. 第3回 一撃サーバー構築シェルスクリプト勉強会
使い方 (バーチャルホスト作成)
バーチャルホスト名
# VHMAINTE create www.example.com "ぬるぽぽぽのブログ"
nullpopopo BlogP@ssw0rd_is_here youremail@example.com
34. 第3回 一撃サーバー構築シェルスクリプト勉強会
使い方 (バーチャルホスト作成)
ブログのタイトル
# VHMAINTE create www.example.com "ぬるぽぽぽのブログ"
nullpopopo BlogP@ssw0rd_is_here youremail@example.com
35. 第3回 一撃サーバー構築シェルスクリプト勉強会
使い方 (バーチャルホスト作成)
# VHMAINTE create www.example.com "ぬるぽぽぽのブログ"
nullpopopo BlogP@ssw0rd_is_here youremail@example.com
ブログの
ログインID
36. 第3回 一撃サーバー構築シェルスクリプト勉強会
使い方 (バーチャルホスト作成)
# VHMAINTE create www.example.com "ぬるぽぽぽのブログ"
nullpopopo BlogP@ssw0rd_is_here youremail@example.com
ブログの
ログインパスワード
37. 第3回 一撃サーバー構築シェルスクリプト勉強会
使い方 (バーチャルホスト作成)
# VHMAINTE create www.example.com "ぬるぽぽぽのブログ"
nullpopopo BlogP@ssw0rd_is_here youremail@example.com
メールアドレス
41. 第3回 一撃サーバー構築シェルスクリプト勉強会
# cat bin/VHMAINTE | head
#!/bin/bash
set -e
LANG=C
FQDN=$2
BLOGTITLE=$3
AdminUsername=$4
AdminPassword=$5
AdminEmail=$6
バーチャルホスト作成時に引数として
指定する内容
46. 第3回 一撃サーバー構築シェルスクリプト勉強会
if [ ! -x ${HOME}/bin/wp ];
then
curl -o ${HOME}/bin/wp https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod 700 ${HOME}/bin/wp
fi
一撃シリーズ今回の目玉!wp-cliのインストール!
※ 取得元ファイル: https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
50. 第3回 一撃サーバー構築シェルスクリプト勉強会
関数 CREATE でやっていること
1.DB名を作成する (wpdb0000〜)
2.DBユーザー名を作成する (user0000〜)
3.DBパラメータファイル作成
4.DB作成
5.DBユーザー作成
6.ドキュメントルート作成
7.WordPressインストール
8.nginx設定ファイル生成
9.nginx再起動
51. 第3回 一撃サーバー構築シェルスクリプト勉強会
# cat bin/VHMAINTE | head -n 51 | tail -n 31
CREATE(){
DBNAME=$(printf "wpdb%04dn" $(ls /var/www/ | egrep -v "(^html|gz$|^"${ETH0}")" | wc -l))
DBUSER=$(printf "user%04dn" $(ls /var/www/ | egrep -v "(^html|gz$|^"${ETH0}")" | wc -l))
(中略)
}
バーチャルホスト作成時の処理を
関数「CREATE」にまとめた
52. 第3回 一撃サーバー構築シェルスクリプト勉強会
DBNAME=$(printf "wpdb%04dn" $(ls /var/www/ | egrep -v "(^html|gz$|^"${ETH0}")" | wc -l))
DBUSER=$(printf "user%04dn" $(ls /var/www/ | egrep -v "(^html|gz$|^"${ETH0}")" | wc -l))
DB名とDBユーザー名を連番で作成するため、
/var/www以下のディレクトリ(/var/www/IPア
ドレス と /var/www/html、そしてバックアッ
プファイルを除く)の数をもとに採番する
53. 第3回 一撃サーバー構築シェルスクリプト勉強会
if [ 0 = $(grep ${FQDN} ${PARAMFILE} | wc -l) ];
then
echo "DBPARAM ${DBNAME} ${DBUSER} $(cat /dev/urandom | tr -dc '[:alnum:]' | head -c 8)"
${FQDN} ${BLOGTITLE} ${AdminUsername} ${AdminPassword} ${AdminEmail}>> $
{PARAMFILE}
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}')
-e "create database ${DBNAME} character set utf8;"
PW=$(grep ${FQDN} ${PARAMFILE} | awk '{print $4}')
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}')
-e "GRANT ALL PRIVILEGES on ${DBNAME}.* to ${DBUSER}@localhost identified by "${PW}";"
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}')
-e "FLUSH PRIVILEGES;"
fi
もし引数に指定したFQDNがパラメータファイ
ルになければ、引数の内容をパラメータファ
イルに書き込み、パラメータファイルをもと
にDB作成、ユーザー作成を行い、MySQLの権
限テーブルを再読み込みする。
54. 第3回 一撃サーバー構築シェルスクリプト勉強会
echo "DBPARAM ${DBNAME} ${DBUSER} $(cat /dev/urandom | tr -dc '[:alnum:]' | head -c 8)"
${FQDN} ${BLOGTITLE} ${AdminUsername} ${AdminPassword} ${AdminEmail}>> $
{PARAMFILE}
パラメータファイルへの書き込み処理例:
# VHMAINTE create www.example.com "ぽぽぽぽぽ" nullpopopo BlogP@ssw0rD
yasutaka.hamada@gmail.com
# cat ${HOME}/.mysql/MySQLPARAM | grep www.example.com
DBPARAM wpdb0000 user0000 DB_PASSWORD www.example.com ぽぽぽぽぽ nullpopopo
BlogP@ssw0rD yasutaka.hamada@gmail.com
55. 第3回 一撃サーバー構築シェルスクリプト勉強会
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}')
-e "create database ${DBNAME} character set utf8;"
確認1 データベースが作成されているかの確認:
# mysql -u root -p$(cat ${HOME}/.mysql/MySQLPARAM | grep ^user | awk '{print $NF}') -e
'show databases;'
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| wordpress |
| wpdb0000 |
+--------------------+
56. 第3回 一撃サーバー構築シェルスクリプト勉強会
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}')
-e "create database ${DBNAME} character set utf8;"
確認2 データベースの文字コードが正しいことの確認:
# mysql -u root -p$(cat ${HOME}/.mysql/MySQLPARAM | grep ^user | awk '{print $NF}') -e
'show create database wpdb0000;'
+----------+-------------------------------------------------------------------+
| Database | Create Database |
+----------+-------------------------------------------------------------------+
| wpdb0000 | CREATE DATABASE `wpdb0000` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+-------------------------------------------------------------------+
57. 第3回 一撃サーバー構築シェルスクリプト勉強会
変数 DROOT は /var/www/${FQDN} でしたね
[ ! -d ${DROOT} ] && mkdir -p ${DROOT}
wp core download --locale=ja --path=${DROOT}
cd ${DROOT}
wp core download でWordPressを公式サイトからダウンロードします。
引数に「--locale=ja」を加えることで、日本語版のWordPressをダウン
ロードすることができます。「--path=<フルパス>」でインストール先
ディレクトリを指定できるので、ここではバーチャルホストのドキュメ
ントルートを指定します。
58. 第3回 一撃サーバー構築シェルスクリプト勉強会
wp core config --dbname=$(grep ${FQDN} ${PARAMFILE} | awk '{print $2}')
--dbuser=$(grep ${FQDN} ${PARAMFILE} | awk '{print $3}')
--dbpass=$(grep ${FQDN} ${PARAMFILE} | awk '{print $4}')
wp core config コマンドで wp-config.php を生成する。
前ページでドキュメントルートに移動しているので、--
pathを指定せずにカレントディレクトリで作業する。
59. 第3回 一撃サーバー構築シェルスクリプト勉強会
wp core config --dbname=$(grep ${FQDN} ${PARAMFILE} | awk '{print $2}')
--dbuser=$(grep ${FQDN} ${PARAMFILE} | awk '{print $3}')
--dbpass=$(grep ${FQDN} ${PARAMFILE} | awk '{print $4}')
# cat ${HOME}/.mysql/MySQLPARAM | grep www.example.com
DBPARAM wpdb0000 user0000 DB_PASSWORD www.example.com ぽぽぽぽぽ
nullpopopo BlogP@ssw0rD yasutaka.hamada@gmail.com
# cat ${HOME}/.mysql/MySQLPARAM | grep www.example.com | awk '{print $2}'
wpdb0000
# cat ${HOME}/.mysql/MySQLPARAM | grep www.example.com | awk '{print $3}'
user0000
# cat ${HOME}/.mysql/MySQLPARAM | grep www.example.com | awk '{print $4}'
DB_PASSWORD
60. 第3回 一撃サーバー構築シェルスクリプト勉強会
wp core install --url=${FQDN} --title=${BLOGTITLE}
--admin_user=${AdminUsername} --admin_password=$
{AdminPassword} --admin_email=${AdminEmail}
cd
wp core install コマンドで WordPressをインストール
(wp-config.phpの内容をDBに投入)する。ドキュメント
ルートに移動済なので、--pathを指定せずにカレントディ
レクトリで作業する。
61. 第3回 一撃サーバー構築シェルスクリプト勉強会
cp -p /etc/nginx/conf.d/000_VHOST.conf /etc/nginx/conf.d/$
{FQDN}.conf
IPアドレスでアクセスした時に表示する
バーチャルホストのconfigファイルをも
とに、新しく作成するバーチャルホスト
のconfigファイルを生成(コピー)する。
64. 第3回 一撃サーバー構築シェルスクリプト勉強会
echo " access_log /var/log/nginx/${FQDN}_access.log
main;" >> /etc/nginx/conf.d/${FQDN}.conf
echo " error_log /var/log/nginx/${FQDN}_error.log
warn;" >> /etc/nginx/conf.d/${FQDN}.conf
echo "}" >> /etc/nginx/conf.d/${FQDN}.conf
ログの設定をserverディレクティブに追
記し、一旦削除したディレクティブの閉
じカッコを追記する。
66. 第3回 一撃サーバー構築シェルスクリプト勉強会
# diff /etc/nginx/conf.d/000_VHOST.conf
/etc/nginx/conf.d/www.example.com.conf
2,3c2,3
< server_name 133.242.18.139;
< root /var/www/133.242.18.139;
---
> server_name www.example.com;
> root /var/www/www.example.com;
29a30,32
>
> access_log /var/log/nginx/www.example.com_access.log main;
> error_log /var/log/nginx/www.example.com_error.log warn;
67. 第3回 一撃サーバー構築シェルスクリプト勉強会
# ls -l /var/log/nginx/
合計 28
-rw-r----- 1 nginx adm 589 10月 23 04:12 2014 access.log
-rw-r----- 1 nginx adm 973 10月 22 04:41 2014 access.log-20141021.gz
-rw-r----- 1 nginx adm 737 10月 23 03:04 2014 access.log-20141022.gz
-rw-r----- 1 nginx adm 4174 10月 22 23:54 2014 access.log-20141023
-rw-r----- 1 nginx adm 142 10月 23 03:20 2014 error.log
-rw-r--r-- 1 nginx root 1713 10月 23 04:19 2014 www.example.com_access.log
-rw-r--r-- 1 nginx root 0 10月 20 11:35 2014 www.example.com_error.log
-rw-r--r-- 1 root root 0 10月 20 11:38 2014 www2.example.com_access.log
-rw-r--r-- 1 root root 0 10月 20 11:38 2014 www2.example.com_error.log
68. 第3回 一撃サーバー構築シェルスクリプト勉強会
# cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
72. 第3回 一撃サーバー構築シェルスクリプト勉強会
# cat bin/VHMAINTE | head -n 73 | tail -n 21
DELETE(){
mv /etc/nginx/conf.d/${FQDN}.conf /etc/nginx/conf.d/${FQDN}.conf.DISABLED_$(date +%Y%m%d%H%M%S)
service nginx reload
(中略)
}
バーチャルホスト削除時の処理を
関数「DELETE」にまとめた
73. 第3回 一撃サーバー構築シェルスクリプト勉強会
nginxのバーチャルホスト設定ファイルをリネー
ムし、nginxを再読み込みする
mv /etc/nginx/conf.d/${FQDN}.conf /etc/nginx/conf.d/$
{FQDN}.conf.DISABLED_$(date +%Y%m%d%H%M%S)
service nginx reload
例)
www.example.com.conf
↓
www.example.com.conf.DISABLED_20141020113617
74. 第3回 一撃サーバー構築シェルスクリプト勉強会
# grep include /etc/nginx/nginx.conf
include /etc/nginx/mime.types;
include /etc/nginx/conf.d/*.conf;
/etc/nginx/conf.d ディレクトリ配下にあるファイル名の接尾
語を「.conf」からリネームしてnginxを再起動すれば設定
ファイルのincludeから外れる仕組みを利用する
76. 第3回 一撃サーバー構築シェルスクリプト勉強会
DB名とDB接続ユーザーを変数に格納する
DBNAME=$(grep ${FQDN} ${PARAMFILE} | awk '{print $2}')
DBUSER=$(grep ${FQDN} ${PARAMFILE} | awk '{print $3}')
# grep www.example.com $
{HOME}/.mysql/MySQLPARAM | awk '{print
$2,$3}'
wpdb0000 user0000
77. 第3回 一撃サーバー構築シェルスクリプト勉強会
if [ 1 = $(grep ${FQDN} ${PARAMFILE} | wc -l) ];
then
mysqldump -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}')
${DBNAME} > /var/www/${FQDN}_${DBNAME}_$(date +%Y%m%d).sql
gzip /var/www/${FQDN}_${DBNAME}_$(date +%Y%m%d).sql
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}')
-e "drop database ${DBNAME};"
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}')
-e "DELETE FROM mysql.user WHERE user = '${DBUSER}';"
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}')
-e "FLUSH PRIVILEGES;"
cp -p ${PARAMFILE} ${PARAMFILE}.$(date +%Y%m%d%H%M%S)
grep -v ${DBUSER} ${PARAMFILE}.$(date +%Y%m%d%H%M%S) > ${PARAMFILE}
fi
78. 第3回 一撃サーバー構築シェルスクリプト勉強会
if [ 1 = $(grep ${FQDN} ${PARAMFILE} | wc -l) ];
then
mysqldump -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}')
${DBNAME} > /var/www/${FQDN}_${DBNAME}_$(date +%Y%m%d).sql
gzip /var/www/${FQDN}_${DBNAME}_$(date +%Y%m%d).sql
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}')
-e "drop database ${DBNAME};"
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}')
-e "DELETE FROM mysql.user WHERE user = '${DBUSER}';"
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}')
-e "FLUSH PRIVILEGES;"
cp -p ${PARAMFILE} ${PARAMFILE}.$(date +%Y%m%d%H%M%S)
grep -v ${DBUSER} ${PARAMFILE}.$(date +%Y%m%d%H%M%S) > ${PARAMFILE}
fi
バーチャルホストのFQDNがパラメータファイルに
1行書かれていたら実行する
79. 第3回 一撃サーバー構築シェルスクリプト勉強会
mysqldump -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}')
${DBNAME} > /var/www/${FQDN}_${DBNAME}_$(date +%Y%m%d).sql
gzip /var/www/${FQDN}_${DBNAME}_$(date +%Y%m%d).sql
wpdb0000 データベースの中身が
/var/www/www.example.com_wpdb0000_20141108.sql に
保存された後、gzip圧縮され
/var/www/www.example.com_wpdb0000_20141108.sql.gz
になる。
81. 第3回 一撃サーバー構築シェルスクリプト勉強会
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}')
-e "DELETE FROM mysql.user WHERE user = '${DBUSER}';"
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}')
-e "FLUSH PRIVILEGES;"
user0000 (変数DBUSERに格納されている) を mysql
データベースから削除し、権限情報を再読み込みする。
82. 第3回 一撃サーバー構築シェルスクリプト勉強会
cp -p ${PARAMFILE} ${PARAMFILE}.$(date +%Y%m%d%H%M%S)
grep -v ${DBUSER} ${PARAMFILE}.$(date +%Y%m%d%H%M%S) > ${PARAMFILE}
パラメータファイルをバックアップし、削除対象のFQDN
以外をパラメータファイルに残す。
84. 第3回 一撃サーバー構築シェルスクリプト勉強会
# cat bin/VHMAINTE | tail -n 14
case "$1" in
[cC][rR][eE][aA][tT][eE])
[ ! $# = 6 ] && echo "USAGE: $(basename $0) create FQDN BLOGTITLE
AdminUsername AdminPassword AdminEmail" && exit 1
CREATE
;;
[dD][eE][lL][eE][tT][eE])
[ ! $# = 2 ] && echo "USAGE: $(basename $0) delete FQDN" && exit 1
DELETE
;;
*)
echo "USAGE: $(basename $0) <create|delete> FQDN BLOGTITLE
AdminUsername AdminPassword AdminEmail"
exit 1
;;
esac
86. 第3回 一撃サーバー構築シェルスクリプト勉強会
IPアドレスのバーチャルホストでWordPressを使えるようにする
# ETH0=$(ip a show eth0 | grep inet | grep -v inet6 | awk '{print
$2}' | sed -e "s//[0-9]*//") ; wp core install --url=${ETH0}
--title="WordPressでシェル芸" --admin_user=nullpopopo
--admin_password=Bl0gP@ssw0rd
--admin_email=yasutaka.hamada@gmail.com --path=/var/www/${ETH0}
実行後
Success: WordPress installed successfully.
と表示されればOK
89. 第3回 一撃サーバー構築シェルスクリプト勉強会
IPアドレスのバーチャルホストでWordPressを使えるようにする
# wp post list --path=/var/www/<IPアドレス>/
+----+--------------+-------------+---------------------+-------------+
| ID | post_title | post_name | post_date | post_status |
+----+--------------+-------------+---------------------+-------------+
| 1 | Hello world! | hello-world | 2014-10-25 17:53:51 | publish |
+----+--------------+-------------+---------------------+-------------+
90. 第3回 一撃サーバー構築シェルスクリプト勉強会
PostID 1のタイトルを変更してみる
※ 事前確認
# wp post get 1 --field=post_title --path=/var/www/<IPアドレス>/
Hello world!
※ タイトル変更
# wp post update 1 --post_title="(っ´∀`)っ ゃー" --path=/var/www/<IPアド
レス>/
Success: Updated post 1.
※ 事後確認
# wp post get 1 --field=post_title --path=/var/www/<IPアドレス>/
(っ´∀`)っ ゃー
92. 第3回 一撃サーバー構築シェルスクリプト勉強会
コマンドラインから新しい記事を投稿してみる
※ いきなり公開状態でポスト名をUNIXタイムにし、ポストタイトル
を「ぬるぽぽぽ」、本文を「(っ´∀`)っ ゃー」で投稿する
# wp post create --post_status=publish --post_name=$(date +%s)
–-post_title='ぬるぽぽぽ' --post_content='(っ´∀`)っ ゃー' -–
path=/var/www/<IPアドレス>/
Success: Created post 4.