目标:
我的目标是使用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脚本。
答案 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