アジャイル DevOps

インフラストラクチャーの自動化

インフラストラクチャーを Chef あるいは Puppet でコードとして扱う

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: アジャイル DevOps

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:アジャイル DevOps

このシリーズの続きに乞うご期待。

インフラストラクチャーの自動化とは、環境をスクリプト化するプロセスです。このプロセスには、オペレーティング・システムのインストールから、インスタンスへのサーバーのインストールと構成、さらにインスタンスとソフトウェアとの間の相互通信方法の構成などの、さまざまな作業が含まれます。環境をスクリプト化することで、同じ 1 つの構成を単一ノードにも、数千のノードにも適用できるようになります。

インフラストラクチャーの自動化は通称、構成管理、IT 管理、プロビジョニング、スクリプト化されたインフラストラクチャー、システム構成管理とも呼ばれています。この他にも多くの重複する言い回しがありますが、その要点は同じです。つまり、インフラストラクチャーとその構成を 1 つまたは複数のスクリプトとして記述することで、極めて間違いが起こりにくい方法で環境を複製できるということです。インフラストラクチャーを自動化すると、権限を与えられたすべてのチーム・メンバーが優れた開発プラクティス (自動化されたテストとバージョン管理など) をインフラストラクチャーに適用するかたわらで、スクリプトを変更できるため、開発部門と運用部門の双方にアジリティーをもたらします。

この 10 年の間に、インフラストラクチャーの自動化をサポートするオープンソースおよび商用のツールが登場しました。そのうち、オープンソースのツールには Bcfg2、CFEngine、Chef、Puppet などがあります。これらのツールは、クラウドでも、仮想環境や物理環境でも使用することができます。この記事では、最もよく使われているオープンソースのインフラストラクチャー自動化ツールである、Chef と Puppet に焦点を当てます。これらのツールの複雑な部分について説明することはしませんが、この 2 つの類似点と相違点を説明するとともに、代表的なサンプル・コードを記載します。インフラストラクチャー自動化ツールのセットアップ手順と使い方を説明した詳しい例として、この記事では Puppet をクラウド環境で実行する方法を解説する動画も併せて提供しています。

Chef と Puppet はどちらも、環境をスクリプト化するために Ruby のドメイン特化言語 (DSL (Domain-Specific Language)) を使用します。Chef は Ruby の内部 DSL として表現されます。Puppet ユーザーは主に Ruby の外部 DSL (同じく Ruby で作成されています) を使用します。多くの場合、この 2 つのツールは Linux システムの自動化に使用されていますが、Windows のサポートも備えています。Puppet には Chef よりも大きなユーザー・ベースがあり、古い時代遅れのオペレーティング・システムに対するサポートもより充実しています。Puppet では、他のタスクへの依存関係を設定することができます。この 2 つのツールは両方とも、べき等です。つまり、同じ構成の場合には、何度実行しても常に同じ結果になります。

Chef

2009年頃から見かけるようになった Chef は、Puppet と CFEngine の影響を受けています。Chef がサポートしているプラットフォームには、Ubuntu、Debian、RHEL/CentOS、Fedora、Mac OS X、Windows 7、Windows Server などがあります。Chef は使いやすいと言われることが多いですが、Ruby 開発者の間では特にそう言われています。というのも、Chef ではあらゆるものが Ruby スクリプトとして定義され、Ruby 開発者が作業し慣れているモデルに従うためです。Chef には熱烈なユーザー・ベースがあります。Chef コミュニティーは急速に成長しており、ユーザーが互いに使用できるクックブックを次々と開発しています。

Chef の仕組み

Chef では、Chef サーバー、ノード、そして Chef ワークステーションという 3 つのコア・コンポーネントが互いにやりとりをします。Chef は、自動化されたステップ (「アクション」と呼ばれます) をノード上で実行する「レシピ」で構成された「クックブック」を実行して、ソフトウェアをインストールして構成したり、ファイルを追加したりします。Chef サーバーには、多数のノードを管理するための構成データが格納されます。ノードは、Chef サーバーに格納された構成ファイルやリソースを、必要に応じて抽出します。リソースの例には、File、Package、Cron、Execute などがあります。

ユーザーが Chef サーバーを操作するには、「Knife」という Chef のコマンドライン・インターフェースを使用します。ノードには、1 つ以上の「ロール」を割り当てることができます。ロールは 1 つのノードに対して属性 (ノード固有の設定) とレシピを定義し、それらを複数のノードに適用することができます。これらのレシピは、他のレシピを実行することもできます。「実行リスト」と呼ばれる、ノードの一連のレシピは、リストに記載された順に実行されます。Chef ワークステーションは、ローカルの Chef リポジトリーと Knife がインストールされたインスタンスです。

表 1 に Chef のコア・コンポーネントの説明を記載します。

表 1. Chef のコンポーネント
コンポーネント説明
属性ノードのデータ (IP アドレスやホスト名など) を記述します。
Chef クライアントノードに代わって機能します。1 つの Chef クライアントが、複数のノードに対してレシピを実行することができます。
Chef SoloChef サーバーなしで Chef のクックブックを実行できるようにします。
クックブックインフラストラクチャーの自動化に必要なすべてのリソースが含まれており、他の Chef ユーザーと共有することができます。一般に、クックブックは複数のレシピからなります。
データ・バッグノードおよびロールがグローバルに使用できるデータが含まれます。
Knifeシステム管理者が構成の変更を Chef サーバーにアップロードするために使用します。Knife は、ノード間で SSH 通信を行うために使用されます。
管理コンソールノード、ロール、クックブック、データ・バッグ、および API クライアントを管理するための Chef サーバーの Web インターフェースです。
ノードChef クライアントを実行するホストです。Chef の視点から見たノードの主要な機能は、その属性と実行リストです。ノードは、レシピとロールを適用する対象のコンポーネントです。
Ohaiオペレーティング・システムに関するデータを検出します。スタンドアロンでも使用できますが、ノードのデータを Chef に提供することを主要な目的とします。
レシピChef に必須の構成です。レシピはリソースの集合をカプセル化します。これらのリソースが定義された順に実行されて、ノードが構成されます。
リポジトリー (Chef リポジトリー)クックブック、ロール、構成ファイルの他に、Chef でシステムを管理するためのその他の成果物がホストされる場所です。
リソースノード上で構成される要素を、特定のプラットフォームに依存することなく抽象化したものです。例えば、ユーザーとパッケージを OS プラットフォームによって異なる構成にすることができます。Chef はこのような処理の複雑さを抽象化して、ユーザーには見えないようにします。
ロール類似したノードの同様の機能をグループ化するためのメカニズムです。
サーバー (Chef サーバー)サーバーの構成を一箇所に集めたリポジトリーです。

サンプル・コード

リスト 1 に、Tomcat クックブックの一部となっているレシピ内の service リソースの使用例を示します。このように、Chef のようなツールを使用すれば、プラットフォーム固有の構成を行ってサーバー構成を管理することができます。

リスト 1. Chef のレシピ
service "tomcat" do
  service_name "tomcat6"
  case node["platform"]
  when "centos","redhat","fedora"
    supports :restart => true, :status => true
  when "debian","ubuntu"
    supports :restart => true, :reload => true, :status => true
  end
  action [:enable, :start]
end

リスト 2 に、Tomcat クックブックの属性を定義します。この例では、Tomcat サーバーにいくつかの外部ポートを定義して使用できるようにしています。上記に記載されている以外のタイプの属性には、ディレクトリー、オプション、ユーザー、その他の構成の値があります。

リスト 2. Chef の属性
default["tomcat"]["port"] = 8080
default["tomcat"]["ssl_port"] = 8443
default["tomcat"]["ajp_port"] = 8009

Chef は (外部 DSL と対比すると) Ruby 言語を拡張して、多数のノードに一度に構成を適用するためのモデルを提供します。Chef は明示的な依存関係管理を抜きにした命令型モデルを使用するため、開発分野で経験を重ねてきたユーザーは、環境をスクリプト化しているときに Chef に関心を寄せるようになる傾向があります。

Puppet

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=DevOps, Java technology
ArticleID=839180
ArticleTitle=アジャイル DevOps: インフラストラクチャーの自動化
publish-date=10112012