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

パッケージをインストールする

 続いて、いくつかの設定例を紹介していこう。パッケージをインストールさせるには、「package」というリソースタイプを指定する。次の例は、sudoパッケージをyum経由でインストールするものだ。

package { "sudo":
  provider => "yum",
  ensure => "installed"
}

 「provider」パラメータでは、利用するパッケージマネージャを指定する。また、「ensure」パラメータではそのパッケージをどうするかを指定する。「installed」を指定すると、そのパッケージがインストールされる。ただし、この場合パッケージがインストールされているかどうかのみがチェックされ、最新版であるかどうかは保証されない。もし常に最新版をインストールしたい場合は、ここで「latest」を指定すれば良い。

 yumを利用せず、直接RPMパッケージファイルを指定してインストールさせることも可能だ。その場合、providerパラメータには「rpm」を指定する。次の例は、「source」パラメータで指定したRPMファイルをインストールさせるものだ。

package { "epel-release":
  provider => "rpm",
  ensure => "installed",
  source => "http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm"
}

設定ファイルを追加する

 設定ファイルなど、ファイルを作成するには「file」というリソースタイプを使用する。次の例は、「/etc/sudoers.d/taro」というファイルを「root:root」、「0600」というパーミッションで作成するものだ。

file { "/etc/sudoers.d/taro":
    mode => "0600",
    owner => "root",
    group => "root",
    content => "taro ALL=(ALL) ALL",
    require => Package["sudo"]
}

 作成するファイルの内容は「content」パラメータで指定できる。ここでは、「taro ALL=(ALL) ALL」というのがファイルの内容になる。また、「require」パラメータは、そのリソースを作成するのに必要なリソースを指定するものだ。「Package[“sudo”]」という値は「package」というリソースタイプの「sudo」というリソースが必要ということを意味している。

 この「require」というパラメータはすべてのリソースタイプで共通のパラメータで、「metaparameter(メタパラメータ)」などと呼ばれている。詳しくはMetaparameter Referenceドキュメントを参照してほしい。

変数を利用する

 マニフェスト内では、変数の利用が可能だ。変数名は「$」で始まる文字列で指定する。たとえば、「$foo」という変数に「bar」という文字列を格納するには、以下のようにする。

$foo = "bar" = "bar"

 変数はマニフェストファイル内で文字列や数値として利用可能だ。さらに、ファイル内で「”」で囲まれている文字列内に変数が登場した場合、その変数は格納されている値に置き換えられる。たとえば上記のように$foo変数が定義されていた場合、「”$foo”」という文字列は「”bar”」に変換される。いっぽう、「’」で囲まれている文字列では変数展開は行われない。つまり、「’$foo’」という文字列は「’$foo’」のままとなる。

 自分で定義した変数だけでなく、いくつかの変数はあらかじめ値が格納された状態になっている。そのなかでも、よく利用されるのがFacter変数と呼ばれるものだ。Facter変数はシステムに関する情報が格納される変数群で、facterと呼ばれるRubyライブラリによって設定される。指定される変数は、シェルでfacterコマンドを実行することで確認できる。

$ facter
architecture => x86_64
augeasversion => 0.9.0
 :
 :

 たとえば上記の場合、「$architecture」という変数には「x86_64」という文字列が格納される。

 次の例は、Facter変数を利用して設定ファイルを作成するものだ。

# httpdパッケージをインストール
package { "httpd":
  provider => "yum",
  ensure => "installed"
}

# httpdサービスを起動する
service { "httpd":
  name => "httpd",
  ensure => running,
  require => Package["httpd"]
}

# /var/www/testディレクトリを作成する
file { "/var/www/test":
  ensure => directory,
  owner => "root",
  group => "root",
  require => Package["httpd"]
}

# httpd用の設定ファイルを作成する
file { "/etc/httpd/conf.d/mysite.conf" :
  content => "
NameVirtualHost *:8000
<VirtualHost *:8000>
        ServerName         ServerName $hostname
        DocumentRoot /var/www/test
        ErrorLog logs/test-error_log
        CustomLog logs/test-access_log common
</VirtualHost>",
  mode => "0644",
  owner => "root",
  group => "root",
  subscribe => Service["httpd"]
}

  ここでは、「file」リソースタイプで指定した「/etc/httpd/conf.d/mysite.conf」というファイルの内容を「content」パラメータで指定している。contentパラメータの値として指定している文字列内には「$hostname」というFacter変数があり、これは実行時にそのホスト名に変換される。

 また、「subscribe」は指定したリソースが更新された際に処理を実行するよう指定するメタパラメータだ。ここでは、「service」というリソースタイプの「http」というリソースが更新されたときに処理を実行するよう指定している。

コマンドを実行する

 「exec」リソースタイプでは、任意のコマンドを実行できる。たとえば以下の例では、sedコマンドを実行して設定ファイルの値を置き換えている。

exec { '/bin/sed -i -e "s/^enabled\s*=\s*1/enabled=0/g" /etc/yum.repos.d/epel.repo':
  group => "root",
  user => "root",
  subscribe => Package["epel-release"],
  refreshonly => true
}

 なお、このリソースタイプで指定されたコマンドはデフォルトではマニフェストが実行されるたびに実行されてしまう。そのため、ここでは「refreshonly」パラメータで「true」を指定し、subscribeで指定したリソースが更新された場合のみコマンドを実行するようにしている。

モジュール

 Puppetが標準で扱えるリソース型はType Referenceドキュメントで確認できるが、「モジュール」と呼ばれる機能拡張をインストールすることで、これ以外のリソースを扱うことも可能になる。モジュールはPuppetの開発元であるPuppet Labsだけでなく、サードパーティからも公開されており、Puppet Forgeというサイトにまとめられている。

 Puppet Forgeでは多くのモジュールが公開されている。たとえば「mysql」(http://forge.puppetlabs.com/puppetlabs/mysql)というモジュールでは、MySQLのインストールや設定を行うためのリソースを追加できる。

 モジュールのインストールは、「puppet module install <モジュール開発者>/<モジュール名>」というコマンドで行える。たとえばmysqlモジュールをインストールするには、以下のようにする。

# puppet module install puppetlabs/mysql

 モジュールをインストールすることで、そのモジュールで提供される機能がマニフェスト内で利用可能になる。たとえば、mysqlモジュールを使ってMySQLのクライアント(mysqlコマンド)をインストールするには、次の1行をマニフェストに加えるだけでよい。

class { "mysql": }

 言語バインディングなどもインストール可能だ。たとえば以下のように指定すると、Python用バインディングがインストールされる。

class { "mysql::python": }

 サーバーをインストールし、そのrootパスワードを「FooBar2000」に設定するには以下のようにする。

class { "mysql::server":
    config_hash => { "root_password" => "FooBar2000" }
}

 データベースやユーザーの作成も可能だ。たとえば「testdb」というデータベースを作成し、さらに「”testuser”@”localhost”」というユーザーにすべてのアクセス権限を与えるには以下のようにする。

mysql::db { "testdb":
  user     => "testuser",
  password => "testpassword",
  host     => "localhost",
  grant    => ["all"],
}

 Puppetにはそのほかにも多くのモジュールやリソースタイプが用意されており、一般的に必要なほぼすべてのサーバー環境設定が可能になっている。詳しくは先に述べたドキュメントなどを参照して欲しい。