【问题标题】:How to translate this PostgreSQL command into Ansible?如何将此 PostgreSQL 命令翻译成 Ansible?
【发布时间】:2019-06-29 23:15:11
【问题描述】:

我想通过 Ansible 在 PostgreSQL 9.6 中创建一个用户和一个数据库。

在 shell 中我是这样做的: sudo -u postgres createuser -S -D -R -P ckan_default createdb -O ckan_default ckan_default -E utf-8

我正在运行 Ansible Tower 中的所有内容。

我尝试过的是,有多种选择,比如删除 become 和 become_user:

- name: Create postgres user 
  become: yes
  become_user: postgres
  postgresql_user:
    name: "ckan_default"
    password: "ckan_default"
    role_attr_flags: NOCREATEDB, NOCREATEROLE, NOSUPERUSER

- name: Create DB
  become: yes
  become_user: postgres
  postgresql_db:
    name: ckan_default
    encoding: UTF-8
    owner: ckan_default

我遇到的错误:

{
    "_ansible_parsed": true,
    "exception": "Traceback (most recent call last):\n  File \"/tmp/ansible_postgresql_db_payload_FsaEtw/__main__.py\", line 421, in main\n    db_connection = psycopg2.connect(database=maintenance_db, **kw)\n  File \"build/bdist.linux-x86_64/egg/psycopg2/__init__.py\", line 126, in connect\n    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)\nOperationalError: FATAL:  Peer authentication failed for user \"postgres\"\n\n",
    "_ansible_no_log": false,
    "changed": false,
    "invocation": {
        "module_args": {
            "ssl_rootcert": null,
            "ssl_mode": "prefer",
            "target": "",
            "encoding": "UTF-8",
            "login_user": "postgres",
            "login_host": "",
            "target_opts": "",
            "db": "ckan_default",
            "lc_ctype": "",
            "owner": "",
            "port": 5432,
            "login_unix_socket": "",
            "state": "present",
            "template": "",
            "login_password": "",
            "maintenance_db": "postgres",
            "lc_collate": "",
            "name": "ckan_default"
        }
    },
    "msg": "unable to connect to database: FATAL:  Peer authentication failed for user \"postgres\"\n"
}

【问题讨论】:

    标签: postgresql ansible


    【解决方案1】:

    您想将 become_pass 变量设置为用户 postgres 的密码(例如将 postgres_password 设置为存储在 vault 中的 vault_postgres_password)

    - name: Create postgres user 
      become: yes
      become_user: postgres
      become_pass: "{{ postgres_password }}"
      postgresql_user:
        name: "ckan_default"
        password: "ckan_default"
        role_attr_flags: NOCREATEDB, NOCREATEROLE, NOSUPERUSER
    

    在文件 group_vars/my_postgres_hosts.yml 中:

    postgres_password: "{{ vault_postgres_password }}"
    

    在文件 group_vars/all/vault 中:

    vault_postgres_password: "theReal-postgres-password-is-protected" 
    

    另外,看看这个最近的帖子: Ansible: Attach role to user in postgres

    【讨论】:

      【解决方案2】:

      您并没有走得太远:原来 /etc/sudoers 必须更改。

      添加了第 2 行和第 4 行。 become: yes 也不再需要了。

      root ALL=(ALL) NOPASSWD: ALL
      {{ usr_name }} ALL=(ALL) NOPASSWD: ALL
      
      %sudo ALL=(ALL) NOPASSWD: ALL
      %wheel ALL=(ALL) NOPASSWD: ALL
      

      【讨论】: