Ansible: 免密码sudo

9

我希望能够在不需要sudo密码的情况下使用用户sa1运行ansible:

第一次操作OK:

[root@centos1 cp]# ansible cent2 -m shell -a "sudo yum -y install httpd"

cent2 | SUCCESS | rc=0 >>

第二次失败:

[root@centos1 cp]# ansible cent2 -s -m yum -a "name=httpd state=absent"

cent2 | FAILED! => {
    "changed": false,
    "failed": true,
    "module_stderr": "",
    "module_stdout": "sudo: a password is required\r\n",
    "msg": "MODULE FAILURE",
    "parsed": false
}

请帮忙!


你使用的ansible版本是哪个?在新版本中,-s开关已被弃用。也许尝试使用-b(变为)选项。另外,尝试通过-u显式设置登录用户,这样行吗? - fishi0x01
4个回答

15

问题不在于Ansible,而是你的服务器配置。确保允许使用sudo命令的用户无需密码即可使用Ansible。

  1. 登录服务器
  2. 使用sudo visudo命令打开sudoers文件
  3. 确保有一个类似于以下内容的行:centos ALL=(ALL) NOPASSWD:ALL
  4. centos替换为你的用户名
  5. 保存文件

你可以尝试从服务器本身运行:

sudo -u [yourusername] sudo echo "success"

如果这个可以工作,那么它也应该从ansible中可用。


正如您所看到的,第一条命令成功执行了 `[root@centos1 cp]# ansible cent2 -m shell -a "sudo yum -y install httpd"cent2 | SUCCESS | rc=0 >>我已经添加了sa1 ALL=(ALL) NOPASSWD: SOFTWARE , /bin/echo`。 - bbkaaka
1
我假设 SOFTWARE 是一个命令别名。你在那里定义了什么?你可以尝试使用 ALL 来查看是否是限制因素。如果你使用 -vvvv 运行 ansible,你可以看到它正在尝试调用哪个命令。 - Károly Nagy
当我从“软件”更改为“所有”时,我成功了。这是我的别名 Cmnd_Alias SOFTWARE = /bin/rpm、/usr/bin/up2date、/usr/bin/yum - bbkaaka
3
Ansible会使用各种技巧将可执行文件复制到临时目录中,并在执行后删除该目录。我在自己的服务器上进行了一个带有-vvvv参数的ansible运行测试。它将不同的yum文件放置并调用:PUT /var/folders/sr/hcg9zzm12jg28txszy7nnh0x721jx7/T/tmpLs5wbd TO /home/centos/.ansible/tmp/ansible-tmp-1464250141.88-48281030641080/yum,然后执行/usr/bin/python -tt /home/centos/.ansible/tmp/ansible-tmp-1464250141.88-48281030641080/yum,所以您的别名与ansible模块执行的命令不匹配。 - Károly Nagy

10
默认情况下,Ansible 使用以下标志运行 sudo:-H -S -n 以成为超级用户。其中 --non-interactive 是选项 -n 的相应长形式。此选项似乎使 sudo 返回错误消息,而不尝试让身份验证模块工作。
我成功绕过密码错误,通过创建一个 ~/.ansible.cfg 文件,包含以下行,适用于最相关的 Ansible 版本。 Ansible 2.4
[defaults]
sudo_flags = --set-home --stdin

ansible 2.9

[sudo_become_plugin]
flags = -H -S

至少这足以让pam_ssh_agent_auth.so运行并对我进行身份验证。

在2.8版本之前,上面的示例可以工作,而新于2.8的版本需要第二个示例。有关新样式配置的文档可以在Ansible用户指南中找到。


8

如果你想使用Ansible,这里是playbook:

  1. 将用户添加到所选组(在我的情况下是wheel
  2. 将此添加到你的playbook中
- name: Make users passwordless for sudo in group wheel
  lineinfile:
    path: /etc/sudoers
    state: present
    regexp: '^%wheel'
    line: '%wheel ALL=(ALL) NOPASSWD: ALL'
    validate: 'visudo -cf %s'

2
是的,运行这个playbook时只需使用-K选项来请求提升密码。 - Norman Pellet

0
##-----------------------
  - name: sudo without password
    become: true
    copy:
      dest: /etc/sudoers.d/dont-prompt-ubuntu_user-for-sudo-password
      content: 'ubuntu ALL=(ALL) NOPASSWD:ALL'

它创建了一个名为/etc/sudoers.d/dont-prompt-ubuntu_user-for-sudo-password的文件,其内容如下:
ubuntu ALL=(ALL) NOPASSWD:ALL

这个工作是因为Debian和Ubuntu的默认/etc/sudoers文件有这一行:
@includedir /etc/sudoers.d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接