トップ «前の日記(2013-02-13) 最新 次の日記(2013-02-21)» 編集

人徳ゼロ日記


2013-02-20

_ puppetlabs-postgresqlモジュールはDB内の管理までできる

前の記事( puppetコマンドに、pupet forgeからモジュールをダウンロードしてインストールする機能がついていた) で紹介したように、 Puppetlabsが作成したPostgreSQLモジュール は思ったより良かったです。試しに使って見ました。OSはCentOS6.1です。

モジュールのダウンロードと展開

モジュールのダウンロードと展開は、前の記事に書いた ように、puppet module install puppetlabs-postgresqlで行えます。

$ puppet module install puppetlabs-postgresql
Preparing to install into /etc/puppet/modules ...
Downloading from https://forge.puppetlabs.com ...
Installing -- do not interrupt ...
/etc/puppet/modules
└─┬ puppetlabs-postgresql (v1.0.0)
  ├── puppetlabs-firewall (v0.0.4)
  └── puppetlabs-stdlib (v2.6.0)

PostgreSQLクライアントのインストール

まずは、PostgreSQLのデータベースサーバ本体ではなく、 クライアントパッケージ(postgresql)をインストールします。

クライアントはpostgresqlクラスになります。 site.ppのnode定義にpostgresqlクラス呼び出しを追加します。 以下はPuppet3.0の新機能Hiera auto-lookupの使い方 で紹介したように、hiera_include(classes)でHieraでインクルードするクラスを指定しているので、 ノードごとのHieraファイルに記載します。

ファイル: /etc/puppet/manifests/site.pp

node mgcent61 {
  hiera_include(classes)
}

ファイル: /etc/puppet/hieradata/mgcent61.yaml

classes:
  - postgresql

puppet適用

# puppet agent --no-daemonize --onetime --server mgcent61 -v
(PostgreSQLクライアントのインストールが行われる)
# rpm -qa |grep postgre
postgresql-libs-8.4.7-2.el6.x86_64
postgresql-8.4.7-2.el6.x86_64

PostgreSQLサーバのインストール

サーバはpostgresql::serverクラスになります。 引数config_hashはハッシュテーブル形式でパラメタを渡します。 例ではPostgreSQLのスーパーユーザであるpostgresユーザのパスワードを指定しています。

ファイル: /etc/puppet/hieradata/mgcent61.yaml

classes:
  - postgresql
  - postgresql::server
postgresql::server::config_hash:
  postgres_password: postgres1

puppet適用

# puppet agent --no-daemonize --onetime --server mgcent61 -v
(PostgreSQLのサーバがインストールされて、デーモンが立ち上がった)
# rpm -qa |grep postgre
postgresql-libs-8.4.7-2.el6.x86_64
postgresql-8.4.7-2.el6.x86_64
postgresql-server-8.4.7-2.el6.x86_64
# service postgresql status
postmaster (pid  1324) を実行中...
# psql -W -U postgres -h localhost
ユーザ postgres のパスワード: 
psql (8.4.7)
"help" でヘルプを表示します.
postgres=# 

PostgreSQLのデータベース作成(ラッピングリソースpostgresql::db)

データベース作成、PostgreSQLのユーザ作成、ユーザへの権限設定を一度に行うリソースpostgresql::db があります。一度に行えて便利ように見えますが、細かい制御ができないので、個人的にはあまりおすすめできませんが、 一応例を書いておきます。 なお、postgresql::dbはクラスではなくリソースなので、Hieraのauto lookupが使えません。 site.ppのnode定義で明示的にリソースのインスタンス化をします。 以下の例では、testdb1と言う名前のデータベースを作成し、データベースユーザtestuserを作成します。

ファイル: /etc/puppet/manifests/site.pp

node mgcent61 {
  hiera_include(classes)
  postgresql::db { 'testdb1':
    user     => 'testuser',
    password => 'password1',
    grant    => 'all'
  }
}

puppet適用

# puppet agent --no-daemonize --onetime --server mgcent61 -v
(DB作成、DBユーザ作成が行われる)
$ psql -W -U postgres -h localhost
ユーザ postgres のパスワード: 
psql (8.4.7)
"help" でヘルプを表示します.
postgres=#  select * from pg_database where datname='testdb1';  ←データベースができていることの確認
 datname | datdba | encoding | datcollate | datctype | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | dattablespace | datconfig |                                     datacl                                     
---------+--------+----------+------------+----------+---------------+--------------+--------------+---------------+--------------+---------------+-----------+----------------------------------------------------------------------------------
 testdb1 |     10 |        6 | C          | C        | f             | t            |           -1 |         11563 |          648 |          1663 |           | {=T/postgres,postgres=CTc/postgres,testuser=CTc/postgres,testuser2=CTc/postgres}
(1 行)
postgres-# \q
$ psql testdb1 -W -U testuser -h localhost   ←作成したユーザでログイン	
ユーザ testuser のパスワード: 
psql (8.4.7)
"help" でヘルプを表示します.
testdb1=> 

postgresql::dbはDB,ユーザを一度に作成してしまうので、 後から変更したくなった場合に色々困ってしまいます。 それでは、postgresql::dbのパラメタを変更して、 ユーザ名をtestuser→testuser2に変更してみます。

ファイル: /etc/puppet/manifests/site.pp

node mgcent61 {
  hiera_include(classes)
  postgresql::db { 'testdb1':
    user     => 'testuser2',
    password => 'password2',
    grant    => 'all'
  }
}

puppet適用

# puppet agent --no-daemonize --onetime --server mgcent61 -v

結果: 新規にtestuser2が作成された。以前のtestuserは残ったまま。

元々Puppetは後から変更できることが利点の1つですが、 後から変更に柔軟に対応できないのはPuppetの良さが減ってしまうので、 postgresql::dbは後から変更が必要ないと分かっているときだけにした方が良いです。 なお、個別に削除するPuppetの書き方として、 postgresql::database_user { "testuser": ensure => absent } と明示する方法がよく使われるのですが、PostgreSQLモジュールではまだ実装されていないようです。

データベースと、PostgreSQLのユーザの管理を個別に行うには、以下のリソースを利用します。 どちらもクラスではなくリソースです。

  • データベース postgresql::database
  • データベースのユーザ postgresql::database_user