SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ツールがなくてもサーバー構築でたじろがない! 一撃シェルスクリプト道場

WordPressとnginx+MySQL+memcached+wp-cliをインストールする一撃シェルスクリプト

ツールがなくてもサーバー構築でだじろがない! 一撃シェルスクリプト道場 最終回

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード ICHIGEKI (9.5 KB)

wp-cliのダウンロード

 wp-cliのgithubリポジトリ からwp-cliをダウンロードします。rootユーザーだけでなく、他のユーザーからも利用できるよう、PATHの通ったディレクトリ(/usr/local/bin)へwpというファイル名で配置することにします。

WP=/usr/local/bin/wp
DOWNLOADURL=https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
curl -o ${WP} ${DOWNLOADURL}
chmod 755 ${WP}

 

ファイアウォールの設定

 CentOS 7からは、iptablesのフロントエンドにfirewalldを利用するようになりました[2]。firewall-cmdでファイアウォールの設定を行ったり、確認を行ったりすることができますが、firewalldサービスが起動していることが条件となります。このため、一撃スクリプトの中で systemctl status firewalld.service コマンドを実行し、firewalldサービスが停止していたら(終了ステータスが3だったら)firewalldサービスを起動します。

if [ 3 = $(systemctl status firewalld.service > /dev/null ; echo $?) ];
then
  systemctl start firewalld.service
fi
systemctl enable firewalld.service
firewall-cmd --zone=public --add-service http
firewall-cmd --zone=public --add-service http --permanent

 ここで、systemctlコマンドを使い、firewalldが停止しているときの例を見てみましょう。

# systemctl status firewalld.service
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
   Active: inactive (dead) since Mon 2015-05-18 20:21:58 JST; 9s ago
  Process: 417 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status=0/SUCCESS)
 Main PID: 417 (code=exited, status=0/SUCCESS)

May 18 17:03:53 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...
May 18 17:03:54 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.
May 18 20:21:58 localhost.localdomain systemd[1]: Stopping firewalld - dynamic firewall daemon...
May 18 20:21:58 localhost.localdomain systemd[1]: Stopped firewalld - dynamic firewall daemon.

# echo $?
3

 このように、firewalldサービスが停止しているときの終了ステータスは3となりますので、一撃シェルスクリプトでは、これをif文の条件判定に使っています。

 firewalldが停止しているときに、firewall-cmdコマンドで設定や表示を行おうとすると、次のようにエラーとなります。

# firewall-cmd --get-default-zone
FirewallD is not running

# echo $?
252

 一撃シェルスクリプトでは、上記に挙げたfirewalldサービスの起動の後、OS再起動時に自動起動するようにし、デフォルトのゾーン publicに対してhttp(TCP/80)の穴をあけています。デフォルトのゾーンが何であるかは、次のようにして確認できます。

# firewall-cmd --get-default-zone
public

 現在のデフォルトゾーン(public)の他にどんなゾーンがあるかは、次のようにして確認します。

# firewall-cmd --get-zones
block dmz drop external home internal public trusted work

 一撃シェルスクリプト中で実行しているfirewall-cmd --zone=public --add-service httpは設定が即時反映されますが、firewalldの再起動で設定が消えてしまうため、firewall-cmd --zone=public --add-service http --permanentも併せて実行し、設定を永続化しています。

[2] firewalldを止めてiptablesを引き続き使うのも可能。

 

MySQLインストール、初期設定

 MySQLサーバーのインストールですが、手順はほぼ前回と一緒で、次の順に処理を行っています。

  1. mysql-communityリポジトリをインストール
  2. mysql-community-serverパッケージをインストール
  3. mysqldサービスの起動および自動起動の設定
  4. MySQLのrootユーザーにパスワードを付与し、匿名ユーザーを削除
  5. データベース接続ユーザーとDBの生成(自動採番)

 「1. mysql-communityリポジトリインストール」では、前回と同様にdev.mysql.comからMySQL Yum Repositoryをダウンロードします。ただし、前回は「Red Hat Enterprise Linux 6 / Oracle Linux 6 (Architecture Independent), RPM Package」をダウンロードしたのに対し、今回は「Red Hat Enterprise Linux 7 / Oracle Linux 7 (Architecture Independent), RPM Package」をダウンロードします。

yum -y install http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
yum -y install mysql-community-server
systemctl start mysqld.service
systemctl enable  mysqld.service

 mysql-serverの起動および自動起動も、これまでのserviceコマンドからsystemctlコマンドに変更しています。MySQLのroot@localhostユーザーは、初期設定時にパスワードを設定したあと、${HOME}/.my.cnfにパスワードを記録し、その後のコマンド実行でパスワードを入力しないで済むようにしています。

[ 0 = ${#MYSQLROOTPW} ] && MYSQLROOTPW=$(cat /dev/urandom | tr -dc '[:alnum:]' | head -c 16)
mysql -u root -e "SET PASSWORD FOR root@localhost=PASSWORD('${MYSQLROOTPW}');"

echo [client] | tee ${HOME}/.my.cnf
echo user=root | tee -a ${HOME}/.my.cnf
echo password=\"${MYSQLROOTPW}\" | tee -a ${HOME}/.my.cnf

mysql -e "SET PASSWORD FOR root@\"${HOSTNAME}\"=PASSWORD('${MYSQLROOTPW}');"
mysql -e "SET PASSWORD FOR root@127.0.0.1=PASSWORD('${MYSQLROOTPW}');"
mysql -e "SET PASSWORD FOR root@\"::1\"=PASSWORD('${MYSQLROOTPW}');"
mysql -e "delete from mysql.user where user='';"
mysql -e 'FLUSH PRIVILEGES;'

 次に、WordPress用のユーザーとDBを作成するのですが、今回の一撃シェルスクリプトではDB名を「wpdb0001〜」、ユーザー名を「user0001〜」で自動採番します。

NUMOFDB=$(expr $(mysql -N -B -e "SHOW DATABASES;" | egrep '(^wpdb[0-9]{4})' | tail -n 1 | sed -e "s/^wpdb0*//") + 1)
NUMOFDBUSER=$(expr $(mysql -N -B -e "select user,host from mysql.user;" | egrep '(^user[0-9]{4}[[:space:]]localhost)' | tail -n 1 | sed -e "s/^user0*//" | awk '{print $1}') + 1)
DBNAME=$(printf "wpdb%04d" ${NUMOFDB})
DBUSER=$(printf "user%04d" ${NUMOFDBUSER})
DBUSERPW=$(cat /dev/urandom | tr -dc '[:alnum:]' | head -c 8)

mysql -e "CREATE DATABASE ${DBNAME} DEFAULT CHARACTER SET utf8;"

mysql -e "GRANT ALL PRIVILEGES ON ${DBNAME}.* TO ${DBUSER}@localhost IDENTIFIED BY \"${DBUSERPW}\";"
mysql -e "FLUSH PRIVILEGES;"

 上記のうち、NUMOFDB変数とNUMOFDBUSER変数は、それぞれWordPress用として想定しているDB名とユーザー名の現在の数をかぞえ、exprコマンドで1を足しています。これを、DBNAME変数とDBUSER変数にそれぞれ代入しています。

次のページ
PHPおよび依存パッケージをインストール

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
ツールがなくてもサーバー構築でたじろがない! 一撃シェルスクリプト道場連載記事一覧

もっと読む

この記事の著者

濱田 康貴(ハマダ ヤスタカ)

サーバーエンジニアとして主にLinuxのWEBサーバーを設計、構築、運用を行っています。運用ツールの相棒としてシェルスクリプトやワンライナーは心強いパートナーと信じて疑わず、ブログでTIPSを公開しています。2009年5月のUSP友の会活動開始より参画し、現副会長。最近では、USP友の会で「一撃サーバー構築シェルスクリプト勉強会」を開催しているほか、日本で唯一のシェルスクリプト総合誌『シェルスクリプトマガジン』(毎月25日発売)で、隔月(偶数月号)連載「教えて先輩 サーバー運用お助けTips」を執筆しています。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8703 2015/06/02 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング