Ansible:"sudo:需要密码\r\n"

9

快速问题

我已经设置了一个名为test的Ubuntu服务器。我将authorized_keys复制到它,可以轻松地进行SSH连接。 如果我执行$ ansible -m ping ubu1,没有问题,我会收到响应。

    <i><p>ubu1 | SUCCESS => {
        <br>"changed": false, 
        <br>"ping": "pong"
    <br>}</i>

我不理解的是,如果我执行以下命令:

$ ansible-playbook -vvvv Playbooks/htopInstall.yml

注:本文涉及 IT 技术。
fatal: [ubu1]: FAILED! => {"changed": false, "failed": true, "invocation": {"module_name": "setup"}, "module_stderr": "OpenSSH_7.2p2 Ubuntu-4ubuntu2.1, OpenSSL 1.0.2g-fips  1 Mar 2016\r\ndebug1: Reading configuration data /etc/ssh/ssh_config\r\ndebug1: /etc/ssh/ssh_config line 19: Applying options for *\r\ndebug1: auto-mux: Trying existing master\r\ndebug2: fd 3 setting O_NONBLOCK\r\ndebug2: mux_client_hello_exchange: master version 4\r\ndebug3: mux_client_forwards: request forwardings: 0 local, 0 remote\r\ndebug3: mux_client_request_session: entering\r\ndebug3: mux_client_request_alive: entering\r\ndebug3: mux_client_request_alive: done pid = 6109\r\ndebug3: mux_client_request_session: session request sent\r\ndebug1: mux_client_request_session: master session id: 2\r\ndebug3: mux_client_read_packet: read header failed: Broken pipe\r\ndebug2: Received exit status from master 1\r\nShared connection to 192.168.1.112 closed.\r\n", "module_stdout": "sudo: a password is required\r\n", "msg": "MODULE FAILURE", "parsed": false}

如果我执行 $ ansible-playbook --ask-sudo-pass Playbooks/htopInstall.yml,那么它会要求我的用户密码并且操作成功。
如果我重命名authorized_keys,那么它会告诉我“Failed to connect to the host via ssh.”这是可以理解的。但是我不明白为什么它会要求sudo密码。我肯定漏掉了某些步骤。
我的ansible.cfg文件看起来像这样:
[defaults]
nocows = 1
inventory = ./Playbooks/hosts
remote_user = test
private_key_file = /home/test/.ssh/id_ubu
host_key_checking = false

我的hosts文件看起来像这样:

[servers]
ubu1 ansible_ssh_host=192.168.1.112 ansible_ssh_user=test

1
你没有包含最重要的文件 Playbooks/htopInstall.yml。请花几分钟时间学习如何在 SO 上使用格式以及常用的不同元素的格式化方式。 - techraf
1
你的目标主机上是否为test用户启用了无需密码的sudo权限? - Konstantin Suvorov
2个回答

18
我不明白的是为什么要求输入sudo密码。 我们无法确定,需要看到您的playbook,但几乎肯定是因为a) 您的playbook要求Ansible使用sudo运行特定命令(通过sudo或become指令),b) test用户未启用免密码sudo。听起来您已经意识到了a),但对b)感到困惑;具体而言,我的理解是您不理解ssh验证和sudo验证之间的区别。同样,如果我猜对了,我会尝试解释一下。
当您通过ssh连接到一台机器时,sshd验证您的身份并允许您以特定用户身份登录的主要方式有两种。第一种是要求输入账户密码,该密码由系统处理,如果正确则允许登录。第二种是通过公钥密码学,您需要证明您可以访问与~/.ssh/authorized_keys中公钥指纹相对应的私钥。通过sshd的身份验证检查,您将获得该机器上的shell。
当您使用sudo调用命令时,您正在请求sudo提升您的权限超出帐户通常获得的权限。这是一个完全不同的系统,在/etc/sudoers中定义规则(您应该使用sudo visudo进行编辑),控制哪些用户被允许使用sudo,他们应该能够运行哪些命令,是否需要在使用命令时重新输入密码以及各种其他配置选项。
当您正常运行playbook时,Ansible会出现sudo提示,并且不知道如何继续 - 它不知道帐户密码。这就是为什么存在--ask-sudo-pass:您将密码提供给Ansible,以便它可以在提示时将其传递给sudo。如果您不想每次都输入此密码,并且已决定允许任何以test用户身份登录的人作为root执行任何操作,则可以查阅man sudoers以了解如何为该帐户设置无密码sudo。

我不确定 --as-sudo-pass 是否与版本有关... 但当我使用 --ask-become-pass 或等效的 -K 时,它对我有效。 - Richard Gomes
@RichardGomes 由于该项目的目标更多地面向非Linux使用,因此它转向了“become”术语(它委派给sudo或其他特权升级系统);有一段时间它们都在那里,但我猜最终他们删除了带有“sudo”的选项。 在具有sudo的系统上,它们在功能上是等效的。 - Xiong Chiamiov

8

我解决了这个错误:sudo:需要输入密码\n,当我用become: true运行我的playbook时,但在委派给本地主机的任务中,类似于以下内容:

uri:
  url: "{{ some_url }}"
  return_content: yes
  status_code: 200
delegate_to: 127.0.0.1

如果我理解正确,become: true会导致Ansible以我的用户身份登录到远程主机,然后使用sudoroot的身份执行所有命令。现在当委托给127.0.0.1时,也会执行sudo,因为在我的本地主机上使用sudo时需要输入密码。

对于我来说,解决方案很简单,只需删除delegate_to即可,在这种特定情况下实际上并不需要它。

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