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

时间:2016-08-29 02:45:53

标签: ssh ansible

快速提问

我已经设置了一个名为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,它告诉我I&#34;无法通过ssh连接到主机。&#34;没关系。 我不明白为什么要求sudo密码。我一路上都错过了一些东西。

我的 ansible.cfg 文件看起来像这样

[defaults]
nocows = 1
inventory = ./Playbooks/hosts
remote_user = test
private_key_file = /home/test/.ssh/id_ubu
host_key_checking = false

我的主机文件看起来像这样

[servers]
ubu1 ansible_ssh_host=192.168.1.112 ansible_ssh_user=test

2 个答案:

答案 0 :(得分:13)

  

我不明白为什么要求输入密码。

我们不能肯定地说没有看到你的剧本,但几乎可以肯定是因为a)你的剧本要求Ansible用sudo运行特定命令(通过sudo或{{1} }}指令)和b)become用户没有启用无密码的sudo。

听起来你知道(a)但对(b)感到困惑;具体来说,我所了解的是你不理解 ssh authentication sudo authentication 之间的区别。再说一次,如果没有更多的信息,我无法确认是否是这种情况,但如果我猜对了,我会先解释一下。

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

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

当你正常运行剧本时,Ansible会出现一个sudo提示,但不知道如何继续 - 它不知道帐户密码。这就是sudo visudo存在的原因:您将密码提供给Ansible,以便在出现提示时将其传递给sudo。如果您不希望每次都输入此内容并且您已确定它在您的安全参数范围内,以允许以--ask-sudo-pass用户身份登录的任何人以root身份执行任何操作,那么您可以咨询{{1关于如何为该帐户设置无密码sudo。

答案 1 :(得分:2)

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

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,这在特定用例中实际上并不需要。