ansible.builtin.uri 模块 – 与 Web 服务交互

注意

此模块是 ansible-core 的一部分,包含在所有 Ansible 安装中。在大多数情况下,即使没有指定 collections 关键字,您也可以使用简短的模块名称 uri。但是,我们建议您使用 完全限定的集合名称 (FQCN) ansible.builtin.uri,以便轻松链接到模块文档并避免与可能具有相同模块名称的其他集合冲突。

概述

  • 与 HTTP 和 HTTPS Web 服务交互,并支持 Digest、Basic 和 WSSE HTTP 身份验证机制。

  • 对于 Windows 目标,请使用 ansible.windows.win_uri 模块。

注意

此模块具有相应的 操作插件

参数

参数

注释

attributes

别名:attr

字符串

结果文件系统对象应具有的属性。

要获取支持的标志,请查看目标系统上 chattr 的手册页。

此字符串应按与 lsattr 显示的顺序相同的顺序包含属性。

默认情况下假定使用 = 运算符,否则需要在字符串中包含 +- 运算符。

body

任何

对 Web 服务的 HTTP 请求/响应的主体。如果 body_format 设置为 json,它将接受已格式化的 JSON 字符串或将数据结构转换为 JSON。

如果 body_format 设置为 form-urlencoded,它将把字典或元组列表转换为 application/x-www-form-urlencoded 字符串。(在 v2.7 中添加)

如果 body_format 设置为 form-multipart,它将把字典转换为 multipart/form-multipart 主体。(在 v2.10 中添加)

body_format

字符串

主体的序列化格式。当设置为 jsonform-multipartform-urlencoded 时,将根据需要对主体参数进行编码,并自动设置相应的 Content-Type 标头。

从 v2.3 开始,可以通过 headers 选项,覆盖设置为 jsonform-urlencoded 时的 Content-Type 标头。

在使用 form-multipart 时,无法覆盖 Content-Type 标头。

form-urlencoded 是在 v2.7 中添加的。

form-multipart 是在 v2.10 中添加的。

选项

  • "form-urlencoded"

  • "json"

  • "raw" ← (默认)

  • "form-multipart"

ca_path

路径

在 ansible-core 2.11 中添加

包含用于验证的 CA 证书的 PEM 格式文件。

ciphers

列表 / 元素=字符串

在 ansible-core 2.14 中添加

用于请求的 SSL/TLS 密码。

当提供列表时,所有密码将按顺序使用 : 连接。

有关更多详细信息,请参阅 OpenSSL 密码列表格式

可用密码取决于 Python 和 OpenSSL/LibreSSL 版本。

client_cert

路径

用于 SSL 客户端身份验证的 PEM 格式证书链文件。

此文件也可以包含密钥,如果包含密钥,则不需要 client_key

client_key

路径

包含用于 SSL 客户端身份验证的私钥的 PEM 格式文件。

如果 client_cert 包含证书和密钥,则不需要此选项。

creates

路径

一个文件名,如果它已经存在,则不会运行此步骤。

decompress

布尔值

在 ansible-core 2.14 中添加

是否尝试解压缩 gzip 内容编码的响应。

选项

  • false

  • true ← (默认)

dest

路径

下载文件的路径(如果需要)。如果 dest 是一个目录,将使用远程服务器上文件的基名。

follow_redirects

字符串

URI 模块是否应遵循重定向。

选项

  • "all": 将遵循所有重定向。

  • "no": (已弃用,在 2.22 中删除) none 的别名。

  • "none": 不会遵循任何重定向。

  • "safe" (默认): 仅会遵循执行 GET 或 HEAD 请求的重定向。

  • "urllib2": 委托给 urllib2 行为(在撰写本文时,这将遵循 HTTP 重定向)。

  • "yes": (已弃用,在 2.22 中删除) all 的别名。

force

布尔值

如果 true 则不要获取缓存的副本。

选项

  • false ← (默认)

  • true

force_basic_auth

布尔值

在初始请求时强制发送 Basic 身份验证标头。

当此设置为 false 时,此模块将首先尝试未经身份验证的请求,当服务器回复 HTTP 401 错误时,它将提交 Basic 身份验证标头。

当此设置设为 true 时,此模块将在第一个请求时立即发送 Basic 身份验证标头。

在以下任何情况下使用此设置

您知道 Web 服务端点始终需要 HTTP Basic 身份验证,并且您希望通过消除第一次往返来加快请求速度。

Web 服务没有正确地将 HTTP 401 错误发送到您的客户端,因此 Ansible 的 HTTP 库不会正确地使用 HTTP 凭据进行响应,并且登录将失败。

Web 服务禁止或限制导致任何 HTTP 401 错误的客户端。

选项

  • false ← (默认)

  • true

group

字符串

应拥有文件系统对象的组的名称,如传递给 chown 一样。

当未指定时,它使用当前用户的当前组,除非您是 root 用户,在这种情况下,它可以保留先前的所有权。

headers

字典

以 YAML 哈希格式在请求中添加自定义 HTTP 标头。从 Ansible 2.3 开始,在此提供 Content-Type 将覆盖通过为 body_format 提供 jsonform-urlencoded 生成的标头。

默认: {}

http_agent

字符串

要标识的标头,通常显示在 Web 服务器日志中。

默认: "ansible-httpget"

method

字符串

请求或响应的 HTTP 方法。

在较新的版本中,我们不再在模块级别限制方法,但它仍然必须是处理请求的服务接受的有效方法。

默认: "GET"

mode

任何

生成的 filesystem 对象应具有的权限。

对于习惯使用 /usr/bin/chmod 的人,请记住模式实际上是八进制数。您必须为 Ansible 提供足够的信息才能正确解析它们。为了获得一致的结果,请引用八进制数(例如,'644''1777'),以便 Ansible 接收一个字符串,并可以自行从字符串转换为数字。添加前导零(例如,0755)有时有效,但在循环和其他一些情况下可能会失败。

如果为 Ansible 提供一个不遵循上述任一规则的数字,则最终将得到一个十进制数,这将导致意外结果。

从 Ansible 1.8 开始,模式可以指定为符号模式(例如,u+rwxu=rw,g=r,o=r)。

如果未指定 mode 并且目标 filesystem 对象 **不存在**,则在为新创建的 filesystem 对象设置模式时将使用系统上的默认 umask

如果未指定 mode 并且目标 filesystem 对象 **存在**,则将使用现有 filesystem 对象的模式。

指定 mode 是确保 filesystem 对象以正确的权限创建的最佳方法。有关更多详细信息,请参阅 CVE-2020-1736。

owner

字符串

应拥有 filesystem 对象的用户名称,与传递给 chown 的名称相同。

如果未指定,它将使用当前用户,除非您是 root,在这种情况下,它可以保留之前的拥有者。

指定数字用户名将被视为用户 ID,而不是用户名。避免使用数字用户名以避免此混淆。

remote_src

布尔值

在 Ansible 2.7 中添加

如果为 false,则模块将在控制器节点上搜索 src

如果为 true,则模块将在受管(远程)节点上搜索 src

选项

  • false ← (默认)

  • true

removes

路径

一个文件名,当它不存在时,此步骤将不会运行。

return_content

布尔值

无论成功还是失败,是否将响应正文作为字典结果中的“content”键返回。

独立于此选项,如果报告的 Content-Typeapplication/json,则 JSON 将始终加载到字典结果中称为 json 的键中。

选项

  • false ← (默认)

  • true

selevel

字符串

SELinux filesystem 对象上下文的级别部分。

这是 MLS/MCS 属性,有时被称为 range

当设置为 _default 时,它将使用策略的 level 部分(如果可用)。

serole

字符串

SELinux filesystem 对象上下文的 role 部分。

当设置为 _default 时,它将使用策略的 role 部分(如果可用)。

setype

字符串

SELinux filesystem 对象上下文的 type 部分。

当设置为 _default 时,它将使用策略的 type 部分(如果可用)。

seuser

字符串

SELinux filesystem 对象上下文的 user 部分。

默认情况下,它使用 system 策略(如果适用)。

当设置为 _default 时,它将使用策略的 user 部分(如果可用)。

src

路径

在 Ansible 2.7 中添加

要提交到远程服务器的文件的路径。

不能与 body 一起使用。

应与 force_basic_auth 一起使用,以确保在远程端发送 401 时成功。

status_code

list / elements=integer

表示请求成功的有效数字 HTTP 状态码列表。

默认: [200]

timeout

integer

以秒为单位的套接字级别超时

默认: 30

unix_socket

路径

在 Ansible 2.8 中添加

要用于连接的 Unix 域套接字的路径。

unredirected_headers

列表 / 元素=字符串

在 ansible-core 2.12 中添加

一个标头名称列表,这些名称不会在后续重定向的请求中发送。此列表不区分大小写。默认情况下,所有标头都将被重定向。在某些情况下,列出标头(如 Authorization)可能会有益,以避免潜在的凭据泄露。

默认: []

unsafe_writes

布尔值

影响何时使用原子操作来防止目标 filesystem 对象的数据损坏或不一致读取。

默认情况下,此模块使用原子操作来防止目标 filesystem 对象的数据损坏或不一致读取,但有时系统会以阻止此操作的方式进行配置或只是出现故障。一个例子是 docker 装载的 filesystem 对象,它们不能从容器内部以原子方式更新,只能以不安全的方式写入。

此选项允许 Ansible 在原子操作失败时回退到不安全的文件系统对象更新方法(但是,它不会强制 Ansible 执行不安全写入)。

重要!不安全的写入会受到竞争条件的影响,并可能导致数据损坏。

选项

  • false ← (默认)

  • true

url

string / required

以 (http|https)://host.domain[:port]/path 格式的 HTTP 或 HTTPS URL。

url_password

别名:password

字符串

模块要用于摘要、基本或 WSSE 身份验证的密码。

url_username

别名:user

字符串

模块要用于摘要、基本或 WSSE 身份验证的用户名。

use_gssapi

布尔值

在 ansible-core 2.11 中添加

使用 GSSAPI 执行身份验证,通常用于 Kerberos 或通过 Negotiate 身份验证的 Kerberos。

要求安装 Python 库 gssapi

GSSAPI 的凭据可以通过 url_username/url_password 或通过指定自定义 Kerberos 凭据缓存的 GSSAPI 环境变量 KRB5CCNAME 来指定。

即使安装了 NTLM 的 GSSAPI 机制,也不支持 NTLM 身份验证。

选项

  • false ← (默认)

  • true

use_netrc

布尔值

在 ansible-core 2.14 中添加

确定是否使用来自 ~/.netrc 文件的凭据。

默认情况下,.netrc 与基本身份验证标头一起使用。

当为 false 时,.netrc 凭据将被忽略。

选项

  • false

  • true ← (默认)

use_proxy

布尔值

如果为 false,则它不会使用代理,即使在目标主机上的环境变量中定义了代理。

选项

  • false

  • true ← (默认)

validate_certs

布尔值

如果为 false,则不会验证 SSL 证书。

这应该只在使用自签名证书的个人控制的站点上设置为 false

在 1.9.2 之前,代码默认为 false

选项

  • false

  • true ← (默认)

属性

属性

支持

描述

check_mode

支持:

可以在 check_mode 中运行并返回更改状态预测,而不会修改目标,如果不受支持,则操作将被跳过。

diff_mode

支持:

在 diff 模式下,将返回关于已更改内容(或可能需要在 check_mode 中更改的内容)的详细信息。

平台

平台: posix

可操作的目标操作系统/系列。

备注

注意

  • Ansible 2.1 中已移除对 httplib2 的依赖关系。

  • 该模块以小写形式返回所有 HTTP 标头。

  • 对于 Windows 目标,请使用 ansible.windows.win_uri 模块。

另请参见

另请参见

ansible.builtin.get_url

从 HTTP、HTTPS 或 FTP 下载文件到节点。

ansible.windows.win_uri

关于 ansible.windows.win_uri 模块的官方文档。

示例

- name: Check that you can connect (GET) to a page and it returns a status 200
  ansible.builtin.uri:
    url: http://www.example.com

- name: Check that a page returns successfully but fail if the word AWESOME is not in the page contents
  ansible.builtin.uri:
    url: http://www.example.com
    return_content: true
  register: this
  failed_when: this is failed or "'AWESOME' not in this.content"

- name: Create a JIRA issue
  ansible.builtin.uri:
    url: https://your.jira.example.com/rest/api/2/issue/
    user: your_username
    password: your_pass
    method: POST
    body: "{{ lookup('ansible.builtin.file','issue.json') }}"
    force_basic_auth: true
    status_code: 201
    body_format: json

- name: Login to a form based webpage, then use the returned cookie to access the app in later tasks
  ansible.builtin.uri:
    url: https://your.form.based.auth.example.com/index.php
    method: POST
    body_format: form-urlencoded
    body:
      name: your_username
      password: your_password
      enter: Sign in
    status_code: 302
  register: login

- name: Login to a form based webpage using a list of tuples
  ansible.builtin.uri:
    url: https://your.form.based.auth.example.com/index.php
    method: POST
    body_format: form-urlencoded
    body:
    - [ name, your_username ]
    - [ password, your_password ]
    - [ enter, Sign in ]
    status_code: 302
  register: login

- name: Upload a file via multipart/form-multipart
  ansible.builtin.uri:
    url: https://httpbin.org/post
    method: POST
    body_format: form-multipart
    body:
      file1:
        filename: /bin/true
        mime_type: application/octet-stream
      file2:
        content: text based file content
        filename: fake.txt
        mime_type: text/plain
      text_form_field: value

- name: Connect to website using a previously stored cookie
  ansible.builtin.uri:
    url: https://your.form.based.auth.example.com/dashboard.php
    method: GET
    return_content: true
    headers:
      Cookie: "{{ login.cookies_string }}"

- name: Queue build of a project in Jenkins
  ansible.builtin.uri:
    url: http://{{ jenkins.host }}/job/{{ jenkins.job }}/build?token={{ jenkins.token }}
    user: "{{ jenkins.user }}"
    password: "{{ jenkins.password }}"
    method: GET
    force_basic_auth: true
    status_code: 201

- name: POST from contents of local file
  ansible.builtin.uri:
    url: https://httpbin.org/post
    method: POST
    src: file.json

- name: POST from contents of remote file
  ansible.builtin.uri:
    url: https://httpbin.org/post
    method: POST
    src: /path/to/my/file.json
    remote_src: true

- name: Create workspaces in Log analytics Azure
  ansible.builtin.uri:
    url: https://www.mms.microsoft.com/Embedded/Api/ConfigDataSources/LogManagementData/Save
    method: POST
    body_format: json
    status_code: [200, 202]
    return_content: true
    headers:
      Content-Type: application/json
      x-ms-client-workspace-path: /subscriptions/{{ sub_id }}/resourcegroups/{{ res_group }}/providers/microsoft.operationalinsights/workspaces/{{ w_spaces }}
      x-ms-client-platform: ibiza
      x-ms-client-auth-token: "{{ token_az }}"
    body:

- name: Pause play until a URL is reachable from this host
  ansible.builtin.uri:
    url: "http://192.0.2.1/some/test"
    follow_redirects: none
    method: GET
  register: _result
  until: _result.status == 200
  retries: 720 # 720 * 5 seconds = 1hour (60*60/5)
  delay: 5 # Every 5 seconds

- name: Provide SSL/TLS ciphers as a list
  uri:
    url: https://example.org
    ciphers:
      - '@SECLEVEL=2'
      - ECDH+AESGCM
      - ECDH+CHACHA20
      - ECDH+AES
      - DHE+AES
      - '!aNULL'
      - '!eNULL'
      - '!aDSS'
      - '!SHA1'
      - '!AESCCM'

- name: Provide SSL/TLS ciphers as an OpenSSL formatted cipher list
  uri:
    url: https://example.org
    ciphers: '@SECLEVEL=2:ECDH+AESGCM:ECDH+CHACHA20:ECDH+AES:DHE+AES:!aNULL:!eNULL:!aDSS:!SHA1:!AESCCM'

返回值

常见返回值在 此处 有记录,以下为此模块独有的字段。

描述

content

字符串

响应正文内容。

返回: 状态不在 status_code 中或 return_content 为 true

示例: "{}"

cookies

字典

放置在 cookie 罐中的 cookie 值。

返回: 成功时

示例: {"SESSIONID": "[SESSIONID]"}

cookies_string

字符串

未来请求 Cookie 标头的值。

返回: 成功时

示例: "SESSIONID=[SESSIONID]"

elapsed

integer

执行下载所用的秒数。

返回: 成功时

示例: 23

msg

字符串

来自请求的 HTTP 消息。

返回: 始终

示例: "OK (unknown bytes)"

路径

字符串

目标文件/路径

返回: dest 已定义

示例: "/path/to/file.txt"

redirected

布尔值

请求是否已重定向。

返回: 成功时

示例: false

status

integer

来自请求的 HTTP 状态代码。

返回: 始终

示例: 200

url

字符串

用于请求的实际 URL。

返回: 始终

示例: "https://ansible.org.cn/"

作者

  • Romeo Theriault (@romeotheriault)