Ansible URI 模块和 ServiceNow 附件 API

Ansible URI Module and ServiceNow Attachment API

提问人:Vijayanand A 提问时间:10/18/2023 最后编辑:U880DVijayanand A 更新时间:10/27/2023 访问量:80

问:

我使用带有 URI 模块的 Ansible 将 PDF 或 CSV 文件附加到现有事件,并且它没有问题地附加

但是当我尝试下载相同的附件时,CSV是乱码或加密的,或者PDF说,无法加载。请参阅下面的代码和错误。

用于上传 CSV 或 PDF 文件的 Ansible 代码

            - name: "Attach output CSV file to incident"
              ansible.builtin.uri:
                      url: "{{ SN_HOST }}api/now/attachment/upload" 
                      user: "{{ SN_USERNAME }}"
                      password: "{{ SN_PASSWORD }}"
                      method: POST
                      return_content: true
                      validate_certs: false
                      force_basic_auth: no
                      status_code: 201
                      body_format: form-multipart
                      headers:
                          Accept: 'application/json'
                          Content-Type: 'multipart/form-data'
                      body:
                        table_name:
                            content: incident
                        table_sys_id:
                            content: 'c6957640470388444c736d4315'
                        uploadFile:
                            filename: "../../win_playbooks/reports/User_Manual.pdf"
              register: attach_file

尝试打开附加的 PDF 文件时出错

enter image description here

尝试打开下载的附加 CSV 文件时出错

enter image description here

当我手动使用 ServiceNow REST API 资源管理器或 ServiceNow UI 上传和下载附加的 PDF 或 CSV 文件时,它运行良好。我想问题是,当我尝试从上述 Ansible 代码上传 PDF 或 CSV 时,它不起作用。

Ansible 附件 服务now-rest-api

评论

0赞 U880D 10/18/2023
文本文件的内容显然是 Base64 编码的。在普通的 Ansible 中,您可以通过类似 .这导致了body_format,“正文的序列化格式。当设置为 jsonform-multipartform-urlencoded 时,如果需要,请对 body 参数进行编码......”这可能需要解决。{{ CSV_file_content | b64decode }}
0赞 Vijayanand A 10/19/2023
是的,你是对的。它是 base64 编码的。有没有办法阻止自动编码在 Ansible 中完成?(就像在标题部分一样,我尝试了这样的标题: 尽管如此,上述方法仍然没有奏效。lang-yml headers: Accept: "application/json, chartset=' '"
0赞 U880D 10/19/2023
不幸;我还没有答案。由于我可以访问这样的环境,并且我也对答案感兴趣,我也许可以测试这样的环境,但这需要大量时间。
1赞 Vijayanand A 10/27/2023
@U880D,作为临时修复,我直接在 Ansible 任务中使用了 CURL 命令,该命令在附加到 serviceNow 事件记录时不会对任何文件进行编码。我相信 ansible URI 模块的行为,当与该模块一起使用时,它将使用 base64(charset=UTF-8) 自动编码,目前,没有办法绕过这种正文格式的编码。因此,CURL 是目前唯一的选择。body_format: form-multipart

答:

0赞 Vijayanand A 10/27/2023 #1

作为临时修复,我直接在 Ansible 任务中使用了命令,该任务在附加到 ServiceNow 事件记录时不会对任何文件进行编码。curl

我相信 Ansible 模块的行为,当与 base64 (charset=UTF-8) 一起使用时,它将使用 base64 (charset=UTF-8) 自动编码,目前似乎没有办法绕过这种正文格式的编码。uribody_format: form-multipart

body_format,“正文的序列化格式。当设置为 json、form-multipart 或 form-urlencoded 时,如果需要,对 body 参数进行编码..."

所以这是目前唯一的选择。curl