首页 文章

Ansible:“sudo:需要密码\ r \ n”[复制]

提问于
浏览
4

这个问题在这里已有答案:

快速的问题

我已经设置了一个名为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

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,它会告诉我“无法通过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

2 回答

  • 9

    我不明白为什么要求sudo密码 .

    我们几乎可以肯定是因为a)你的剧本要求Ansible用 sudo (通过 sudobecome 指令)运行一个特定的命令,并且b) test 用户没有启用无密码的sudo .

    听起来你知道(a)但对(b)感到困惑;具体来说,我了解ssh身份验证和sudo身份验证之间的区别 . 再一次,没有更多的信息,我可以在我猜错的情况下尝试解释它 .

    当您通过ssh连接到计算机时,sshd会通过两种主要方式对您进行身份验证,并允许您以特定用户身份登录 . 第一种是询问帐户的密码,该密码是系统的密码,如果正确则允许登录 . 第二个是通过public-key cryptography,您可以在其中证明您可以访问与 ~/.ssh/authorized_keys 中的公钥指纹对应的私钥 . 通过sshd的身份验证检查为您提供了计算机上的shell .

    当您使用 sudo 调用命令时,您要求 sudo 将您的权限提升到帐户通常获得的权限之外 . 这是一个完全不同的系统,在 /etc/sudoers (您应该使用 sudo visudo 进行编辑)中定义规则,控制允许哪些用户使用sudo,他们应该能够运行哪些命令,是否需要重新输入密码何时使用该命令,以及各种其他配置选项 .

    当你正常运行剧本时,Ansible会出现一个sudo提示,并且不知道帐户密码 . 这就是为什么 --ask-sudo-pass 存在:你're giving the password to Ansible so that it can pass it on to sudo when prompted. If you don'想要每次都要输入这个,并且你在安全参数中've decided it's允许任何以 test 用户身份登录的用户以root身份执行任何操作,那么你可以参考 man sudoers 了解如何设置无密码sudo为该帐户 .

  • 2

    我解决了这个确切的错误 sudo: a password is required\n ,这是我用 become: true 运行我的剧本时得到的,但是在委托给localhost的任务中某处,如下所示:

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

    如果我理解正确, become: true 会导致Ansible以我的用户身份登录到远程主机,然后使用 sudo 以执行远程主机上的所有命令 root . 现在,当委托给 127.0.0.1 时,也会执行 sudo ,并且当我使用 sudo 时,我的本地主机上会发生密码 .

    对我来说,解决方案只是删除 delegate_to ,这在特定用例中实际上并不需要 .

相关问题