OSインストール直後の各種設定
一撃シェルスクリプトには、Movable TypeのダウンロードURLだけを引数として渡します。これを変数DURLに格納します。
DURL=$1
冒頭にも記した通り、一撃シェルスクリプトの引数にはたった1つ、Movable TypeのダウンロードURLしか与えません。そのため、これを変数に入れることに意味があるのかと思われる方もいらっしゃるでしょう。理由はコードの可読性です。
今回の一撃シェルスクリプトにおいて、変数DURLはcurlコマンドを使ったファイルのダウンロードの他に、ファイル名を切り出す箇所で使われます(詳細は後述)。次に示すのがそのコードですが、変数DURLを使うことにより何をしているのかをイメージしやすくし、保守性を損ねないようにしています。
MTARC=$(basename ${DURL} | awk 'BEGIN {FS="?"} {print $1}')
curl -o ${MTARC} ${DURL}
また、本稿執筆時点では、Movable Typeはzipファイルで提供されています。このため、unzipコマンドをインストールします。
## unzip install yum -y install unzip
ドキュメントルートの作成とMovable Typeのダウンロード
今回はドキュメントルートを/var/www/htmlとするため、まず基点となる/var/wwwディレクトリを作成します。続いて、Movable Typeのインストールzipファイルを/root/srcディレクトリにダウンロードし展開します。そして、展開によりできたMovable Typeのディレクトリを、/var/wwwディレクトリに移動します。
## Create DocumentRoot and Movable Type Download
mkdir -p /var/www
mkdir -p ${HOME}/src
cd ${HOME}/src
MTARC=$(basename ${DURL} | awk 'BEGIN {FS="?"} {print $1}')
curl -o ${MTARC} ${DURL}
unzip ${MTARC}
mv $(ls | grep -v zip$) /var/www/html
cd ${HOME}
このコードでは変数MTARCがキモになるので少し解説しますと、本稿執筆時点でMovable TypeのダウンロードURLは「https://……/file_download.php/MT-6_1.zip?id=9&type=MT6」という構造になっています。これをそのままcurlコマンドでダウンロードすると、ファイル名が「MT-6_1.zip?id=9&type=MT6」になってしまいます。
このため、curlコマンドでダウンロードするファイル名を「MT-6_1.zip」にしてあげる必要があります。ここでは引数としてURL「https://……/file_download.php/MT-6_1.zip?id=9&type=MT6」を受け取ったbasenameコマンドが最後のスラッシュまでを削除して「MT-6_1.zip?id=9&type=MT6」を出力し、さらに区切り文字(FSの値)として「?」を指定されたawkコマンドが1フィールド目、つまり「MT-6_1.zip」を出力することでこれを実現しています。
MySQLのインストールとDBの作成
次に、MySQLサーバー(パッケージ名はmysql-community-server)をインストールします。今回の一撃シェルスクリプトでは次の順に処理を行っています。
- mysql-communityリポジトリをインストール
- mysql-community-serverパッケージをインストール
- mysqldサービスの起動および自動起動の設定
- MySQLのrootユーザーにパスワードを付与し、匿名ユーザーを削除
- データベース「mt」を作成
「1. mysql-communityリポジトリをインストール」から、「3. mysqldサービスの起動および自動起動の設定」までは、特に変わったことをせずにストレートに処理を進めます。
## MySQL install yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm yum -y install mysql-community-server service mysqld start chkconfig mysqld on
「4. MySQLのrootユーザーにパスワードを付与し、匿名ユーザーを削除」は、mysql_secure_installationコマンドが行う処理にほぼ相当します。mysql_secure_installationコマンドは対話式のシェルスクリプトです。そのまま実行してしまうと人間の入力待ちとなってしまうため、次の処理を行います。
- root@localhostにパスワードを付与
- root@${HOSTNAME}にパスワードを付与
- root@127.0.0.1にパスワードを付与
- root@::1にパスワードを付与
- パスワードが空のユーザーを削除
- mysqlの権限テーブルを再読み込み
なお、mysql_secure_installationコマンドはtestデータベースの削除も行っていますが、本稿執筆時点においてmysql-communityリポジトリからインストールしたmysql-community-serverにはtestデータベースが含まれていなかったため、この処理は実装していません。
今回の一撃シェルスクリプトでは、/root/root.my.cnfファイルの有無で処理を分けています。
if [ -f ${HOME}/root.my.cnf ];
then
ROOTPW=$(cat ${HOME}/root.my.cnf | grep ^password | awk 'BEGIN {FS="\""} {print $2}')
mysql -e "SET PASSWORD FOR root@localhost=PASSWORD('${ROOTPW}');"
mv ${HOME}/root.my.cnf ${HOME}/.my.cnf
chmod 600 ${HOME}/.my.cnf
mysql -u root -e "SET PASSWORD FOR root@\"${HOSTNAME}\"=PASSWORD('${ROOTPW}');"
mysql -u root -e "SET PASSWORD FOR root@127.0.0.1=PASSWORD('${ROOTPW}');"
mysql -u root -e "SET PASSWORD FOR root@\"::1\"=PASSWORD('${ROOTPW}');"
mysql -u root -e "delete from mysql.user where password='';"
mysql -u root -e 'FLUSH PRIVILEGES;'
else
ROOTPW=$(cat /dev/urandom | tr -dc '[:alnum:]' | head -c 16)
mysql -e "SET PASSWORD FOR root@localhost=PASSWORD('${ROOTPW}');"
echo [client] | tee ${HOME}/.my.cnf
echo user=root | tee -a ${HOME}/.my.cnf
echo password=\"${ROOTPW}\" | tee -a ${HOME}/.my.cnf
mysql -u root -e "SET PASSWORD FOR root@\"${HOSTNAME}\"=PASSWORD('${ROOTPW}');"
mysql -u root -e "SET PASSWORD FOR root@127.0.0.1=PASSWORD('${ROOTPW}');"
mysql -u root -e "SET PASSWORD FOR root@\"::1\"=PASSWORD('${ROOTPW}');"
mysql -u root -e "delete from mysql.user where password='';"
mysql -u root -e 'FLUSH PRIVILEGES;'
fi
上記のif文では、/root/root.my.cnfがあれば、このファイルからrootユーザーに与えるパスワードを抜き出してmysqlコマンドで設定し、root.my.cnfファイルを.my.cnfファイル(隠しファイル)にリネームしています。反対に、/root/root.my.cnfが存在しなければ、rootパスワードをランダムな文字列で生成し、.my.cnfファイルに格納しています。
以上の処理が終わった後、データベース「mt」を作成します。
## Create "mt" database mysql -u root -e "create database mt;"
