Help us understand the problem. What is going on with this article?

備忘録 PostgreSQLでpsqlコマンド実行時にパスワードを省略したい。

More than 3 years have passed since last update.

pg_hba.confファイルを編集し、データベース接続ユーザーを管理したり、パスワード認証の設定を行ったりすることで、セキュリティ強化を図りました。

pg_hba.conf
# "local" is for Unix domain socket connections only
#local   all             all                                     trust
local   postgres   postgres                                 md5
local   dvdrental  zz01adm01                                md5
local   zipcode  zz01adm01,zz01upd1,zz01ref1,zz01app1      md5
#local  all             postgres                                trust
# IPv4 local connections:
#host    all             all             127.0.0.1/32            trust
host postgres postgres 0.0.0.0/0 md5
host dvdrental zz01adm01 0.0.0.0/0 md5
host zipcode zz01adm01,zz01upd1,zz01ref1,zz01app1 0.0.0.0/0 md5

今回、データベースzipcodeにアクセスするロールを作成するために(zz01upd01など)、chefで実行したところエラーとなったところが、今回の調査のきっかけ。

いろいろ調べていたら、.pgpassファイルを利用することで、psqlコマンド実行時にパスワード入力が不要になるようです。

1.最初に遭遇したエラー

chefを実行したときに、気付きました。
そういやレシピ実行中にパスワードなんて入れることできないねーって。

[chef@test01 recipes]$ sudo chef-solo -c /home/chef/chef-repo/solo.rb -o "recipe[psql::crt_role]"
[sudo] password for chef:
Starting Chef Client, version 12.18.31
[2017-05-22T10:35:12+09:00] WARN: Run List override has been provided.
[2017-05-22T10:35:12+09:00] WARN: Original Run List: []
[2017-05-22T10:35:12+09:00] WARN: Overridden Run List: [recipe[psql::crt_role]]
resolving cookbooks for run list: ["psql::crt_role"]
Synchronizing Cookbooks:
  - psql (0.1.0)
Installing Cookbook Gems:
Compiling Cookbooks...
Converging 12 resources
Recipe: psql::crt_role
  * bash[ create role aj04adm1 ] action run

    ================================================================================
    Error executing action `run` on resource 'bash[ create role zz01adm1 ]'
    ================================================================================

    Mixlib::ShellOut::ShellCommandFailed
    ------------------------------------
    Expected process to exit with [0], but received '2'
    ---- Begin output of "bash"  "/tmp/chef-script20170522-14665-1mtz3mh" ----
    STDOUT: 210 Number of sources = 1
    STDERR: Password:   ← パスワードの入力が必要となるが、レシピ実行中には対話式で入力できないためエラーとなる。
    psql: fe_sendauth: no password supplied
    ---- End output of "bash"  "/tmp/chef-script20170522-14665-1mtz3mh" ----
    Ran "bash"  "/tmp/chef-script20170522-14665-1mtz3mh" returned 2
~省略~
STDERR: Password:
psql: fe_sendauth: no password supplied
---- End output of "bash"  "/tmp/chef-script20170522-14665-1mtz3mh" ----
Ran "bash"  "/tmp/chef-script20170522-14665-1mtz3mh" returned 2
[2017-05-22T10:35:13+09:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)

直接コマンドを実行してみた。

[root@test01 data]# su - postgres -c "psql -c \"\du ;\"" | grep zz01adm1
Password:                                         ← パスワード入力が必要
 zz01adm1  | Create role, Create DB                                     | {}
[root@test01 data]#

2. .pgpassファイルを作成

マニュアルをながめていると、『PostgreSQL 9.6.2文書 32.15. パスワードファイル』に遭遇。

ユーザのホームディレクトリの.pgpassまたはPGPASSFILEで設定されるファイルは、接続にパスワードが必要な場合(かつ、他に指定されたパスワードが無かった場合)に使用するパスワードを格納するファイルです。

だそうだ。

なので早速作成してみる。
作成したファイルは、セキュリティ面を考慮し、postgresユーザーのみアクセスできるようにする。

[postgres@test01 ~]$ vi .pgpass
localhost:5432:postgres:postgres:zaq12wsx
[postgres@test01 ~]$ chmod 600 .pgpass
[postgres@test01 ~]$ ls -la .pgpass
-rw------- 1 postgres postgres 42 May 22 10:11 .pgpass

3.パスワードなしなのか本当に確認してみる。

[root@test01 data]# su - postgres -c "psql -c \"\du ;\"" | grep zz01adm1
 zz01adm1  | Create role, Create DB                                     | {}
[root@test01 data]#

chefで実行しても、パスワードに関するエラーがでませんよ!

[chef@test01 recipes]$ sudo chef-solo -c /home/chef/chef-repo/solo.rb -o "recipe[psql::crt_role]"
[sudo] password for chef:
Starting Chef Client, version 12.18.31
[2017-05-22T10:50:22+09:00] WARN: Run List override has been provided.
[2017-05-22T10:50:22+09:00] WARN: Original Run List: []
[2017-05-22T10:50:22+09:00] WARN: Overridden Run List: [recipe[psql::crt_role]]
resolving cookbooks for run list: ["psql::crt_role"]
Synchronizing Cookbooks:
  - psql (0.1.0)
Installing Cookbook Gems:
Compiling Cookbooks...
Converging 12 resources
Recipe: psql::crt_role
   * bash[ create role zz01adm1 ] action run (skipped due to not_if)
  * bash[ create role zz01upd1 ] action run (skipped due to not_if)
  * bash[ create role zz01ref1 ] action run (skipped due to not_if)
  * bash[ create role zz01app1 ] action run (skipped due to not_if)
[2017-05-22T10:50:23+09:00] WARN: Skipping final node save because override_runlist was given

Running handlers:
Running handlers complete
Chef Client finished, 0/12 resources updated in 03 seconds

今回は、わりとあっさり対応できてよかったけれども、このやり方使わなければ、結構業務上は大変な気がしますね。

参考

PostgreSQL 9.6.2文書 32.15. パスワードファイル

brighton0725
中年。 最近ChefとかOSSはじめる。 自分の備忘録的なメモとして残している。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away