FreeBSDでPostgreSQL 9.3を実行しています。 FreeBSDはPostgreSQLのデフォルトのシステムユーザーとしてpgsql
を使用します。私の/usr/local/pgsql/data/pg_hba.conf
は次のようになります:
# TYPE DATABASE USER ADDRESS METHOD
local all pgsql peer
local all all md5
Host all all 127.0.0.1/32 md5
Host all all ::1/128 md5
この構成では、パスワードなしでpgsql
としてデータベースに接続できます。
$ su pgsql
$ psql template1
template1=# \l
List of databases
...
これは意図したとおりに機能します。
リモートマシンで、FreeBSDサーバーにデータベースを作成するAnsibleタスクがあります。
- name: Create the postgresql database
postgresql_db: name=mydatabase login_user=pgsql
このタスクの実行は、エラーPeer authentication failed for user "pgsql"
で失敗します。
PLAY [web] ********************************************************************
GATHERING FACTS ***************************************************************
ok: [Host.example.org]
TASK: [database | Create the postgresql database] *****************************
failed: [Host.example.org] => {"failed": true}
msg: unable to connect to database: FATAL: Peer authentication failed for user "pgsql"
FATAL: all hosts have already failed -- aborting
ユーザーpgsql
のピア認証が明確に機能しているのに、なぜこれが失敗するのですか?
これは私のために働きました:
- name: Create postgres database
become: true
become_user: postgres
postgresql_db:
name: <database-name>
あなたの特定のケースでは、ユーザーはpgsql
かもしれませんが、通常、ユーザーはpostgres
だと思います。
または、わずかに異なる構文(Ansible 1.9から)とユーザー作成(誰かに役立つ場合があります)
- name: Create postgres user
postgresql_user: name={{ pg_user }} password={{ pg_password }}
become: true
become_user: postgres
「一時ファイルへのアクセス許可の設定に失敗しました。Ansibleは作成する必要があります...」become_user
を使用してpostgres
ユーザーに切り替えるには、Ubuntuホストでパイプラインを利用できます。
プレイブックディレクトリにansible.cfg
を作成し、次の行を追加します。
[ssh_connection]
pipelining=True
pdate: @lolcodeによるとAnsible 2.9.0がansible_pipelining
に更新されました
[ssh_connection]
ansible_piplining = true
私も同じ問題を抱えていました。私の場合、ピアアクセス権を持つユーザー(この場合はpgsql)とは別のLinuxユーザーとして実行するようにAnsible-playbookを構成したことを見落としました。解決策は、pgsqlとしてAnsibleプレイを実行することです。
- name: Create the postgresql database
remote_user: pgsql
postgresql_db: name=mydatabase login_user=pgsql
...
またはrootで実行し、pgsqlでsuコマンドを実行します。
- name: Create the postgresql database
remote_user: root
become: yes
become_user: pgsql
postgresql_db: name=mydatabase login_user=pgsql
...
... ssh経由のアクセス権によって異なります。
これはAnsible 2.0を使用しています。
別の回避策は、デフォルトのHost
ピア認証方法ではなくlocal
(localhost)を介して接続することです。
- name: Create the postgresql database
postgresql_db:
name: mydatabase
login_user: postgres
login_Host: 127.0.0.1
pg_hba.conf
の設定によっては、login_password
の提供も必要になる場合があります。あなたは設定することでこれを回避することができます
Host all postgres 127.0.0.1/32 md5
に
Host all postgres 127.0.0.1/32 trust
Postgresのバージョンが本当に古い(9.3)ことに気づきました。最近、Postgres 9.3を搭載したUbuntu 14サーバーで作業しているときにこの問題が発生しました。
私は十数種類のことを試しましたが、最後にうまくいったのはapt経由でacl
パッケージをインストールすることでした。 Ansibleは、アクセス権の問題のいくつかをナビゲートするためにそれを使用します。パッケージはデフォルトで新しいディストリビューションにインストールされるため、この問題が古いサーバーでのみ発生するのを私が見たのはなぜですか。
この脅威のおかげで、私はmdhの投稿の変種を作りました。データベースをセットアップするときに、postgresユーザーのパスワードを生成し、それをルートディレクトリの下のファイルに保存します。
それを(または代わりに)rootの.pgpassファイルに保存しないのはなぜだと思いました。だから私はこのようなテンプレートを作成しました(最後の行だけが重要です):
#### password file for posgres connection ###
#### *:*:*:*
#### works like
#### * : * : * : *
#### <ip addr> : <port nr> : <db name> : <password>
127.0.0.1:*:*:postgres:{{ new_postgres_pass }}
ルートのホームディレクトリに.pgpassファイルを保存します。これで、ユーザーを切り替えてpg_hba.confを変更する必要なく、モジュールをrootとして使用できます。
- name: Ensure postgresql mydatabase
postgresql_db:
name: mydatabase
login_user: postgres
login_Host: 127.0.0.1