web-dev-qa-db-ja.com

PostgreSQLがAnsibleでピア認証に失敗する

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のピア認証が明確に機能しているのに、なぜこれが失敗するのですか?

36
oakservice

これは私のために働きました:

- name: Create postgres database
  become: true
  become_user: postgres
  postgresql_db:
    name: <database-name>

あなたの特定のケースでは、ユーザーはpgsqlかもしれませんが、通常、ユーザーはpostgresだと思います。

53
gitaarik

または、わずかに異なる構文(Ansible 1.9から)とユーザー作成(誰かに役立つ場合があります)

- name: Create postgres user
  postgresql_user: name={{ pg_user }} password={{ pg_password }}
  become: true
  become_user: postgres
21
Most Wanted

「一時ファイルへのアクセス許可の設定に失敗しました。Ansibleは作成する必要があります...」become_userを使用してpostgresユーザーに切り替えるには、Ubuntuホストでパイプラインを利用できます。

プレイブックディレクトリにansible.cfgを作成し、次の行を追加します。

[ssh_connection]
pipelining=True

pdate: @lolcodeによるとAnsible 2.9.0がansible_pipeliningに更新されました

   [ssh_connection]
   ansible_piplining = true
11
Dylan Pierce

私も同じ問題を抱えていました。私の場合、ピアアクセス権を持つユーザー(この場合は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を使用しています。

5
René Pijl

別の回避策は、デフォルトの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
3
mdh

Postgresのバージョンが本当に古い(9.3)ことに気づきました。最近、Postgres 9.3を搭載したUbuntu 14サーバーで作業しているときにこの問題が発生しました。

私は十数種類のことを試しましたが、最後にうまくいったのはapt経由でaclパッケージをインストールすることでした。 Ansibleは、アクセス権の問題のいくつかをナビゲートするためにそれを使用します。パッケージはデフォルトで新しいディストリビューションにインストールされるため、この問題が古いサーバーでのみ発生するのを私が見たのはなぜですか。

1
bugged

この脅威のおかげで、私は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
0
Rooie3000