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 模块。

注意

此模块具有相应的 action 插件

参数

参数

注释

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 设置为 form-multipart,则选项 'multipart_encoding' 允许更改多部分文件编码。(在 v2.19 中添加)

body_format

字符串

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

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

使用 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

路径

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

此文件还可以包含密钥,如果包含密钥,则不需要 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对象上下文的角色部分。

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

setype

字符串

SELinux filesystem对象上下文的类型部分。

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

seuser

字符串

SELinux filesystem对象上下文的用户部分。

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

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

src

路径

在Ansible 2.7中添加

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

不能与body一起使用。

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

status_code

列表 / 元素=整数

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

默认值: [200]

timeout

整数

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

默认值: 30

unix_socket

路径

在Ansible 2.8中添加

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

unredirected_headers

列表 / 元素=字符串

在ansible-core 2.12中添加

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

默认值: []

unsafe_writes

布尔值

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

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

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

重要!不安全的写入容易出现竞争条件,并可能导致数据损坏。

选项

  • false ← (默认)

  • true

url

字符串 / 必需

形式为(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

支持:不支持

在差异模式下,将返回有关更改内容(或可能需要在check_mode下更改的内容)的详细信息

platform

平台: 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
        multipart_encoding: base64
      file2:
        content: text based file content
        filename: fake.txt
        mime_type: text/plain
        multipart_encoding: 7or8bit
      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'

返回值

常见的返回值已在此处记录,以下是此模块特有的字段

Key

描述

content

字符串

响应正文内容。

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

示例: "{}"

cookies

字典

放置在cookie存储中的cookie值。

返回值:成功时

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

cookies_string

字符串

未来请求Cookie头的值。

返回值:成功时

示例: "SESSIONID=[SESSIONID]"

elapsed

整数

执行下载所花费的秒数。

返回值:成功时

示例: 23

msg

字符串

来自请求的HTTP消息。

返回值:始终返回

示例: "OK (unknown bytes)"

路径

字符串

目标文件/路径

返回值:定义了dest时

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

redirected

布尔值

请求是否被重定向。

返回值:成功时

示例: false

status

整数

来自请求的HTTP状态码。

返回值:始终返回

示例: 200

url

字符串

请求实际使用的URL。

返回值:始终返回

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

作者

  • Romeo Theriault (@romeotheriault)