2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)...

105
2回 一撃サーバー構築シェルスクリプト勉強会 (さっぽろ!) USP友の会 @nullpopopo

Upload: yasutaka-hamada

Post on 22-Aug-2015

1.171 views

Category:

Internet


0 download

TRANSCRIPT

Page 1: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

USP友の会@nullpopopo

Page 2: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

[自己紹介]名前: 濱田康貴 ( @nullpopopo )

USP友の会http://www.usptomo.com/Bloghttp://nullpopopo.blogcube.info/Facebookhttps://www.facebook.com/nullpopopo

著書: USP Magazine教えて先輩♡サーバー運用お助けTIPS隔月(偶数月号)連載中

Page 3: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

本書のキッカケとなったWordPressやられちゃった事件のトラブルシュート(プロローグ)に私が登場しています

http://www.amazon.co.jp/フルスクラッチから1日でCMSを作る-シェルスクリプト高速開発手法入門-上田隆一/dp/4048660683

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 4: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

おじちゃん仕事何してんの?

http://ll4u.in/

Page 5: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

USP友の会以外の何か

ITスナック 美夢

Page 6: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

USP友の会以外の何か

ペアプログラミング合コン

Page 7: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

北海道観光、楽しんできました。

Page 8: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

北海道観光、楽しんできました。

Page 9: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

北海道グルメを堪能しました。

Page 10: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

玉光堂、地下の楽器コーナーなくなってたんですね (´・_・`)

Page 11: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

USP友の会 is 何?

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 12: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

https://www.usptomo.com/

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 13: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

https://twitter.com/usptomo

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 14: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

https://www.facebook.com/usptomo

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 15: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

定例会偶数月に開催。最近はシェル芸勉強会の懇親会を兼ねている。要するに飲み会。

シェル芸勉強会偶数月に開催。上田会長の奇想天外な全10問の問題をワンライナーで解くというマゾいイベント。※ シェル芸の定義 http://blog.ueda.asia/?page_id=1434

一撃勉強会奇数月に開催(今のところ)。妹able infraを実現すべくシェルスクリプトで頑張るというキモいイベント。

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 16: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

次回勉強会予告11/8(土)、ウィークエンドバラエティ @nullpopopo ショーではなく、さくらインターネット様と共催で一撃勉強会をさくらインターネット研究所セミナールームで行います。Ustream中継もあるよ!

12/13(土)〜12/14(日)、日本UNIXユーザー会と共催でシェルスクリプトワークショップ を開催します。会場は鳥取環境大学 講義棟 1階 15教室で、懇親会にはカニが出ます。講師の1人、今泉さん ( @bsdhack ) は札幌の出身です。

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 17: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

USP Magazine

USP研究所から出版されている、サーバー管理者やUNIX系プログラマーに向けて2011年に創刊したUNIX/Linux/FreeBSD/シェルスクリプトの総合誌。2014年4月から月刊化されました。

道内ではMARUZEN&ジュンク堂書店 札幌店、北大生協書籍部北部店、函館蔦屋書店で取り扱っています。

https://www.usp-lab.com/pub.magazine.htmlhttps://www.facebook.com/uspmag

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 18: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

TechLION

IT文化の振興と、UNIX/Linux文化の楽しさを広く伝え、エンジニア同士の連帯を図ることを目的とするトークイベント。2013年9月15日には、札幌でも開催されました。

http://techlion.jp/

※ 画像は http://techlion.jp/archives/5086 より

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 19: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

Techにゃんこ

TechLIONがUSP友の会発祥らしからぬカッコよさのあまりに、法林GMに嫉妬した上田会長と濱田が、USP友の会のゆるさを広く伝え、クヨクヨしたおっさん同士の連帯を図ることを目的とするインターネットラジオ番組。

http://www.ustream.tv/channel/techにゃんこ

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 20: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

先ほど石狩に行ってきました

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 21: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 22: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

今回の環境構築

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 23: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

http://nullpopopo.blogcube.info/2014/09/ichigeki-kotaeall.html

ここからコピペして環境構築します

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 24: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

シェルスクリプトの中身は・・・

1.yum update2.fail2banのメール宛先と送信元をroot@localhostに変更3.iptables設定4.nginxインストール5.phpインストール6.mysqlインストール7.mysqlパラメータ生成→mysql設定8.php設定9.WordPressインストール10.nginx設定ファイル生成11.OS再起動

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 25: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

(1) sshでログインroot@IPアドレス※ パスワードは別途お知らせします

(2) 以下のコマンドを実行

# mkdir ${HOME}/bin# touch ${HOME}/bin/ICHIGEKI# chmod 700 ${HOME}/bin/ICHIGEKI# vi ${HOME}/bin/ICHIGEKI# md5sum ICHIGEKIc5f0cccb4e3afdc152ea099afdb13295 ICHIGEKI

Page 26: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

[root@ichigeki-wp ~]# ICHIGEKI

SSHのセッションが切れ、しばらくしてからブラウザでアクセスしてみましょう。WordPressのインストール画面が表示されればOKです。

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 27: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

# yum list installed nginx php* mysql*Loaded plugins: fastestmirror, securityLoading mirror speeds from cached hostfile * epel: ftp.kddilabs.jpInstalled Packagesmysql.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-php56php-common.x86_64 5.6.2-1.el6.remi @remi-php56php-fpm.x86_64 5.6.2-1.el6.remi @remi-php56php-mbstring.x86_64 5.6.2-1.el6.remi @remi-php56php-mysqlnd.x86_64 5.6.2-1.el6.remi @remi-php56php-opcache.x86_64 5.6.2-1.el6.remi @remi-php56php-pdo.x86_64 5.6.2-1.el6.remi @remi-php56php-pear.noarch 1:1.9.4-4.el6 @base php-pecl-apcu.x86_64 4.0.7-1.el6.remi.5.6 @remi-php56php-pecl-jsonc.x86_64 1.3.6-1.el6.remi.5.6.1 @remi-php56php-pecl-zip.x86_64 1.12.4-2.el6.remi.5.6 @remi-php56php-xml.x86_64 5.6.2-1.el6.remi @remi-php56php-xmlrpc.x86_64 5.6.2-1.el6.remi @remi-php56

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 28: 2014/11/04 第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, [email protected], sen sendmail-whois[name=ProFTPD, dest=root@localhost] | sendmail-whois[name=ProFTPD, [email protected]] sendmail-whois[name=GSSFTPd, dest=root@localhost] | sendmail-whois[name=GSSFTPd, [email protected]] sendmail-whois[name=sasl, dest=root@localhost] | sendmail-whois[name=sasl, [email protected]] sendmail-whois[name=SSH, dest=root@localhost] | sendmail-whois[name=SSH, [email protected]] sendmail[name=Postfix, dest=root@localhost] | sendmail[name=Postfix, [email protected]]action = sendmail-whois[name=VSFTPD, dest=root@localhost] |action = sendmail-whois[name=VSFTPD, [email protected]] sendmail-whois[name=VSFTPD, dest=root@localhost] | sendmail-whois[name=VSFTPD, [email protected]] 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, [email protected]] 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", [email protected]# sendmail-whois[name=Named, dest=root@localhost] |# sendmail-whois[name=Named, [email protected]] sendmail-whois[name=Named, dest=root@localhost] | sendmail-whois[name=Named, [email protected]] sendmail-whois[name=Asterisk, dest=root@localhost, | sendmail-whois[name=Asterisk, [email protected] sendmail-whois[name=Asterisk, dest=root@localhost, | sendmail-whois[name=Asterisk, [email protected] sendmail-whois[name=Asterisk, dest=root@localhost, | sendmail-whois[name=Asterisk, [email protected] 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, [email protected], sen blocklist_de[email="fail2ban@localhost", apikey="x | blocklist_de[email="[email protected]", apikey= sendmail-whois[name=Nagios, dest=root@localhost, s | sendmail-whois[name=Nagios, [email protected],

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 29: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

# grep “ Ban “ /var/log/fail2ban.log

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 30: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 31: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 32: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

# iptables -L -nChain 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

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 33: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

# ss -antuNetid 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

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 34: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

# lsof -i:80COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEnginx 1237 root 6u IPv4 9507 0t0 TCP *:http (LISTEN)nginx 1240 nginx 6u IPv4 9507 0t0 TCP *:http (LISTEN)

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 35: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

# lsof -i:9000COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEphp-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)

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 36: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

# service nginx configtestnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: 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

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 37: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

# lsof -i:3306COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEmysqld 1117 mysql 10u IPv4 9061 0t0 TCP *:mysql (LISTEN)

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 38: 2014/11/04 第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:offphp-fpm 0:off 1:off 2:on 3:on 4:on 5:on 6:offmysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 39: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

# cat ${HOME}/.mysql/MySQLPARAM

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 40: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

# mysql -u root -p$(cat ${HOME}/.mysql/MySQLPARAM | grep ^user | awk '{print $NF}') -e 'show databases;'+--------------------+| Database |+--------------------+| information_schema || mysql || wordpress |+--------------------+

※ wordpressデータベースができていることを確認

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 41: 2014/11/04 第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であることを確認

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 42: 2014/11/04 第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にパスワードが付与されていることを確認

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 43: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

nginxのドキュメントルートはどこ?

# grep ^[[:space:]]*root /etc/nginx/conf.d/000_VHOST.conf root /var/www/<IPアドレス>;

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 44: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

# ls -A /var/www/IPアドレス/

index.php wp-admin wp-content wp-login.php xmlrpc.phplicense.txt wp-blog-header.php wp-cron.php wp-mail.phpreadme-ja.html wp-comments-post.php wp-includes wp-settings.phpreadme.html wp-config-sample.php wp-links-opml.php wp-signup.phpwp-activate.php wp-config.php wp-load.php wp-trackback.php

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 45: 2014/11/04 第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'

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 46: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

どうせなら単一のホストだけではなくバーチャルホストも一撃サーバーで運用したい・・・という声が聞こえてきたので、一撃スクリプト作っちゃいました。

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 47: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

http://nullpopopo.blogcube.info/〜〜〜〜

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 48: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

● コマンドライン一発でWordPressがインストールされたバーチャルホストを構築

● 勿論バーチャルホストの削除も可能● バーチャルホスト削除時にはコンテンツとDBを自動バックアップ

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 49: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

スクリプト起動

第1引数が create の場合

第1引数が delete の場合

第1引数が その他の場合

引数が6つでなければ、使い方を表示して異常終了する。引数が6つであれば、関数CREATEを実行する。

引数が2つでなければ、使い方を表示して異常終了する。引数が2つであれば、関数DELETEを実行する。

使い方を表示して異常終了する。

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 50: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

使い方 (バーチャルホスト作成)

# VHMAINTE create www.example.com "ぬるぽぽぽのブログ" nullpopopo BlogP@ssw0rd_is_here [email protected]

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 51: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

使い方 (バーチャルホスト作成)

# VHMAINTE create www.example.com "ぬるぽぽぽのブログ" nullpopopo BlogP@ssw0rd_is_here [email protected]

バーチャルホスト名

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 52: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

使い方 (バーチャルホスト作成)

# VHMAINTE create www.example.com "ぬるぽぽぽのブログ" nullpopopo BlogP@ssw0rd_is_here [email protected]

ブログのタイトル

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 53: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

使い方 (バーチャルホスト作成)

# VHMAINTE create www.example.com "ぬるぽぽぽのブログ" nullpopopo BlogP@ssw0rd_is_here [email protected]

ブログのログインID

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 54: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

使い方 (バーチャルホスト作成)

# VHMAINTE create www.example.com "ぬるぽぽぽのブログ" nullpopopo BlogP@ssw0rd_is_here [email protected]

ブログのログインパスワード

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 55: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

使い方 (バーチャルホスト作成)

# VHMAINTE create www.example.com "ぬるぽぽぽのブログ" nullpopopo BlogP@ssw0rd_is_here [email protected]

メールアドレス

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 56: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

使い方 (バーチャルホスト削除)

# VHMAINTE delete www.example.com

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 57: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

関数 CREATE でやっていること

1.DB名を作成する (wpdb0000〜)2.DBユーザー名を作成する (user0000〜)3.DBパラメータファイル作成4.DB作成5.DBユーザー作成6.ドキュメントルート作成7.WordPressインストール8.nginx設定ファイル生成9.nginx再起動

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 58: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

# cat bin/VHMAINTE | head

#!/bin/bashset -eLANG=C

FQDN=$2BLOGTITLE=$3AdminUsername=$4AdminPassword=$5AdminEmail=$6

バーチャルホスト作成時に引数として指定する内容

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 59: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

bashの引数

$0 実行時のコマンド名$1〜$n シェルスクリプト実行時に渡す引数

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 60: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

# cat bin/VHMAINTE | head -n 13 | tail -n 3

DROOT=/var/www/${FQDN}

ETH0=$(ip a show eth0 | grep inet | grep -v inet6 | awk '{print $2}' | sed -e "s/\/[0-9]*//")

PARAMFILE=${HOME}/.mysql/MySQLPARAM

ドキュメントルートのディレクトリ/var/www/www.example.com のように引数に与えたFQDNがディレクトリ名となる。

eth0のIPアドレスをipコマンドから取得

MySQLのパラメータファイル名を変数に格納

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 61: 2014/11/04 第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/wpfi

一撃シリーズ今回の目玉!wp-cliのインストール!

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 62: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

wp-cliとは?

WordPress本体のインストール、アップデートからプラグインやテーマのインストールやアップデートまでほぼすべての操作がコマンドラインからできてしまう!

_人人人人人人人人人_

> まさにシェル芸 <

 ̄Y^Y^Y^Y^Y^Y^Y^Y ̄

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 63: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

http://wp-cli.org/

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 64: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

DBNAME=$(printf "wpdb%04d\n" $(ls /var/www/ | egrep -v "(^html|gz$|^"${ETH0}")" | wc -l))DBUSER=$(printf "user%04d\n" $(ls /var/www/ | egrep -v "(^html|gz$|^"${ETH0}")" | wc -l))

DB名とDBユーザー名を連番で作成するため、/var/www以下のディレクトリ(/var/www/IPアドレス と /var/www/html、そしてバックアップファイルを除く)の数をもとに採番する

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 65: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

# cat bin/VHMAINTE | head -n 51 | tail -n 31

CREATE(){DBNAME=$(printf "wpdb%04d\n" $(ls /var/www/ | egrep -v "(^html|gz$|^"${ETH0}")" | wc -l))DBUSER=$(printf "user%04d\n" $(ls /var/www/ | egrep -v "(^html|gz$|^"${ETH0}")" | wc -l))

(中略)

}

バーチャルホスト作成時の処理を関数「CREATE」にまとめた

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 66: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

DBNAME=$(printf "wpdb%04d\n" $(ls /var/www/ | egrep -v "(^html|gz$|^"${ETH0}")" | wc -l))DBUSER=$(printf "user%04d\n" $(ls /var/www/ | egrep -v "(^html|gz$|^"${ETH0}")" | wc -l))

DB名とDBユーザー名を連番で作成するため、/var/www以下のディレクトリ(/var/www/IPアドレス と /var/www/html、そしてバックアップファイルを除く)の数をもとに採番する

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 67: 2014/11/04 第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の権限テーブルを再読み込みする。

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 68: 2014/11/04 第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 [email protected]

# cat ${HOME}/.mysql/MySQLPARAM | grep www.example.com

DBPARAM wpdb0000 user0000 DB_PASSWORD www.example.com ぽぽぽぽぽ nullpopopo BlogP@ssw0rD [email protected]

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 69: 2014/11/04 第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 |+--------------------+

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 70: 2014/11/04 第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 */ |+----------+-------------------------------------------------------------------+

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 71: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

[ ! -d ${DROOT} ] && mkdir -p ${DROOT}

wp core download --locale=ja --path=${DROOT}

cd ${DROOT}

変数 DROOT は /var/www/${FQDN} でしたね

wp core download でWordPressを公式サイトからダウンロードします。引数に「--locale=ja」を加えることで、日本語版のWordPressをダウンロードすることができます。「--path=<フルパス>」でインストール先ディレクトリを指定できるので、ここではバーチャルホストのドキュメントルートを指定します。

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 72: 2014/11/04 第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を指定せずにカレントディレクトリで作業する。

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 73: 2014/11/04 第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.comDBPARAM wpdb0000 user0000 DB_PASSWORD www.example.com ぽぽぽぽぽ nullpopopo BlogP@ssw0rD [email protected]

# 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

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 74: 2014/11/04 第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を指定せずにカレントディレクトリで作業する。

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 75: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

cp -p /etc/nginx/conf.d/000_VHOST.conf /etc/nginx/conf.d/${FQDN}.conf

IPアドレスでアクセスした時に表示するバーチャルホストのconfigファイルをもとに、新しく作成するバーチャルホストのconfigファイルを生成(コピー)する。

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 76: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

sed -i s/${ETH0}/${FQDN}/g /etc/nginx/conf.d/${FQDN}.conf

configファイル中のIPアドレスをバーチャルホスト名に置換する。

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 77: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

sed -i 's/^\}$//g' /etc/nginx/conf.d/${FQDN}.conf

ログの設定をserverディレクティブに追記するため、一旦ディレクティブの閉じカッコを削除する。

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 78: 2014/11/04 第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ディレクティブに追記し、一旦削除したディレクティブの閉じカッコを追記する。

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 79: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

service nginx reload

nginxの設定ファイルを再読み込みする。

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 80: 2014/11/04 第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;

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 81: 2014/11/04 第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

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 82: 2014/11/04 第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}

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 83: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

関数 DELETE でやっていること

1.nginx設定ファイルをリネーム2.nginx再起動3.DBバックアップ4.DB削除5.DBユーザー削除6.パラメータファイルから該当FQDNを削除

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 84: 2014/11/04 第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」にまとめた

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 85: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

mv /etc/nginx/conf.d/${FQDN}.conf /etc/nginx/conf.d/${FQDN}.conf.DISABLED_$(date +%Y%m%d%H%M%S)service nginx reload

nginxのバーチャルホスト設定ファイルをリネームし、nginxを再読み込みする

例)www.example.com.conf↓www.example.com.conf.DISABLED_20141020113617

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 86: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

# grep include /etc/nginx/nginx.conf

include /etc/nginx/mime.types; include /etc/nginx/conf.d/*.conf;

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 87: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

[ -d ${DROOT} ] && tar czf ${DROOT}_$(date +%Y%m%d).tar.gz ${DROOT} && rm -fr ${DROOT}

ドキュメントルートのディレクトリをtar.gz圧縮し、元のディレクトリを削除する

例)/var/www/www.example.com↓/var/www/www.example.com_20141020.tar.gz

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 88: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

DBNAME=$(grep ${FQDN} ${PARAMFILE} | awk '{print $2}')DBUSER=$(grep ${FQDN} ${PARAMFILE} | awk '{print $3}')

DB名とDB接続ユーザーを変数に格納する

# grep www.example.com ${HOME}/.mysql/MySQLPARAM | awk '{print $2,$3}'

wpdb0000 user0000

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 89: 2014/11/04 第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

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 90: 2014/11/04 第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行書かれていたら実行する

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 91: 2014/11/04 第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 になる。

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 92: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}') \-e "drop database ${DBNAME};"

wpdb0000 データベースを削除する

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 93: 2014/11/04 第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 データベースから削除し、権限情報を再読み込みする。

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 94: 2014/11/04 第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以外をパラメータファイルに残す。

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 95: 2014/11/04 第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

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 96: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

おまけ: wp-cliによるWordPressシェル芸

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 97: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

# 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 [email protected] --path=/var/www/${ETH0}

IPアドレスのバーチャルホストでWordPressを使えるようにする

実行後Success: WordPress installed successfully.と表示されればOK

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 98: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

IPアドレスのバーチャルホストでWordPressを使えるようにする

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 99: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

IPアドレスのバーチャルホストでWordPressを使えるようにする

_人人人人人人人人人人人人人人人人人_> コマンドラインでも確認したい! < ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 100: 2014/11/04 第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 |+----+--------------+-------------+---------------------+-------------+

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 101: 2014/11/04 第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アドレス>/(っ´∀`)っ ゃー

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 102: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

PostID 1のタイトルを変更してみる

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 103: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

コマンドラインから新しい記事を投稿してみる

※ いきなり公開状態でポスト名をUNIXタイムにし、ポストタイトルを「ぬるぽぽぽ」、本文を「(っ´∀`)っ ゃー」で投稿する

# wp post create --post_status=publish --post_name=$(date +%s) –-post_title='ぬるぽぽぽ' --post_content='(っ´∀`)っ ゃー' -–path=/var/www/<IPアドレス>/

Success: Created post 4.

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 104: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

コマンドラインから新しい記事を投稿してみる

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)

Page 105: 2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料

お疲れ様でした!

第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)