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;"