我有这两个简单的任务:

- name: I am
  shell: "echo `id`"

- name: say hello
  shell: echo "postgres saying hello"
  sudo_user: postgres

长时间暂停后第二个任务失败,输出如下
(它以 vvv 的详细级别与 vagrant 一起运行)
(是的,我已经验证用户 postgres 存在,
我可以从 VM 内部执行 sudo su postgres)
TASK: [postgresql | I am] *****************************************************
changed: [192.168.78.6] => {"changed": true, "cmd": "echo `id` ", "delta": "0:00:00.002511", "end": "2014-01-23 22:49:14.161249", "item": "", "rc": 0, "start": "2014-01-23 22:49:14.158738", "stderr": "", "stdout": "uid=0(root) gid=0(root) groups=0(root)"}

TASK: [postgresql | say hello] ************************************************
fatal: [192.168.78.6] => failed to parse: [sudo via ansible, key=fnfgfnxabemrzbfixwgoksvgjrfzplxf] password:


FATAL: all hosts have already failed -- aborting

这东西在 centos6.5.1 vagrant vm 中运行

最佳答案

它显然不适用于 Centos6.5。假设是它无法通过 postgres 系统用户密码的提示,尽管这是推测。

为了回答如何在 postgresql_* 命令期间克服无法对 postgres 进行 sudo 操作(后者将通过默认的 pg_hba.conf 配置使用对等身份验证)的问题,这里有一个解决方法:

- hosts: all
  sudo: yes
  gather_facts: no

  tasks:
    - lineinfile: dest='/var/lib/pgsql/9.3/data/pg_hba.conf' regexp="^local\s+all\s+all\s+peer$" line="local    all        all                      trust" backrefs=yes

    - name: restart after line change
      action: shell sudo /etc/init.d/postgresql-9.3 restart

    - name: create database
      postgresql_db: name=acme
      sudo: no                         # NB!!
      sudo_user: postgres

我们正在将本地访问从 peer 更改为 trust,在所需的操作由另一个 lineinfile 执行或使用 md5 替换文件或任何所需的配置后,需要将其删除,然后重新启动。以上显然仅用于演示。这是一个巨大的黑客,但将允许您发出在 Centos6 下工作的 ansible postgresql 模块命令。请注意,我们为 postgresql 任务设置了 sudo 关闭。

我确认问题存在并且该 hack 适用于此 vm 框:
https://github.com/2creatives/vagrant-centos/releases/download/v6.5.1/centos65-x86_64-20131205.box

10-08 17:40