【问题标题】:Ansible: sudo without passwordAnsible:没有密码的sudo
【发布时间】:2016-09-22 21:47:38
【问题描述】:

我想在没有 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显式设置登录用户,这样行吗?

标签: linux ansible sudo


【解决方案1】:

这不是你服务器的配置。确保 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
  • 我假设SOFTWARE 是一个命令别名。你在那里定义了什么?你可以试试ALL 看看这是否是限制因素?如果你使用 -vvvv 运行 ansible,你可以看到它试图调用什么命令。
  • 从 SOFTWARE 更改为 ALL 时成功。这是我的别名Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
  • 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 模块执行的命令不匹配。
【解决方案2】:

默认情况下,ansible 运行带有标志的 sudo:-H -S -n 成为 root。其中--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 User Guide 中找到新样式配置的文档。

【讨论】:

    【解决方案3】:

    这是你想要 ansible 为你制作的剧本

    1. 将用户添加到所选组(在我的情况下为 wheel
    2. 将此添加到您的剧本中
    - 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'
    

    【讨论】:

    • 是的,在运行这个剧本时使用 -K 只是为了询问提升密码。
    猜你喜欢
    • 2020-12-20
    • 2014-03-19
    • 1970-01-01
    • 2016-02-05
    • 2016-11-11
    • 1970-01-01
    • 2018-10-17
    • 2014-10-02
    相关资源
    最近更新 更多