2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)...
TRANSCRIPT
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
USP友の会@nullpopopo
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
[自己紹介]名前: 濱田康貴 ( @nullpopopo )
USP友の会http://www.usptomo.com/Bloghttp://nullpopopo.blogcube.info/Facebookhttps://www.facebook.com/nullpopopo
著書: USP Magazine教えて先輩♡サーバー運用お助けTIPS隔月(偶数月号)連載中
本書のキッカケとなったWordPressやられちゃった事件のトラブルシュート(プロローグ)に私が登場しています
http://www.amazon.co.jp/フルスクラッチから1日でCMSを作る-シェルスクリプト高速開発手法入門-上田隆一/dp/4048660683
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
おじちゃん仕事何してんの?
http://ll4u.in/
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
USP友の会以外の何か
ITスナック 美夢
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
USP友の会以外の何か
ペアプログラミング合コン
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
北海道観光、楽しんできました。
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
北海道観光、楽しんできました。
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
北海道グルメを堪能しました。
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
玉光堂、地下の楽器コーナーなくなってたんですね (´・_・`)
USP友の会 is 何?
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
https://www.usptomo.com/
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
https://twitter.com/usptomo
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
https://www.facebook.com/usptomo
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
定例会偶数月に開催。最近はシェル芸勉強会の懇親会を兼ねている。要するに飲み会。
シェル芸勉強会偶数月に開催。上田会長の奇想天外な全10問の問題をワンライナーで解くというマゾいイベント。※ シェル芸の定義 http://blog.ueda.asia/?page_id=1434
一撃勉強会奇数月に開催(今のところ)。妹able infraを実現すべくシェルスクリプトで頑張るというキモいイベント。
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
次回勉強会予告11/8(土)、ウィークエンドバラエティ @nullpopopo ショーではなく、さくらインターネット様と共催で一撃勉強会をさくらインターネット研究所セミナールームで行います。Ustream中継もあるよ!
12/13(土)〜12/14(日)、日本UNIXユーザー会と共催でシェルスクリプトワークショップ を開催します。会場は鳥取環境大学 講義棟 1階 15教室で、懇親会にはカニが出ます。講師の1人、今泉さん ( @bsdhack ) は札幌の出身です。
第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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
TechLION
IT文化の振興と、UNIX/Linux文化の楽しさを広く伝え、エンジニア同士の連帯を図ることを目的とするトークイベント。2013年9月15日には、札幌でも開催されました。
http://techlion.jp/
※ 画像は http://techlion.jp/archives/5086 より
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
Techにゃんこ
TechLIONがUSP友の会発祥らしからぬカッコよさのあまりに、法林GMに嫉妬した上田会長と濱田が、USP友の会のゆるさを広く伝え、クヨクヨしたおっさん同士の連帯を図ることを目的とするインターネットラジオ番組。
http://www.ustream.tv/channel/techにゃんこ
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
先ほど石狩に行ってきました
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
今回の環境構築
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
http://nullpopopo.blogcube.info/2014/09/ichigeki-kotaeall.html
ここからコピペして環境構築します
第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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
第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
[root@ichigeki-wp ~]# ICHIGEKI
SSHのセッションが切れ、しばらくしてからブラウザでアクセスしてみましょう。WordPressのインストール画面が表示されればOKです。
第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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# 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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# grep “ Ban “ /var/log/fail2ban.log
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
第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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# 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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# 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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# 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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# 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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# lsof -i:3306COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEmysqld 1117 mysql 10u IPv4 9061 0t0 TCP *:mysql (LISTEN)
第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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# cat ${HOME}/.mysql/MySQLPARAM
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# mysql -u root -p$(cat ${HOME}/.mysql/MySQLPARAM | grep ^user | awk '{print $NF}') -e 'show databases;'+--------------------+| Database |+--------------------+| information_schema || mysql || wordpress |+--------------------+
※ wordpressデータベースができていることを確認
第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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# 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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
nginxのドキュメントルートはどこ?
# grep ^[[:space:]]*root /etc/nginx/conf.d/000_VHOST.conf root /var/www/<IPアドレス>;
第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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# 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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
どうせなら単一のホストだけではなくバーチャルホストも一撃サーバーで運用したい・・・という声が聞こえてきたので、一撃スクリプト作っちゃいました。
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
http://nullpopopo.blogcube.info/〜〜〜〜
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
● コマンドライン一発でWordPressがインストールされたバーチャルホストを構築
● 勿論バーチャルホストの削除も可能● バーチャルホスト削除時にはコンテンツとDBを自動バックアップ
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
スクリプト起動
第1引数が create の場合
第1引数が delete の場合
第1引数が その他の場合
引数が6つでなければ、使い方を表示して異常終了する。引数が6つであれば、関数CREATEを実行する。
引数が2つでなければ、使い方を表示して異常終了する。引数が2つであれば、関数DELETEを実行する。
使い方を表示して異常終了する。
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
使い方 (バーチャルホスト作成)
# VHMAINTE create www.example.com "ぬるぽぽぽのブログ" nullpopopo BlogP@ssw0rd_is_here [email protected]
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
使い方 (バーチャルホスト作成)
# VHMAINTE create www.example.com "ぬるぽぽぽのブログ" nullpopopo BlogP@ssw0rd_is_here [email protected]
バーチャルホスト名
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
使い方 (バーチャルホスト作成)
# VHMAINTE create www.example.com "ぬるぽぽぽのブログ" nullpopopo BlogP@ssw0rd_is_here [email protected]
ブログのタイトル
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
使い方 (バーチャルホスト作成)
# VHMAINTE create www.example.com "ぬるぽぽぽのブログ" nullpopopo BlogP@ssw0rd_is_here [email protected]
ブログのログインID
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
使い方 (バーチャルホスト作成)
# VHMAINTE create www.example.com "ぬるぽぽぽのブログ" nullpopopo BlogP@ssw0rd_is_here [email protected]
ブログのログインパスワード
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
使い方 (バーチャルホスト作成)
# VHMAINTE create www.example.com "ぬるぽぽぽのブログ" nullpopopo BlogP@ssw0rd_is_here [email protected]
メールアドレス
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
使い方 (バーチャルホスト削除)
# VHMAINTE delete www.example.com
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
関数 CREATE でやっていること
1.DB名を作成する (wpdb0000〜)2.DBユーザー名を作成する (user0000〜)3.DBパラメータファイル作成4.DB作成5.DBユーザー作成6.ドキュメントルート作成7.WordPressインストール8.nginx設定ファイル生成9.nginx再起動
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# cat bin/VHMAINTE | head
#!/bin/bashset -eLANG=C
FQDN=$2BLOGTITLE=$3AdminUsername=$4AdminPassword=$5AdminEmail=$6
バーチャルホスト作成時に引数として指定する内容
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
bashの引数
$0 実行時のコマンド名$1〜$n シェルスクリプト実行時に渡す引数
第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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# 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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
wp-cliとは?
WordPress本体のインストール、アップデートからプラグインやテーマのインストールやアップデートまでほぼすべての操作がコマンドラインからできてしまう!
_人人人人人人人人人_
> まさにシェル芸 <
 ̄Y^Y^Y^Y^Y^Y^Y^Y ̄
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
http://wp-cli.org/
第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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# 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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
[ ! -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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
cp -p /etc/nginx/conf.d/000_VHOST.conf /etc/nginx/conf.d/${FQDN}.conf
IPアドレスでアクセスした時に表示するバーチャルホストのconfigファイルをもとに、新しく作成するバーチャルホストのconfigファイルを生成(コピー)する。
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
sed -i s/${ETH0}/${FQDN}/g /etc/nginx/conf.d/${FQDN}.conf
configファイル中のIPアドレスをバーチャルホスト名に置換する。
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
sed -i 's/^\}$//g' /etc/nginx/conf.d/${FQDN}.conf
ログの設定をserverディレクティブに追記するため、一旦ディレクティブの閉じカッコを削除する。
第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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
service nginx reload
nginxの設定ファイルを再読み込みする。
第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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# 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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# 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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
関数 DELETE でやっていること
1.nginx設定ファイルをリネーム2.nginx再起動3.DBバックアップ4.DB削除5.DBユーザー削除6.パラメータファイルから該当FQDNを削除
第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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# grep include /etc/nginx/nginx.conf
include /etc/nginx/mime.types; include /etc/nginx/conf.d/*.conf;
第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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
mysql -u root -p$(grep ^user ${PARAMFILE} | awk '{print $NF}') \-e "drop database ${DBNAME};"
wpdb0000 データベースを削除する
第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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
# 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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
おまけ: wp-cliによるWordPressシェル芸
第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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
IPアドレスのバーチャルホストでWordPressを使えるようにする
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
IPアドレスのバーチャルホストでWordPressを使えるようにする
_人人人人人人人人人人人人人人人人人_> コマンドラインでも確認したい! < ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
第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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
PostID 1のタイトルを変更してみる
第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回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
コマンドラインから新しい記事を投稿してみる
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)
お疲れ様でした!
第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!)