如何将postgres连接到ansible?

时间:2019-08-13 11:05:10

标签: postgresql ansible

目标:

我的目标是使用Ansible 2.8.3连接postgres 9.3,并使用ansible执行postgres操作。

我已经创建了一个Yaml文件来安装postgres,该文件还使用yaml脚本创建了一个数据库。

我尝试通过更改sudoer文件的内容来解决此错误,但是它损坏了文件,迫使我重新安装ubuntu和ansible。

Ansible代码:


- hosts: localhost
  become: yes
  gather_facts: no

  tasks:
  - name: ensure apt cache is up to date
    apt: update_cache=yes
  - name: ensure packages are installed
    apt: name={{item}}
    with_items:
    - postgresql
    - libpq-dev
    - python-psycopg2

- hosts: localhost
  become: yes
  become_user: emgda
  gather_facts: no

  vars:
    dbname: myapp
    dbuser: emgda
    dbpassword: Entrib!23

  tasks:
  - name: ensure database is created
    postgresql_db: name={{dbname}}

  - name: ensure user has access to database
    postgresql_user: db={{dbname}} name={{dbuser}} password={{dbpassword}} priv=ALL

  - name: ensure user does not have unnecessary privilege
    postgresql_user: name={{dbuser}} role_attr_flags=NOSUPERUSER,NOCREATEDB

  - name: ensure no other user can access the database
    postgresql_privs: db={{dbname}} role=PUBLIC type=database priv=ALL state=absent

...

运行此文件后,出现以下错误

fatal: [localhost]: FAILED! => {"changed": false, "module_stderr": "sudo: a password is required\n", "module_stdout": "", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}

  

注意:任何人都可以帮助我解决此问题。我是Ansible的新手。我正在按照this link来练习已经运行的Ansible脚本。

2 个答案:

答案 0 :(得分:0)

您已在剧本中设置了become: yes,因此很容易尝试切换到root用户。根据错误消息-sudo: a password is required,您没有在剧本运行期间设置--ask-become-pass选项,也没有为您的敏感用户设置无密码sudo。

因此,您需要使用--ask-become-pass选项运行您的剧本,或者需要设置使用Ansible的用户使用不带密码的sudo的功能。

答案 1 :(得分:0)

Escalation在第一场比赛中效果很好

- hosts: localhost
  become: yes

默认 become_user root。这意味着正在运行剧本的用户(请参见ansible_user)可以升级特权 sudo su -

第二场比赛升级为用户emgda。这意味着正在运行剧本的用户应升级特权 sudo su emgda

- hosts: localhost
  become: yes
  become_user: emgda

这需要密码,导致错误

sudo: a password is required

解决方案是

1)在命令行中使用--ask-become-pass

2)在变量ansible_become_password中提供密码,或

3)将sudoers配置为无需密码即可升级特权

<user-running-playbook> ALL=(ALL) NOPASSWD: ALL