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サーバーのインストールですが、手順はほぼ前回と一緒で、次の順に処理を行っています。
- mysql-communityリポジトリをインストール
- mysql-community-serverパッケージをインストール
- mysqldサービスの起動および自動起動の設定
- MySQLのrootユーザーにパスワードを付与し、匿名ユーザーを削除
- データベース接続ユーザーと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
変数にそれぞれ代入しています。