オープンソースなシステム自動管理ツール Puppet

第1回システム自動管理ツールの必要性とPuppetの概要

はじめまして。株式会社 paperboy&co. の宮下と申します。

この連載では、最近注目を集めているRuby製のシステム自動管理ツールPuppetについて、その概要から具体的なシステム管理への適用まで、実際の現場で利用するために必要な情報をお届けします。

システム管理とは

システム管理と一口に言っても、以下のような様々なタスクから構成されます。

  • ハードウェアの設置
  • ネットワークへの接続
  • OSのインストール/設定
  • ネットワークの設定
  • OSへの最新パッチ適用
  • ソフトウェアのインストール/設定
  • OS/ソフトウェアのアップデート
  • OS/ソフトウェの設定変更

細かく言えば、他にもタスクは色々ありますが、これらのタスクを通じてシステムを「あるべき状態」に維持するのがシステム管理である、と言えるのではないでしょうか。

システム自動管理ツールの必要性

それでは、システム管理の自動化はなぜ必要なのでしょうか? 手作業でのシステム管理には次の様な問題が常につきまといます。

  • システム管理に費やす時間
    • 単一サーバでも手作業では時間がかかる
    • ましてや数十台、数百台ともなると…
    • タスク間の待ち時間
    • 待ち時間中に並行して別の作業も可能だが、作業効率は格段に落ち、ミスも発生しやすくなる
  • 実際の設定と「あるべき状態」との乖離
    • 作業漏れ
    • 人為的なミス
    • 作業者のスキルのばらつき
    • 手順書の更新忘れ
  • 上記問題に起因するトラブルの顕在化

システム管理を自動化することによって、こういった問題を解決することが可能となります。

もちろん、システム管理タスクは、自動化ツールを導入しなくても、自前でスクリプトを書くなどして自動化することも可能ですが、システム自動管理ツールを導入することによって、以下の様なメリットが享受できます。

  • 使い捨てスクリプトの量産を防ぐことによる手間の軽減
  • 管理タスクを誰もが同じ形で定義でき、管理品質を均一化できる
  • 管理タスクを誰もが見える形で定義でき、変更履歴の追跡や監査が可能になる
    • 商用製品であれば組み込みの機能により実現
    • オープンソースなツールであればSubversionのようなSCM(Software Configuration Management System) 等と連携することにより実現

オープンソースなシステム自動管理ツールPuppet

システム自動管理ツールには、OpsWare、BladeLogicといったGUIベースの商用製品や、Cfengineというオープンソースで歴史のあるツールがありますが、本連載では、次世代Cfengineとして最近注目を集めている、Puppetをご紹介します。

Puppet開発元のウェブサイトhttp://puppet.reductivelabs.com/
Puppet開発元のウェブサイト

Puppetの特徴としては以下のものが挙げられます。

  • GPLに基づいたオープンソースであり、Rubyでできている
  • 独自の宣言型言語によりシステムを管理
  • クライアント/サーバ型アーキテクチャ
  • 抽象化レイヤー
  • 依存関係の処理
  • LDAPサポート
  • MLやIRCといったコミュニティの活動や、開発が活発

特に重要ないくつかの項目について、もう少し詳しく見ていきます。

独自の宣言型言語によりシステムを管理

Puppetでは、以下の様な独自の宣言型言語によって、システムのあるべき状態を記述し、システム管理を行います。

file { '/etc/hosts':
    owner  => 'root',
    group  => 'root',
    mode   => 644,
}

上の例では、⁠/etc/hostsのオーナー/グループはroot/rootであり、パーミッションが644である」という状態を記述しています。Puppetはこれに従い、/etc/hostsの状態をチェックし、オーナー、グループ、パーミッションを適切な状態に維持します。

この独自言語によってシステムのあるべき状態が記述されたファイルを「マニフェスト」と呼びます。

クライアント/サーバ型アーキテクチャ

Puppetはクライアント/サーバ型アーキテクチャとなっており、マニフェストはすべてPuppetサーバ上で管理されます。

Puppetクライアント(システム管理対象となるサーバ群)は、Puppetサーバに定期的(デフォルトでは30分)にアクセスしてマニフェストを取得し、自分自身をあるべき状態に維持します。

また、Puppetにはレポーティングの機能もあり、Puppetクライアントはマニフェストに従って実行したタスクの結果を、Puppetサーバへと通知します。

Puppet のクライアント/サーバ型アーキテクチャ
Puppet のクライアント/サーバ型アーキテクチャ

抽象化レイヤー

Puppetには抽象化レイヤーと呼ばれる、OS、ディストリビューション、パッケージシステム等の違いを吸収してくれるレイヤーがあります。これによりPuppetの利用者は、複数のOSが混在した環境でも、OSの違いを意識することなく、単一のマニフェストでシステムを管理することが可能となります。

抽象化レイヤーで吸収することができる差異の例としては、以下の様なものがあります。

  • Solaris / Linux / BSD
  • yum / apt / ports
  • adduser / useradd
  • /etc/passwd / NetInfo

たとえば、ユーザ追加用のマニフェストを記述する場合、コマンドがadduserなのかuseraddなのか、または、/etc/passwdで管理されるのかNetInfoで管理されるのか、といったことを意識することなく、以下の様に記述すればOKです。

user { 'miyashita':
    name       => 'miyashita',
    password   => 'password',
    managehome => true,
    groups     => 'paperboy',
}

依存関係の処理

Puppetでは、リソース(管理対象となるコンポーネント)間の依存関係を記述することができます。

class ssh {
    file { '/etc/ssh':
        source  => puppet://server/module/ssh,
        recurse => true,
        notify  => Service[ssh]
    },

    service { 'ssh':
        name   => sshd,
        ensure => running,
    }, 
}

この例では、/etc/ssh以下のファイルに変更があった場合、sshdを再起動する、といった動作になります。

以上がPuppetの概要です。Puppetがどんなツールなのか、掴んで頂けましたでしょうか?

次回は、実際にPuppetをインストールして動作させるまでの手順についてご紹介したいと思います。

参考URL
Puppet開発元のウェブサイト(英語)
Puppet日本語情報Wikiパペウィキ
桜井知之氏によるOSC2007発表資料『オープンソースによるシステム管理の自動化』(PDF)

おすすめ記事

記事・ニュース一覧