サーバ作成時の環境整備の手法は数多あるが、個人的には
- クラシックで
- 変化が少なく
- メンテしやすい
方法がいいかな、と思う。そうするとだいたい、バッチをsshで流し込む方法にたどり着く。バッチはエディタで編集するだけなので、変化も少ないしメンテも簡単というわけだ。
だがこの方法は一番最初のセットアップの諸々の作業の自動化が難しい。そこで、最近サーバを作るといえばクラウドの仮想サーバばかりなのだし、この自動化機能のひとつである「スタートアップスクリプト」を活用しようと思う。
スタートアップスクリプトの原理は非常に単純だ。コンパネで書いたbashのスクリプトを、サーバ作成時にディスクに書き込んでしまい、起動時に自動実行するというものだ。スクリプトにはうまい仕掛けを施して、最初の一度目だけ実行したら自分を消してしまうようになっている(残すこともできる)。MS-DOS世代にはautoexec.batを連想させる仕組みだ。サーバ起動時に行う決まりきったコマンドラインやバッチ処理なら、スタートアップスクリプトにコマンドを書き連ねるだけで、大抵の作業は完璧にこなせる。詳しいことはオンラインマニュアルをご覧いただきたい。
スタートアップスクリプトの欠点を強いてあげるとすれば、スクリプトの編集をコンパネに任せざるを得ず、バージョン管理などが難しいことだ。だが実はこれは簡単に改善できる。スタートアップスクリプトを「GitHubからスクリプトを読み込むコード」にしておき、実際に処理したい作業はGitHubでメンテナンスすればよいのだ。というわけで以下に具体的な方法を示そう。
スタートアップスクリプト
まずスタートアップスクリプトを示す。
#!/bin/bash # @sacloud-name "Northcave Setup" # @sacloud-once # # @sacloud-require-archive distro-centos distro-ver-7.* # # @sacloud-desc-begin # Linuxサーバを自分好みに設定します。 # スクリプトの実体は https://github.com/ken-washikita/northcave-startup にあります。 # ※ このスクリプトは、CentOS7.Xで動作します # @sacloud-desc-end # load & exec curl -L https://raw.githubusercontent.com/ken-washikita/northcave-startup/master/centos7/startup.sh | bash # end
このスクリプトの正味の実体は15行目のcurlだけだ。ここからGitHubに置かれたインストール用のスクリプトを読み込み、実行している。そのほかのコメントに書かれている記法はスタートアップスクリプトのメタ指令で、これらについてはぜひマニュアルページをご覧いただきたい。ただ利用するなら、読み込むスクリプトのURLを書き換え、コンパネから貼り付けるだけでOKだ。
こうして作成したスタートアップスクリプトは、サーバ作成時に指定して埋め込むことができるようになる。あとは、該当のスクリプトを作成しメンテナンスすればよい。
セットアップスクリプトの例
セットアップを実際に行うスクリプトは、お好みに合わせて自由に書いていただければと思うが、具体的にどのように書くかを例示したいと思う。実際のコードは https://github.com/ken-washikita/northcave-startup をご覧いただきたい。
パッケージの追加
# install packages yum -y install wget yum-utils python-inotify || exit 1
使いたいのに初期イメージに入っていないプログラムをインストールする場合は、こんな風に書く。自分はcurlよりwgetが好きなので追加している。他に、先日記事にしたfail2banのためのpython-inotifyなども入れている。エラー発生時にコード1で終了すると、後でスタートアップスクリプトのデバッグに使える。
ファイルの一部の書き換え(sedの使い方)
# locale sed -i 's/ja_JP/en_US/' /etc/locale.conf # PAM sed -i '/^UsePAM no/s/no/yes/' /etc/ssh/sshd_config # logrotate sed -i '/^rotate 4$/s/4/10/' /etc/logrotate.conf
設定ファイルの一部をちょっと書き換えたい、ということはよくあるが、そういうときはsedが便利だ。-iオプションはファイルを書き換えて上書きすることを指示するもので、上記のように使えば簡単だ。
蛇足だが「/検索パターン/s/置換前パターン/置換後文字列/」という記法は、特定行で置換を行いたいときに使える便利な手法だ。基本原則は「アドレス・コマンド」の組み合わせから逸脱していない。上記の例では、たとえば「s/^rotate 4/rotate 10/」としてもよいのだが、マッチのパターンと置換したいパターンが異なるときはこの記法を使うと分かりやすくなるので便利だ。
ファイルの作成
# vi cat <<EOL >/root/.vimrc set compatible syntax off set ai map g 1G map q :e# set cpo-=% set notitle set tabstop=4 set shiftwidth=4 set encoding=utf-8 set fileencodings=utf-8,euc-jp,sjis,cp932 set ambiwidth=double set history=50 set more EOL sed -i '/^map q/s/$/\r/' /root/.vimrc
ファイルを作成するときはこのようにヒア・ドキュメントを使うと楽だ。ちなみにsedを使った奇妙な置換をしているのは、ファイルの中にコントロール文字(具体的には^M)を置くと、GitHubやどこかで落とされるかもしれないと考えたからだ。 杞憂かもしれないが 、念のためということでこうしている。
サーバ作成後の処置
自分のスクリプトでは、セットアップスクリプト実行後はリブートしない。これは動作チェックをやっておきたいのと、自分で yum update をしたいと思うので、意図的にリブートしないようにしている。確実にアップデート・リブートしたいという方は、スクリプトの末尾に
yum -y update reboot
を追記しておくとよい。