More Related Content Similar to 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料 (20) More from Yasutaka Hamada (20) 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料2. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
[自己紹介]
名前: 濱田康貴 ( @nullpopopo )
USP友の会
http://www.usptomo.com/
Blog
http://nullpopopo.blogcube.info/
Facebook
https://www.facebook.com/nullpopopo
著書: USP Magazine
教えて先輩♡サーバー運用お助けTIPS
隔月(偶数月号)連載中
15. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
定例会
偶数月に開催。最近はシェル芸勉強会の懇親会を兼ねている。
要するに飲み会。
シェル芸勉強会
偶数月に開催。
上田会長の奇想天外な全10問の問題をワンライナーで解くという
マゾいイベント。
※ シェル芸の定義 http://blog.ueda.asia/?page_id=1434
一撃勉強会
奇数月に開催(今のところ)。妹able infraを実現すべく
シェルスクリプトで頑張るというキモいイベント。
16. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
次回勉強会予告
11/8(土)、ウィークエンドバラエティ @nullpopopo ショー
ではなく、さくらインターネット様と共催で
一撃勉強会をさくらインターネット研究所
セミナールームで行います。Ustream中継もあるよ!
12/13(土)〜12/14(日)、日本UNIXユーザー会と共催で
シェルスクリプトワークショップ を開催します。
会場は鳥取環境大学 講義棟 1階 15教室で、懇親会には
カニが出ます。講師の1人、今泉さん ( @bsdhack ) は
札幌の出身です。
17. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
USP Magazine
USP研究所から出版されている、サーバー管理者やUNIX系プログラ
マーに向けて2011年に創刊したUNIX/Linux/FreeBSD/シェルスクリプ
トの総合誌。2014年4月から月刊化されました。
道内ではMARUZEN&ジュンク堂書店 札幌店、北大生協書籍部北部店、
函館蔦屋書店で取り扱っています。
https://www.usp-lab.com/pub.magazine.html
https://www.facebook.com/uspmag
24. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
シェルスクリプトの中身は・・・
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再起動
25. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
(1) sshでログイン
root@IPアドレス
※ パスワードは別途お知らせします
(2) 以下のコマンドを実行
# mkdir ${HOME}/bin
# touch ${HOME}/bin/ICHIGEKI
# chmod 700 ${HOME}/bin/ICHIGEKI
# vi ${HOME}/bin/ICHIGEKI
# md5sum ICHIGEKI
c5f0cccb4e3afdc152ea099afdb13295 ICHIGEKI
27. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# yum list installed nginx php* mysql*
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
* epel: ftp.kddilabs.jp
Installed Packages
mysql.x86_64 5.1.73-3.el6_5 @updates
mysql-libs.x86_64 5.1.73-3.el6_5 @updates
mysql-server.x86_64 5.1.73-3.el6_5 @updates
nginx.x86_64 1.7.6-1.el6.ngx @nginx
php-cli.x86_64 5.6.2-1.el6.remi @remi-php56
php-common.x86_64 5.6.2-1.el6.remi @remi-php56
php-fpm.x86_64 5.6.2-1.el6.remi @remi-php56
php-mbstring.x86_64 5.6.2-1.el6.remi @remi-php56
php-mysqlnd.x86_64 5.6.2-1.el6.remi @remi-php56
php-opcache.x86_64 5.6.2-1.el6.remi @remi-php56
php-pdo.x86_64 5.6.2-1.el6.remi @remi-php56
php-pear.noarch 1:1.9.4-4.el6 @base
php-pecl-apcu.x86_64 4.0.7-1.el6.remi.5.6 @remi-php56
php-pecl-jsonc.x86_64 1.3.6-1.el6.remi.5.6.1 @remi-php56
php-pecl-zip.x86_64 1.12.4-2.el6.remi.5.6 @remi-php56
php-xml.x86_64 5.6.2-1.el6.remi @remi-php56
php-xmlrpc.x86_64 5.6.2-1.el6.remi @remi-php56
28. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# diff -y /etc/fail2ban/jail.conf
/etc/fail2ban/jail.conf.orig | egrep '([[:space:]]*|)'
sendmail-whois[name=SSH, dest=root@localhost, send | sendmail-whois[name=SSH, dest=you@example.com, sen
sendmail-whois[name=ProFTPD, dest=root@localhost] | sendmail-whois[name=ProFTPD, dest=you@example.com]
sendmail-whois[name=GSSFTPd, dest=root@localhost] | sendmail-whois[name=GSSFTPd, dest=you@example.com]
sendmail-whois[name=sasl, dest=root@localhost] | sendmail-whois[name=sasl, dest=you@example.com]
sendmail-whois[name=SSH, dest=root@localhost] | sendmail-whois[name=SSH, dest=you@example.com]
sendmail[name=Postfix, dest=root@localhost] | sendmail[name=Postfix, dest=you@example.com]
action = sendmail-whois[name=VSFTPD, dest=root@localhost] | action = sendmail-whois[name=VSFTPD, dest=you@example.com]
sendmail-whois[name=VSFTPD, dest=root@localhost] | sendmail-whois[name=VSFTPD, dest=you@example.com]
sendmail-buffered[name=BadBots, lines=5, dest=root | sendmail-buffered[name=BadBots, lines=5, dest=you@
sendmail[name=Postfix, dest=root@localhost] | sendmail[name=Postfix, dest=you@example.com]
sendmail-whois[name=openwebmail, dest=root@localho | sendmail-whois[name=openwebmail, dest=you@example.
sendmail-whois[name="SSH,IPFW", dest=root@localhos | sendmail-whois[name="SSH,IPFW", dest=you@example.c
# sendmail-whois[name=Named, dest=root@localhost] | # sendmail-whois[name=Named, dest=you@example.com]
sendmail-whois[name=Named, dest=root@localhost] | sendmail-whois[name=Named, dest=you@example.com]
sendmail-whois[name=Asterisk, dest=root@localhost, | sendmail-whois[name=Asterisk, dest=you@example.com
sendmail-whois[name=Asterisk, dest=root@localhost, | sendmail-whois[name=Asterisk, dest=you@example.com
sendmail-whois[name=Asterisk, dest=root@localhost, | sendmail-whois[name=Asterisk, dest=you@example.com
sendmail-whois[name=MySQL, dest=root, sender=fail2 | sendmail-whois[name=MySQL, dest=root, sender=fail2
sendmail-whois[name=SSH, dest=root@localhost, send | sendmail-whois[name=SSH, dest=you@example.com, sen
blocklist_de[email="fail2ban@localhost", apikey="x | blocklist_de[email="fail2ban@example.com", apikey=
sendmail-whois[name=Nagios, dest=root@localhost, s | sendmail-whois[name=Nagios, dest=you@example.com,
32. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# iptables -L -n
Chain INPUT (policy DROP)
target prot opt source destination
fail2ban-SSH tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain fail2ban-SSH (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
33. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# ss -antu
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 133.242.xx.xx:123 *:*
udp UNCONN 0 0 127.0.0.1:123 *:*
udp UNCONN 0 0 *:123 *:*
udp UNCONN 0 0 fe80::9ea3:baff:fe24:9fe5:123 :::*
udp UNCONN 0 0 ::1:123 :::*
udp UNCONN 0 0 :::123 :::*
tcp LISTEN 0 128 *:80 *:*
tcp LISTEN 0 128 :::22 :::*
tcp LISTEN 0 128 *:22 *:*
tcp LISTEN 0 100 ::1:25 :::*
tcp LISTEN 0 100 127.0.0.1:25 *:*
tcp LISTEN 0 128 127.0.0.1:9000 *:*
tcp LISTEN 0 50 *:3306 *:*
tcp ESTAB 0 192 133.242.xx.xx:22 XXX.X.XX.XXX:35743
34. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1237 root 6u IPv4 9507 0t0 TCP *:http (LISTEN)
nginx 1240 nginx 6u IPv4 9507 0t0 TCP *:http (LISTEN)
35. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# lsof -i:9000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
php-fpm 1221 root 8u IPv4 9471 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 1222 nginx 0u IPv4 9471 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 1223 nginx 0u IPv4 9471 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 1224 nginx 0u IPv4 9471 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 1225 nginx 0u IPv4 9471 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 1226 nginx 0u IPv4 9471 0t0 TCP localhost:cslistener (LISTEN)
36. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# service nginx configtest
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# service php-fpm configtest
[23-Oct-2014 03:23:31] NOTICE: configuration file /etc/php-fpm.conf test is successful
38. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# for A in nginx php-fpm mysqld; do
chkconfig $A --list; done
nginx 0:off 1:off 2:on 3:on 4:on 5:on 6:off
php-fpm 0:off 1:off 2:on 3:on 4:on 5:on 6:off
mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
40. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# mysql -u root -p$(cat ${HOME}/.mysql/MySQLPARAM |
grep ^user | awk '{print $NF}') -e 'show databases;'
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| wordpress |
+--------------------+
※ wordpressデータベースができていることを確認
41. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# mysql -u root -p$(cat ${HOME}/.mysql/MySQLPARAM |
grep ^user | awk '{print $NF}') -e 'show create
database wordpress;'
+-----------+--------------------------------------------------------------------+
| Database | Create Database |
+-----------+--------------------------------------------------------------------+
| wordpress | CREATE DATABASE `wordpress` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+-----------+--------------------------------------------------------------------+
※ wordpressデータベースの文字コードがutf8であることを確認
42. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# mysql -u root -p$(cat ${HOME}/.mysql/MySQLPARAM |
grep ^user | awk '{print $NF}') -e 'select
user,password,host from mysql.user;'
+--------+-------------------------------------------+-----------+
| user | password | host |
+--------+-------------------------------------------+-----------+
| root | *745B85E794675E2661442BAE9C024DD7D692E926 | localhost |
| root | | 127.0.0.1 |
| wpuser | *C65CFBF464BBDFEA46175158DD85C24FDC5485A3 | localhost |
+--------+-------------------------------------------+-----------+
※root@localhost wpuser@localhostにパスワードが付与されていることを確認
44. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# ls -A /var/www/IPアドレス/
index.php wp-admin wp-content wp-login.php xmlrpc.php
license.txt wp-blog-header.php wp-cron.php wp-mail.php
readme-ja.html wp-comments-post.php wp-includes wp-settings.php
readme.html wp-config-sample.php wp-links-opml.php wp-signup.php
wp-activate.php wp-config.php wp-load.php wp-trackback.php
45. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# cd /var/www/IPアドレス/
# diff -y wp-config-sample.php wp-config.php | egrep
'([[:space:]]*|)'
define('DB_NAME', 'database_name_here'); | define('DB_NAME', 'wordpress');
define('DB_USER', 'username_here'); | define('DB_USER', 'wpuser');
define('DB_PASSWORD', 'password_here'); | define('DB_PASSWORD', 'P@sSw0Rd');
define('AUTH_KEY', 'put your unique phrase here' | define('AUTH_KEY', 'BlmCiQxGJt4evqPsDXWAFArphewZwk2N'
define('SECURE_AUTH_KEY', 'put your unique phrase here' | define('SECURE_AUTH_KEY', 'BlmCiQxGJt4evqPsDXWAFArphewZwk2N'
define('LOGGED_IN_KEY', 'put your unique phrase here' | define('LOGGED_IN_KEY', 'BlmCiQxGJt4evqPsDXWAFArphewZwk2N'
define('NONCE_KEY', 'put your unique phrase here' | define('NONCE_KEY', 'BlmCiQxGJt4evqPsDXWAFArphewZwk2N'
define('AUTH_SALT', 'put your unique phrase here' | define('AUTH_SALT', 'BlmCiQxGJt4evqPsDXWAFArphewZwk2N'
define('SECURE_AUTH_SALT', 'put your unique phrase here' | define('SECURE_AUTH_SALT', 'BlmCiQxGJt4evqPsDXWAFArphewZwk2N'
define('LOGGED_IN_SALT', 'put your unique phrase here' | define('LOGGED_IN_SALT', 'BlmCiQxGJt4evqPsDXWAFArphewZwk2N'
define('NONCE_SALT', 'put your unique phrase here' | define('NONCE_SALT', 'BlmCiQxGJt4evqPsDXWAFArphewZwk2N'
49. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
スクリプト起動
第1引数が create の場合
第1引数が delete の場合
第1引数が その他の場合
引数が6つでなければ、使い方を表示して異常終了する。
引数が6つであれば、関数CREATEを実行する。
引数が2つでなければ、使い方を表示して異常終了する。
引数が2つであれば、関数DELETEを実行する。
使い方を表示して異常終了する。
57. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
関数 CREATE でやっていること
1.DB名を作成する (wpdb0000〜)
2.DBユーザー名を作成する (user0000〜)
3.DBパラメータファイル作成
4.DB作成
5.DBユーザー作成
6.ドキュメントルート作成
7.WordPressインストール
8.nginx設定ファイル生成
9.nginx再起動
58. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# cat bin/VHMAINTE | head
#!/bin/bash
set -e
LANG=C
FQDN=$2
BLOGTITLE=$3
AdminUsername=$4
AdminPassword=$5
AdminEmail=$6
バーチャルホスト作成時に引数として
指定する内容
60. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# cat bin/VHMAINTE | head -n 13 | tail -n 3
DROOT=/var/www/${FQDN}
ドキュメントルートのディレクトリ
/var/www/www.example.com のように
引数に与えたFQDNがディレクトリ名となる。
ETH0=$(ip a show eth0 | grep inet | grep -v inet6 | awk '{print $2}' | sed -e "s//[0-
9]*//")
eth0のIPアドレスをipコマンドから取得
PARAMFILE=${HOME}/.mysql/MySQLPARAM
MySQLのパラメータファイル名を変数に格納
61. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# cat bin/VHMAINTE | head -n 20 | tail -n 6
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のインストール!
64. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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、そしてバックアッ
プファイルを除く)の数をもとに採番する
65. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# 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」にまとめた
66. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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、そしてバックアッ
プファイルを除く)の数をもとに採番する
67. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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の権
限テーブルを再読み込みする。
68. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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
69. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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 |
+--------------------+
70. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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 */ |
+----------+-------------------------------------------------------------------+
71. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
変数 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=<フルパス>」でインストール先
ディレクトリを指定できるので、ここではバーチャルホストのドキュメ
ントルートを指定します。
72. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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を指定せずにカレントディレクトリで作業する。
73. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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
74. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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を指定せずにカレントディ
レクトリで作業する。
75. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
cp -p /etc/nginx/conf.d/000_VHOST.conf /etc/nginx/conf.d/$
{FQDN}.conf
IPアドレスでアクセスした時に表示する
バーチャルホストのconfigファイルをも
とに、新しく作成するバーチャルホスト
のconfigファイルを生成(コピー)する。
78. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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ディレクティブに追
記し、一旦削除したディレクティブの閉
じカッコを追記する。
80. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# 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;
81. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# 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
82. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# 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
}
84. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# 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」にまとめた
85. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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
88. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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
89. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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
90. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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行書かれていたら実行する
91. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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
になる。
93. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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
データベースから削除し、権限情報を再読み込みする。
94. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
cp -p ${PARAMFILE} ${PARAMFILE}.$(date +%Y%m%d%H%M%S)
grep -v ${DBUSER} ${PARAMFILE}.$(date +%Y%m%d%H%M%S) > ${PARAMFILE}
パラメータファイルをバックアップし、削除対象のFQDN
以外をパラメータファイルに残す。
95. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# 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
97. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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
100. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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 |
+----+--------------+-------------+---------------------+-------------+
101. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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アドレス>/
(っ´∀`)っ ゃー
103. 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
コマンドラインから新しい記事を投稿してみる
※ いきなり公開状態でポスト名をUNIXタイムにし、ポストタイトル
を「ぬるぽぽぽ」、本文を「(っ´∀`)っ ゃー」で投稿する
# wp post create --post_status=publish --post_name=$(date +%s)
–-post_title='ぬるぽぽぽ' --post_content='(っ´∀`)っ ゃー' -–
path=/var/www/<IPアドレス>/
Success: Created post 4.