Puppetで行うLinuxシステムの自動設定と設定管理

 多数のサーバーを運用している場合などに面倒なのが、サーバーごとの環境管理だ。そのため注目されているのが、サーバーの環境設定やインストールなどを自動化する設定管理ツールである。今回はその中でも比較的古くから使われている「Puppet」というソフトウェアを紹介する。

 あらかじめ用意しておいた設定ファイルに基づいてサーバーのさまざまな設定を自動的に行うソフトウェアを、設定管理ツールと呼ぶ。今回紹介する「Puppet」は、スタンドアロンおよびクライアント/サーバー構成でサーバー設定を集中管理できる設定管理ツールだ。行える設定はユーザー/グループの作成やネットワーク関連の設定、パッケージのインストールなど多岐にわたる。

 また、「モジュール」と呼ばれる機能拡張のための仕組みも用意されており、目的に応じた「モジュール」をインストールすることで簡単に設定対象を拡張できるという特徴を持つ。モジュールは誰もが開発・公開することができ、Puppet Forgeというモジュールを集めて公開するWebサイトも提供されている(図1)。

図1 Puppet向けのモジュールを集めて公開している「Puppet Forge」
図1 Puppet向けのモジュールを集めて公開している「Puppet Forge」

 PuppetはPuppet Labsという企業が開発しており、無償で利用できるオープンソース版と、サポート付きの商用版である「Puppet Enterprise」の2つのエディションが公開されている。今回はこのうち、オープンソース版について紹介する。

Puppetの仕組み

 PuppetはRubyで実装されており、各種操作の実行を行うためのフロントエンドであるpuppetコマンドと、各種機能を実装したRubyライブラリから構成されている。RPM/debパッケージ形式で入手する場合、クライアントとサーバーで別のパッケージに分割されている場合があるが、どちらも内部的にはpuppetコマンドを利用するようになっている。

 Puppetでは、サーバー設定を記述したファイルを「manifest(マニフェスト)」と呼び、設定すべき項目を「リソース」と呼ぶ。扱えるリソースの種類(リソースタイプ)にはユーザーの管理を行うための「user」やサービスの管理を行うための「service」、ソフトウェアパッケージの管理を行う「package」などさまざまなものが用意されており、これらリソースに対し設定すべき項目とその値をマニフェストファイルに記述していく。

 マニフェストファイルに記述した設定は、puppetコマンドでそのマニフェストを実行することでサーバーに反映される。また、クライアント/サーバー構成を取っている場合、クライアントは一定間隔でサーバーにアクセスし、マニフェストが変更されていれば自動的にそれを再実行して設定を変更する。そのほか、サーバーからクライアントに通知を送ってマニフェストを実行させることも可能だ。

 なお、Puppetではスクリプトやモジュールを利用することで多岐にわたる設定管理が可能だが、OSのインストール作業やPuppet自体のインストールを自動化することはできない。これらは手動で行うか、もしくはインストールを自動化するなんらかの仕組みを別途用意する必要がある。

Puppetの入手方法とRPM/debパッケージ

 Puppetのソースコードやバイナリパッケージは開発元であるPuppet LabsのWebサイトで公開されている。記事執筆時のPuppetの最新版は3.2.3だ。

 一部のLinuxディストリビューションではその公式リポジトリからも入手できるが、提供されているバージョンが古い可能性があるので注意したい。たとえばDebian Wheezyのリポジトリで提供されているのは旧版である2.7系だ。Fedora Projectが提供しているRed Hat Enterprise Linux(RHEL)やCentOSなどその互換ディストリビューション向けのパッケージリポジトリである「Extra Packages for Enterprise Linux(EPEL)」で提供されているのはバージョン2.6系とさらに前のバージョンのものになっている。そのため、Puppet Labsが公開しているパッケージリポジトリを利用することをおすすめする。ドキュメントページに各ディストリビューションごとのリポジトリ設定方法が記載されているので、こちらに従って適切なパッケージをインストールすればリポジトリを利用できるようになる。

 たとえばx86_64版のRHELもしくはCentOS 6系の場合、以下のようにしてpuppetlabs-releaseパッケージをインストールすることで、yumコマンドでPuppet Labsのリポジトリを利用できるようになる。

# rpm -ivh http://yum.puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-7.noarch.rpm

スタンドアロンでPuppetを使う

 Puppetでは、ローカルだけで完結するスタンドアロン構成と、クライアント/サーバー構成のどちらでも利用できる。複数台のサーバーを管理する場合、設定を集中管理できるクライアント/サーバー構成を取ることが多いが、まずはPuppetによる設定管理の基本を押さえるため、スタンドアロン構成でテストを行ってみることをおすすめする。

 なお、以下ではCentOS 6系の最新版であるCentOS 6.4での設定およびテスト例を紹介するが、ほかのLinuxディストリビューションでも基本的な設定方法や利用方法はほぼ同じだ。また、Puppetのバージョンは3.2.3を使用している。

Puppetのインストール

 スタンドアロンでPuppetを利用する場合、puppetパッケージのみをインストールすれば良い。Puppet Labsのリポジトリを利用できる状態であれば、以下のようにyumコマンドでインストールできる。

# yum install puppet

manifestの作成

 前述のとおり、Puppetではマニフェストと呼ばれるファイルに設定内容を記述する。マニフェストファイルの拡張子は.ppで、/etc/puppet/manifestsディレクトリに配置するのが一般的だ。このディレクトリは自動的には作成されないので、以下のようにして手動で作成しておく。

# mkdir -p /etc/puppet/manifests

 マニフェストファイル内で設定を定義する基本的な書式は、以下のようになる。

<リソースタイプ> { <リソース名>:
  <パラメータ1> => <値1>,
  <パラメータ2> => <値2>,
  
  
}

 「リソースタイプ」はリソースの種類を指定するもので、Puppetのドキュメントにその一覧がまとめられている。「リソース名」は設定対象とするリソースを指定するもので、通常は「’」(シングルクォート)もしくは「”」(ダブルクォート)で囲んだ文字列で指定する。「パラメータ」および「値」はリソースのオプションパラメータを指定するもので、複数を指定可能だ。

 たとえば、「taro」という名前のユーザーおよびグループを作成するマニフェストは、以下のようになる。

# グループを作成する
group { "taro":
  gid => 1000,
  ensure => present
}

# ユーザーを作成する
user { "taro":
  ensure => present,
  home => "/home/taro",
  managehome => true,
  uid => 1000,
  gid => 1000,
  shell => "/bin/bash",
  comment => "Taro Yamada",
  password => '$6$OmC3KootOURrqOaP$63rwQ2bSE8op8wXa.ZWzgxm/iGvePTzEL5lOntmkPyYh5Qwh4lWs2DtyoEHcvsbYV5Q6a2ezzrZueb2ydrkhz0'
}

 ここで初めに指定している「group」というリソースタイプは、グループに関する設定を行うものだ。リソース名には「taro」という文字列を指定しているので、この設定項目は「taro」というグループに関する設定を行うというものになる。パラメータ「gid」はこのリソースタイプ固有のパラメータで、前者はグループID(gid)を整数で指定するものだ。また、「ensure」はそのグループに対しどのような処理を行うかを指定するもので、「present」を指定すると「グループを作成する」という処理になる。ちなみに、「absent」を指定すると、「グループを削除する」という処理が行われる。

 次の「user」というリソースタイプは、ユーザーに関する設定を行うものだ。ここでは「taro」というユーザーを作成し、そのユーザーIDは1000、グループIDも1000を指定している。それに加え、ホームディレクトリや利用するシェル、コメントなども指定している。なお、「password」パラメータにはハッシュ化されたパスワードを指定する。パスワードのハッシュ化はgrub-cryptコマンドで行える。

# grub-crypt --sha-512
Password:  ←ハッシュ化したいパスワードを入力
Retype password:  ←再度同じパスワードを入力
$6$OmC3KootOURrqOaP$63rwQ2bSE8op8wXa.ZWzgxm/iGvePTzEL5lOntmkPyYh5Qwh4lWs2DtyoEHcvsbYV5Q6a2ezzrZueb2ydrkhz0$6$OmC3KootOURrqOaP$63rwQ2bSE8op8wXa.ZWzgxm/iGvePTzEL5lOntmkPyYh5Qwh4lWs2DtyoEHcvsbYV5Q6a2ezzrZueb2ydrkhz0$6$OmC3KootOURrqOaP$63rwQ2bSE8op8wXa.ZWzgxm/iGvePTzEL5lOntmkPyYh5Qwh4lWs2DtyoEHcvsbYV5Q6a2ezzrZueb2ydrkhz0.ZWzgxm/iGvePTzEL5lOntmkPyYh5Qwh4lWs2DtyoEHcvsbYV5Q6a2ezzrZueb2ydrkhz0
↑ハッシュ化されたパスワードが表示される

 さて、作成したマニフェストは、「puppet apply <マニフェストファイル>」コマンドで実行できる。たとえば、先のようにuserおよびgroupに関する設定を記述したマニフェストを実行すると、次のようにグループおよびユーザーが作成された旨が表示される。

# puppet apply /etc/puppet/manifests/site.pp
Notice: /Group[taro]/ensure: created
Notice: /User[taro]/ensure: created
Notice: Finished catalog run in 0.26 seconds