【问题标题】:Ansible get_url fails to download a protected by basic authAnsible get_url 无法下载受基本身份验证保护的
【发布时间】:2015-08-07 17:30:24
【问题描述】:

我正在尝试使用 HTTP 从具有 get_url 模块的远程服务器下载受保护的文件,但用户名密码似乎没有在请求中传递,因此任务失败。

我正在使用 Ansible 1.9.2

这是我正在使用的 get_url 定义:

- name: Downloading Artifact
  get_url:  
    url: "http://myserver/somefile.tar.gz" 
    dest: "/home/jdoe/somefile.tar.gz"
    url_username: "jdoe"
    url_password: "mysecret"
    mode: 0600

这是我得到的错误:

failed: [myserver] => {"dest": "/home/jdoe/somefile.tar.gz", "failed": true,
"response": "HTTP Error 403: Forbidden", "state": "absent", 
"status_code": 403, "url": "http://myserver/somefile.tar.gz"}
msg: Request failed
FATAL: all hosts have already failed -- aborting

现在,我尝试使用 cURL 下载文件,它可以正常工作。

感谢任何帮助,因为我已经为此苦苦挣扎了 2 天。

【问题讨论】:

  • 如果您以您正在运行的用户身份登录运行此 playbook 的服务器并运行以下命令:curl -u jdoe:mysecret -o /home/jdoe/somefile.tar.gz http://myserver/somefile.tar.gz 会发生什么?这应该有效地复制您尝试运行的命令,并且可能指向主机上的权限问题。
  • 您能否将您的 Ansible 更新到 2.0 开发分支并尝试添加参数 force_basic_auth=yes 是否有帮助?
  • 直接在主机上进行 curl 可以正常工作并正确下载文件。我还尝试从剧本中运行 curl,它按预期工作。 get_url 命令似乎不起作用。我还没有尝试将 ansible 升级到 2.0,但我会尝试。
  • 请提供等效的 curl 命令。如果是模块错误,我会尝试
  • 您是否尝试过以详细模式运行角色/剧本?在命令末尾添加“-vvvv”。

标签: ansible ansible-playbook


【解决方案1】:

您可以使用uri 模块:

---                                             

- hosts: hostname                                

  tasks:                                        

  - name: "download file"                       
    uri:                                        
      url: "http://somedomain.com/file.json"    
      method: GET                               
      user: "{{ somedomain.user }}"            
      password: "{{ somedomain.password }}"    
      force_basic_auth: yes                    
      dest: /tmp/somedomain.file.json           
      return_content: yes                       

如果这不起作用,可能与httplib2库版本有关。

【讨论】:

    【解决方案2】:

    问题是您的服务器没有返回 401 状态,因此 httplib2 库可以在之后发送 BASIC 身份验证凭据。解决方案是升级到 ansible >= 2.0 并使用 force_basic_auth: True 以便从 BASIC 身份验证凭据开始。

    【讨论】:

      【解决方案3】:

      我在 ansible 2.9 中遇到过类似的问题。 原来 curl 也得到了 HTTP 403,但仍然显示内容。 GET_URL 模块更加严格。

      对我来说,问题是通过从默认的 Apache 欢迎页面切换到自定义页面来解决的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-20
        • 2021-09-24
        • 2019-03-01
        • 1970-01-01
        • 2017-07-08
        • 2010-11-19
        • 2020-07-21
        相关资源
        最近更新 更多