SHOEISHA iD

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

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

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

Nginx+PerlのCGI環境にMovable Typeをインストールする一撃シェルスクリプト

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

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

ダウンロード ICHIGEKI (6.9 KB)

OSインストール直後の各種設定

 一撃シェルスクリプトには、Movable TypeのダウンロードURLだけを引数として渡します。これを変数DURLに格納します。

DURL=$1

 冒頭にも記した通り、一撃シェルスクリプトの引数にはたった1つ、Movable TypeのダウンロードURLしか与えません。そのため、これを変数に入れることに意味があるのかと思われる方もいらっしゃるでしょう。理由はコードの可読性です。

 今回の一撃シェルスクリプトにおいて、変数DURLcurlコマンドを使ったファイルのダウンロードの他に、ファイル名を切り出す箇所で使われます(詳細は後述)。次に示すのがそのコードですが、変数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)をインストールします。今回の一撃シェルスクリプトでは次の順に処理を行っています。

  1. mysql-communityリポジトリをインストール
  2. mysql-community-serverパッケージをインストール
  3. mysqldサービスの起動および自動起動の設定
  4. MySQLのrootユーザーにパスワードを付与し、匿名ユーザーを削除
  5. データベース「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;"

次のページ
epelリポジトリとrpmforgeリポジトリのインストール

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

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

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング