IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

クラウド時代のオープンソース実践活用

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第22回 Puppet/Chefの動作原理を理解できていますか? (中井悦司) 2013年6月

はじめに

 みなさんは、「VIOPS(Virtualized Infrastructure Operators group)」というコミュニティをご存知でしょうか? 主には、データセンターでサーバ/ネットワークの運用にあたるエンジニアが、最新の技術動向を学ぼうということで、5年前に設立されたコミュニティです。昨年のワークショップにおいて、GlusterFS/Red Hat Storageの紹介をさせていただいた事をきっかけに、筆者もその活動に協力させていただいています。
 今年は、7/19(金)の「VIOPS08 WORKSHOP」において、「System Automationパネル・セッション」に登壇することになりました。ハードウェア/ソフトウェアの両面での最新技術を扱う、めずらしい形態のワークショップです。興味のある方には、ぜひご参加いただければと思います。
 さて、今回は、アプリケーションの導入・設定を自動化するツール「Puppet」を紹介します。多数のサーバを扱うデータセンターでは、以前より広く使われてきたツールですが、最近、クラウド環境の構築に利用されるようになり、新しくPuppet(もしくは、類似のツールであるChef)を使い始める方も増えています。ところが、Puppet/Chefの解説書を読むと、「宣言型」「冪等性(べきとうせい)」と言った小難しい用語が登場するため、使いこなすのは難しいというイメージを持つ方も多いのではないでしょうか?
 ここでは、Puppetの動作原理をもとに、これらの用語の意味を噛み砕いて説明します。Puppetの根底にある「考え方」を理解した上で、解説書を読み進めれば、よりすっきりと理解できることでしょう。Puppetの入門には、(*1)の電子書籍がお勧めです。

Puppetの真価は「現状確認機能」

 アプリケーションの導入・設定を自動化する場合、規定のコマンドをシェルスクリプトから実行する方法があります。ところが、多数のサーバで同じシェルスクリプトを実行すると、サーバによっては想定外のエラーが発生することがあります。あるパッケージの導入コマンドを実行した場合、サーバによっては、古いバージョンのパッケージが導入されていたためにエラーになるといった例が考えられます。
 人間がコマンドを実行する場合は、エラーに気づいて適切な対応をとることができますが、スクリプトではそうは行きません。エラーを無視して次のコマンドに進んでしまい、最終的にサーバの状態がどうなったか分からなくなる恐れもあります。この問題の根本原因は、「現在の状態」を確認せずに機械的にコマンドを実行する部分にあります。仮に人間がコマンドを実行する場合でも、エラーが出てから対応を考えるのではなく、導入済みパッケージを確認した上で、適切なコマンドを判断して実行するべきです。
 実は、ここにPuppetの真価があります。Puppetで設定処理を行う場合、利用者は、具体的なコマンドを指示する必要はありません。設定ファイル(マニフェスト)に、「希望する状態」を記載すると、Puppetは、現在の状態を確認した上で、希望する状態を実現するためのコマンドを自動的に判別します。
 次は、Puppetのマニフェストの最も単純な例で、「httpdパッケージの最新版が入っていて欲しい」という希望を表します。

package { 'httpd':
  ensure => latest,
}

 Red Hat Enterprise Linux(RHEL)の環境で、このマニフェストを適用したとします。Puppetは、RHELの環境では、yumコマンドで、導入済みパッケージの確認や新規パッケージの導入ができる事を知っています。まずは、yumコマンドでhttpdパッケージの導入状況を確認して、すでに最新版が導入されている場合は何もしません。あるいは、古いバージョンが導入されている場合は、最新版にアップデートするためのyumコマンドを実行します。未導入の場合は、もちろん最新バージョンを導入します。これを図示すると、図1のようになります。

fig01

図1 Puppetの動作原理

 決して複雑な仕組みではありませんが、「現在の状態を確認する」という仕組みのおかげで、現在のサーバの状態を気にせずに、いつでも安心して自動設定の処理が行えることになります。

冪等性なんて怖くない?

 これで、Puppetが「宣言型」と呼ばれる理由が分かりました。希望する状態を「宣言」すると、現在の状態と希望する状態のギャップを埋める方法(コマンド)をPuppet自身が考えてくれるという仕組みに他なりません。実行するべきコマンドを明示的に指定できないので、シェルスクリプトに慣れた方は、逆に最初は不便に感じるかも知れません。しかしながら、毎回、現状確認の処理をシェルスクリプトで作りこむのは大変です。Puppetを信頼して、処理を任せることが大切です。
 もちろん、既存のPuppetの機能だけでは、希望する設定ができない場合もあります。そのような際は、Puppetを自分自身で機能拡張することも可能です。機能拡張の仕組みについては、(*2)の書籍が参考になります。
 それでは、もうひとつの用語、「冪等性」についてはどうでしょうか? これは、「同じ処理を繰り返しても結果が同じになる」という意味ですが、図1を見れば、その理由は明らかです。既に希望する状態になっていれば、Puppetは何もしませんので、設定済みの項目に対して、同じマニフェストを適用しても結果は同じです。
 たとえば、httpdパッケージを導入するマニフェストを作成・適用した後に、httpdサービスの起動処理をマニフェストに追加したとします。再度、このマニフェストを適用した場合、パッケージ導入部分は実行されずに、サービス起動処理だけが実行されることになります。つまり、「httpdパッケージ導入」という処理について、冪等性が実現されているわけです。
 冪等性というと、「ビール注文」の喩え話(「ビール3本!」という注文を何度も繰り返すと、大量のビールがテーブルに届いてしまう)がよく出てきます。喩え話としては面白いのですが、Puppetにおける冪等性については、図1を見た方がすっきりと理解できるのではないでしょうか。
 なお、Puppetでは、例外的に、利用者自身が設定コマンドを指定する方法(Execリソース)が用意されています。Execリソースを使用する場合は、図1の仕組みが成り立つように、「現在の状態」を確認する方法(コマンド)も利用者が指示する必要があります。つまり、Execリソースの冪等性は、利用者自身で担保する必要がありますので、この点は注意が必要です。

次回予告

 今回は、Puppetの根底となる考え方を紹介しました。Puppetを活用する上では、この他には、設定順序を指定する「依存関係」の記述方法、さらには、設定項目をグループ化する「クラス」の利用方法などをマスターする必要があります。これらについては、(*1)などの入門書に譲ることにしておきましょう。
 次回は、Puppetを利用したOpenStackのインストールツール「Packstack」について、解説したいと思います。

参考資料

*1)「入門Puppet - Automate Your Infrastructure」栗林 健太郎(著)
 Puppetの基本的な使い方を具体例で紹介した上で、本格的に利用する際のノウハウも分かりやすく説明した電子書籍です。

*2)「Puppet Types and Providers」Dan Bode, Nan Liu(著)
 Puppetが設定に必要なコマンドを自動判別する、背後の仕組みを解説した書籍です。自分自身で機能拡張を行う必要がない場合でも、Puppetの仕組みを理解して使いこなす上で有益な知識になります。

 

++ CTC教育サービスから一言 ++
このコラムでLinuxや周辺技術の技術概要や面白さが理解できたのではないかと思います。興味と面白さを仕事に変えるには、チューニングやトラブルシューティングの方法を実機を使用して多角的に学ぶことが有効であると考えます。CTC教育サービスでは、Linuxに関する実践力を鍛えられるコースを多数提供しています。興味がある方は以下のページもご覧ください。
 CTC教育サービス Linuxのページ
 http://www.school.ctc-g.co.jp/linux/
 

Linux研修トレーニングならCTC教育サービス


 

筆者書籍紹介

Software Design plusシリーズ
「独習Linux専科」サーバ構築/運用/管理
  ――あなたに伝えたい技と知恵と鉄則

本物の基礎を学ぶ!新定番のLinux独習書

中井悦司 著
B5変形判/384ページ
定価3,129円(本体2,980円)
ISBN 978-4-7741-5937-9
詳しくはこちら(出版社WEBサイト)
「独習Linux専科」サーバ構築/運用/管理

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes