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

人徳ゼロ日記


2013-02-21

_ puppetlabs-postgresqlモジュールの裏側

puppetlabs-postgresqlモジュールはDB内の管理までできる で紹介したPuppetlabsのPostgreSQLモジュールですが、 内部ではpostgresql::psqlというリソースが中心的な役割を果たしています。 これは名前の通りpsqlでSQL文を発行するのですが、 Puppet的なidempotent(冪等性: 何度適用しても同じ結果になる)を保つために unlessでSQL文が実行される条件を指定できるようになっています。

以下はpostgresql::role内でpostgresql::psqlを呼び出している例です。

  postgresql::psql {"CREATE ROLE ${username} ENCRYPTED PASSWORD '${password_hash}' $login_sql $createrole_sql $createdb_sql $superuser_sql":
    db      => $db,
    user    => 'postgres',
    unless  => "SELECT rolname FROM pg_roles WHERE rolname='$username'",
  }

この例では、「作成すべきroleの存在チェックをして、存在しない場合のみroleを作成する」 と言う動作になりますこの仕組みはSQL文を使った管理で良くあるパターンなので、 かなり汎用的に使えるはずです。

psqlはパスワード入力なしでPuppetから発行できる必要があるのですが、 以下の条件を満たしている必要があります。 このモジュールでPostgreSQLを設定している場合は、 当然条件を満たした状態になっていますが、PostgreSQL自体は別途インストールしている場合は 注意が必要です。

  • PostgreSQLの設定ファイルpg_hba.confで、 ローカルからpostgresユーザからの接続は 認証なしで接続できるようにする。
    local   all         postgres                          ident  
    
  • postgresqlユーザでpsql実行する。 psqlコマンドの引数には、--no-passwordオプションをつけてパスワードを聞かれないようにする。
    psql --no-password --tuples-only --quiet --dbname $db"