ChefとVagrantとBerkshelfとPostgreSQL 9.3beta

opscodeにあるPostgreSQLのcookbookでPGDGの9.3beta2をインストールするメモ。
9.3が正式リリースになればcookbook側で対応してくれると思いますが、それまでのつなぎとしてどうぞ。

使ってるcookbookはこれ。centos6.4で試してます。deb系はごめん。
http://community.opscode.com/cookbooks/postgresql

自分はVagrant+Berkshelfでゴニョゴニョしてるのでこんな感じで書いてます。
Vagrantfileの中身はこんな感じ。

  config.vm.provision :chef_solo do |chef|
    chef.json = {
      :postgresql => {
        :version => "9.3",
        :enable_pgdg_yum => true,
        :pgdg => {
          :repo_rpm_url => {
            :"9.3" => {
              :centos => {
                :"6" => {
                  :i386 => "http://yum.postgresql.org/9.3/redhat/rhel-6-i386/pgdg-centos93-9.3-1.noarch.rpm",
                  :x86_64 => "http://yum.postgresql.org/9.3/redhat/rhel-6-x86_64/pgdg-centos93-9.3-1.noarch.rpm"
                }
              }
            }
          }
        },
        :client => {
          :packages => ["postgresql93", "postgresql93-devel"]
        },
        :server => {
          :packages => ["postgresql93-server"],
          :service_name => "postgresql-9.3"
        },
        :contrib => {
          :packages => ["postgresql93-contrib"]
        },
        :dir => "/var/lib/pgsql/9.3/data",
        ## -------------------------------------------------------------
        ## postgresユーザのパスワードはこれ↓で生成した値を指定する(必須)
        ## $ echo -n 'HOGEHOGE' | openssl md5 | sed -e 's/.* /md5/'
        ## -------------------------------------------------------------
        :password => {
          :postgres => "6f2b5c2d20ab4dd08e8ee8c2b1c9b0b8"
        },
        ## -------------------------------------------------------------
        ## 以下はお好みで。
        ## -------------------------------------------------------------
        :config => {
          :listen_addresses => "*"
        },
        :pg_hba => [
          {:type => 'local', :db => 'all', :user => 'postgres', :addr => nil, :method => 'ident'},
          {:type => 'local', :db => 'all', :user => 'all', :addr => nil, :method => 'ident'},
          {:type => 'host', :db => 'all', :user => 'all', :addr => '127.0.0.1/32', :method => 'md5'},
          {:type => 'host', :db => 'all', :user => 'all', :addr => '::1/128', :method => 'md5'},
          {:type => 'host', :db => 'all', :user => 'all', :addr => '172.16.0.0/16', :method => 'md5'},
        ],
      }
    }
    chef.run_list = [
        "recipe[postgresql::server]",
        "recipe[XXXXXXXX::setup_postgresql]", # 後述
    ]
  end

recipeですが、pythonのcookbookを使ってpsycopg2をインストールするときにpg_configが見つからないと文句を言われたので、pathの通ったところにシンボリックリンクを張るようにしています。
あとはついでにcreateuserとcreatedbも実行するように追加。

recipes/setup_postgresql.rbの中身はこんな感じ。

link "/usr/bin/pg_config" do
  to "/usr/pgsql-9.3/bin/pg_config"
end

execute "create-user" do
  user "postgres"
  command "createuser -s foo"
  not_if "psql -U postgres -c \"select * from pg_user where usename='foo'\" | grep -q foo", :user => "postgres"
end

execute "create-database" do
  user "postgres"
  command "createdb -O foo bar"
  not_if "psql -U postgres -c \"select * from pg_database WHERE datname='bar'\" | grep -q bar", :user => "postgres"
end

データベースのデフォルトのエンコーディングがja_JP.UTF-8じゃないよーという人は、postgresのインストールより前にlocaleを設定するようにするか、createdbのオプションで指定すると良いと思います。

ruby使いじゃないうえにchefもよくわかっていないので、変なところがあるかも。