You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将Vuls扫描CURL命令转换为Ansible URI模块配置遇阻,请求技术支持

解决Ansible URI模块转换Vuls扫描CURL命令的问题

你的核心问题有两个:一是Headers里的命令没有被执行,只是作为字符串传递了;二是没有正确处理--data-binary对应的包列表数据。下面是完整的修正Playbook,以及关键细节的解释:

完整Playbook配置

- hosts: localhost
  become: yes
  tasks:
    # 确保lsb-release包已安装(Debian/Ubuntu系需要)
    - name: Install lsb-release for system info
      apt:
        name: lsb-release
        state: present
      when: ansible_os_family == "Debian"

    # 收集系统信息变量
    - name: Get OS Family
      command: lsb_release -si
      register: os_family_raw
      changed_when: false

    - name: Format OS Family to lowercase
      set_fact:
        os_family: "{{ os_family_raw.stdout | lower }}"

    - name: Get OS Release version
      command: lsb_release -sr
      register: os_release_raw
      changed_when: false

    - name: Get Kernel Release
      command: uname -r
      register: kernel_release_raw
      changed_when: false

    - name: Get Server Hostname
      command: hostname
      register: server_name_raw
      changed_when: false

    # 收集dpkg包列表数据
    - name: Fetch dpkg package details
      command: dpkg-query -W -f="${binary:Package},${db:Status-Abbrev},${Version},${Source},${source:Version}\n"
      register: dpkg_package_list
      changed_when: false

    # 发送请求到Vuls服务器并保存结果
    - name: Send data to Vuls scanning endpoint
      uri:
        method: POST
        url: https://abc.xyz.co/vuls
        headers:
          Content-Type: text/plain
          X-Vuls-OS-Family: "{{ os_family }}"
          X-Vuls-OS-Release: "{{ os_release_raw.stdout }}"
          X-Vuls-Kernel-Release: "{{ kernel_release_raw.stdout }}"
          X-Vuls-Server-Name: "{{ server_name_raw.stdout }}"
        body: "{{ dpkg_package_list.stdout }}"
        body_format: raw
        dest: /home/aman/vuls-report.json
        status_code: 200
      when: not ansible_check_mode

关键修正点解释

  • Headers命令执行问题:Ansible不会自动解析字符串中的Shell命令,所以必须用command模块单独执行每个系统信息命令,通过register存储输出结果,再将结果传入Headers。比如OS家族名称通过lsb_release -si获取后,用lower过滤器转成小写,和原CURL逻辑一致。
  • --data-binary的替代方案:CURL的--data-binary对应Ansible URI模块的body参数,同时必须设置body_format: raw——因为我们发送的是纯文本格式的包列表,这个参数可以避免Ansible自动将Body转换成JSON格式,和原CURL的text/plainContent-Type匹配。
  • 响应结果保存:用URI模块的dest参数直接指定输出文件,替代CURL中的重定向>,这是Ansible的标准做法。
  • 状态码校验:添加status_code: 200可以确保请求成功,只有当服务器返回200状态码时,任务才会标记为成功,避免静默失败。
  • changed_when: false:收集系统信息的命令不会修改系统状态,添加这个参数让Ansible标记这些任务为"未变更",符合Ansible的最佳实践。

内容的提问来源于stack exchange,提问作者Mr. Annonymous

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 10:42:41