【问题标题】:Ansible Timeout (12s) waiting for privilege escalation promptAnsible Timeout (12s) 等待提权提示
【发布时间】:2016-09-16 14:06:30
【问题描述】:

我在 AWS 实例上运行我的 Ansible playbook 时遇到问题。这是我的版本:

$ ansible --version
ansible 2.0.0.2

我创建了一个库存文件:

[my_ec2_instance]
default ansible_host=MY_EC2_ADDRESS ansible_user='ubuntu' ansible_ssh_private_key_file='/home/MY_USER/MY_KEYS/MY_KEY.pem'

测试与我的服务器的连接:

$ ansible -i provisioner/inventory my_ec2_instance -m ping
default | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

现在在此清单上运行我的剧本时,我收到错误 Timeout (12s) waiting for privilege escalation prompt,如下所示:

$ ansible-playbook -i provisioner/inventory -l my_ec2_instance provisioner/playbook.yml

PLAY [Ubuntu14/Python3/Postgres/Nginx/Gunicorn/Django stack] *****

TASK [setup] *******************************************************************
fatal: [default]: FAILED! => {"failed": true, "msg": "ERROR! Timeout (12s) waiting for privilege escalation prompt: "}

NO MORE HOSTS LEFT *************************************************************

PLAY RECAP *********************************************************************
default                    : ok=0    changed=0    unreachable=0    failed=1

如果我使用 .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory 作为库存参数运行相同的剧本,它可以在我的 Vagrant 实例上完美运行。(我相信,证明剧本/角色本身没有问题)

另外,如果我使用 -vvvv 运行它,复制 exec ssh 行并手动运行它确实可以毫无问题地连接到 AWS。

我是否需要在我的清单文件中添加任何其他参数才能连接 EC2 实例?我错过了什么?

【问题讨论】:

  • 有类似问题的人报告了不同的解决方案,因为确实有很多可能的原因。我会告诉我的:目的地的 .profile 或 .bash_profile 包含一个 bash 命令,这是将用户的 shell 从 ksh 更改为 bash 的粗鲁方式。我的建议是在目标机器上使用此类分析脚本的默认版本进行测试。

标签: amazon-ec2 ansible-playbook ansible-2.x


【解决方案1】:

这里有一个关于这个错误的 git 问题,它会影响 Ansible 2.x 的各个版本,这里 https://github.com/ansible/ansible/issues/13278#issuecomment-216307695

我的解决方案是简单地将timeout=30 添加到/etc/ansible/ansible.cfg

这不是“任务”或“角色”超时,足以解决错误(我确实有一些角色/任务需要更长的时间)。

【讨论】:

    【解决方案2】:
    $ vim /etc/ansible/ansible.cfg
    

    SSH 超时

    [defaults]
    timeout = 10 ( change to 60 )
    

    【讨论】:

    • 这对我有用,因为我的 LDAP 很慢并且增加超时有帮助。但是我建议编辑本地 ansible.cfg 而不是全局 /etc/ansible/ansible.cfg
    【解决方案3】:

    就我而言,这是因为我的剧本有

    become_method: su
    become_flags: "-"
    

    在主机上提示密码请求。

    添加ansible-playbooks … --ask-become-pass 并传递密码解决了这个问题。

    【讨论】:

      【解决方案4】:

      就我而言,根本原因是 /etc/hosts 中的 localhost 条目不正确,导致任何 sudo 命令延迟 20 秒。

      127.0.0.1 wronghostname
      

      将其更改为正确的主机名以修复它。 sudo/特权命令不再有延迟。

      【讨论】:

      • 令人惊讶的互动。我一直不明白为什么 sudo 会检查 /etc/hosts。
      【解决方案5】:

      我运行如下命令并且它有效: 命令:

      ansible-playbook -c paramiko httpd.yml
      

      由于该问题与 openssl 实现有关,因此使用 paramiko 可以避开它。

      【讨论】:

      • 这不是成熟问题的答案。
      • 虽然 james.garriss 的链接确认这是有用的信息,但我同意 macetw。鉴于上下文需要外部链接,因此答案写得不好。从答案文本中应该不言而喻,为什么这是问题的解决方案。
      【解决方案6】:

      有时,ec2 实例的设置阶段需要更多时间,您需要将 ansible.cfg 中的超时值更改为 timeout=40 之类的值。这会将超时值设置为 40 秒。

      【讨论】:

        【解决方案7】:

        我正在一个隔离的网络上为 AWS、QEMU 和 VBox 构建安全的 VM 映像,并提供有限的 DNS 支持。在我的情况下,将 SSH 超时时间增加到 40 秒效果有限。

        我正在使用 Packer v1.5.5、Ansible v2.9.2 和 OpenSSH v7.4p1

        我的解决方案是将/etc/ssh/ssd_config中的UseDNS参数更改为no

        我在我的 RHEL/CentOS kickstart 配置中添加了以下几行,效果很好。

        %post
        # Disable DNS lookups by sshd to address Ansible timeouts
        perl -npe 's/^#UseDNS yes/UseDNS no/g' -i /etc/ssh/sshd_config
        %end
        

        【讨论】:

        • 在 SSH 配置中默认不是“否”吗?
        【解决方案8】:

        我有同样的问题。我能够通过添加 become_exe: sudo su -

        来解决它
        - hosts: "{{ host | default('webservers')}}"
          become: yes
          become_user: someuser
          become_method: su
          become_exe: sudo su -
        
        
        

        【讨论】:

        • 只是添加了“become_exe: sudo su”——在树莓派上为我工作......我觉得很奇怪——我已经有了其他 become* 行......
        【解决方案9】:

        线程很旧,但各种解决方案不断涌现。

        在我的例子中,问题在于 ansible 脚本修改了 vagrant vm 中的 sudoers 文件,为 vagrant 组 (%vagrant) vagrant 用户的现有条目之后添加了一个条目.

        这足以导致 ansible 脚本超时等待权限提升。

        解决方案是强制 vagrant 组的 sudoers 条目高于 vagrant 用户的条目。

        【讨论】:

          【解决方案10】:

          检查目标服务器上旧版本的 sudo 是否有问题。一些旧的 sudo 版本没有 -n 选项 ansible 使用。

          【讨论】:

            【解决方案11】:

            我为我的系统修复了这个错误,因为我忘记了我已经更改了 ansible 配置文件:

            sudo vim /etc/ansible/ansible.cfg 
            

            尝试注释可能试图 sudo 到 root 的权限参数。

            像这样:

            [privilege_escalation]
            #become=True
            #become_method=su
            #become_user=root
            #become_ask_pass=False
            #become_exe="sudo su -"
            

            我尝试 ssh 的帐户没有成为 root 的权限。

            【讨论】:

              【解决方案12】:

              Ansible 默认 ssh_args 设置,如 https://docs.ansible.com/ansible/latest/reference_appendices/config.html#ansible-ssh-args 所述,是

              -C -o ControlMaster=auto -o ControlPersist=60s
              

              通过将ControlMaster 更改为yes(或no)为我解决了这个问题(不知何故):

              ansible.cfg

              [ssh_connection]
              ssh_args = -C -o ControlMaster=yes -o ControlPersist=60s
              

              【讨论】:

                猜你喜欢
                • 2019-12-28
                • 1970-01-01
                • 2019-01-06
                • 1970-01-01
                • 1970-01-01
                • 2014-12-26
                • 2010-12-17
                • 2018-09-28
                • 2011-05-23
                相关资源
                最近更新 更多