はじめに
CodeZineをご覧の皆様、はじめまして。USP友の会副会長の濱田と申します。サーバーエンジニアを生業としており、USP友の会で日々シェルスクリプトやシェル芸の腕を磨きながら、コマンドラインによるオペレーションの自動化などを研究しております。最近USP友の会の勉強会で「一撃サーバー構築シェルスクリプト勉強会」を始めましたので、機会を見つけてはご参加いただければ幸いです。
USP(ユニバーサル・シェル・プログラミング)友の会は、日本唯一の、シェルプログラミングファンのコミュニティです。2009年5月にスタートした本会は、シェルプログラミングに限らず、簡潔明瞭さ、創意工夫を尊ぶエンジニアが集まり、技術の話題に花を咲かせています(公式サイトより)。
会の活動として、上田隆一会長によるシェル芸勉強会をはじめとした各種勉強会や定例会を開催しております。オンラインでは、メーリングリストやTwitter 、Facebookページによる情報発信のほか、Facebookグループによる技術討論など活発に行っていますので、ぜひご参加ください。
一撃シェルスクリプトとは
これは私が作った造語で、厳密な定義というものを設けているわけではありませんが、「シェルスクリプト(と設定ファイルのひな形)を用意すれば、コマンドを1回実行するだけで環境構築ができてしまうというスグレモノ」を目指しています。現在のところ、線引きとして以下のように詳細なルールを作っています。
- OSインストール直後に一撃シェルスクリプトを配置して動かすものとする
- 実行回数は1回のみで、人が張り付く必要のない設計とする
- 対話式の入力は可能な限り回避する
一撃シェルスクリプトで重視していないこと
一撃シェルスクリプトは、あくまで「シェルで頑張れる範囲で冪等性(べきとうせい)を確保する」ツールです。なので、上に記した「一撃シェルスクリプトの定義」にだいたい合致していれば「これは一撃シェルスクリプトだぞ」と名乗ってもよいと思っています。例えば、何がなんでも1枚のスクリプトファイルのみで完結することを目的とせず、(インターネットに繋がっていることが前提ですが)設定ファイルが複数または多岐にわたる場合は、GitHubなどから雛形ファイルをダウンロードし、各々のホストで整形加工することもよしとしています。
これはベテラン勢によくありがちなのですが、いわゆる○○準拠というものに対しては、あまり重視するつもりはありません。最終的に望むものが出来上がるのであれば、人様に迷惑をかけない限り何をやってもよいと考えます。
なお、Linux(筆者の環境ではCentOSが多いですが)のデフォルトのシェルがBashまたはBourne Shell互換シェルであることから、ログインするシェルはともかく、一撃シェルスクリプトの実行環境はBashとしています。が、同一条件でインストールされたOSで冪等性が確保できるのであれば、どんな言語やシェルを使っても構いません。
構成管理ツールとして一撃シェルスクリプトを選ぶ理由
ここ数年、ChefやPuppet、Ansibleなどを用いた、インフラの構成をコードで管理する「Infrastructure as Code」が流行っています。一度に大量のサーバーを等しい品質で構築したりするのに便利ではありますが、反面、1台〜数10台の規模で構築する場合において、いわゆる「管理のための環境構築」に工数を割くことが困難な状況もあるかと思います。また、会社や顧客によってはこうしたツールを導入することに消極的な場合もあるでしょう。
シェルスクリプトで一撃インストールを行うためには、(テキストのコピペができるという意味で)sshクライアントさえあればよく、エージェントレスであるばかりか、構成管理サーバーのようなものを構築する必要がまったくないのがメリットです。サーバーにあるコマンド群のみを利用することで、導入障壁を下げる効果もあります。
あえて用意する物があるとすれば、サーバー(インストール対象)側と同じ文字コード・改行コードが使えるテキストエディタと、sshクライアントでしょう。これらだけあれば、一撃シェルスクリプトのコーディングを始められます。
シェルスクリプトをコーディングする環境(エディタ)の文字コード、特に改行コードはサーバー側と合わせておいてください。どんなに記述内容が正しくても、サーバーの文字コード(改行コード)と一致していないと正しく動かないことがあります。一般的に、UNIX系OS(LinuxやMac OS Xなどを含む)の改行コードはLF
、Windowsの改行コードはCRLF
です。
【訂正とお詫び】コラム「シェルスクリプトのコーディングに改行コードが重要な理由」で、Mac OS Xで使用される改行コードについて「(ただしMac OS Xの改行コードはCR
)」と記載しておりましたが、正しくはUNIXと同じくLF
が使用されます。この誤りは編集部側の修正ミスによるものです。訂正するとともに、読者ならびに著者の濱田氏に深くお詫びいたします。
ちょっと変わった実行方法としては、作成した一撃シェルスクリプトをWebサーバーにアップロードしておき、OSインストール直後のサーバーにsshログインしてから
curl http://……/一撃シェルスクリプト | sh
あるいは
ssh -t root@(OSインストール直後のサーバー) "curl http://……/一撃シェルスクリプト | sh"
のように実行するのも面白いでしょう。
シェルスクリプトを選ぶもう1つの理由
サーバー構築をシェルスクリプトでやる理由のもう1つ大きな理由としては、今までシェルスクリプトに親しんできたサーバーエンジニアにとって、他の言語を覚えるよりも学習コストが低いという点が挙げられます。普段使いのUNIXコマンド(sed
、awk
、grep
、head
、tail
、cut
など)で標準出力に吐き出される文字列を加工するのがお手の物であれば、もうあなたは一撃スナイパーとして、“シモ・ヘイヘ”レベルのスキルの持ち主でしょう。
また、あまりUNIXコマンドに親しみがなくても、一撃シェルスクリプトのコーディングを通じてUNIXコマンドを覚えたり、シェルスクリプトの作法を覚えることで、サーバーの構築だけでなくその後の運用にも役に立つスキルが身につくはずです。
シモ・ヘイヘ(Simo Häyhä['simɔ 'hæy̯hæ], 1905年12月17日~2002年4月1日)はフィンランドの軍人。フィンランドとソビエト連邦の間で起こった冬戦争では、ソビエト赤軍から“白い死神”と呼ばれ恐れられた。スナイパーとして史上最多の確認戦果(505名射殺)の記録を残している。愛称は「シムナ」。フィンランド現地語の発音にあわせる場合、シモ・ハユハ、もしくはシモ・ハウハと表記するのが近い(Wikipediaより引用)。