如何用Ansible JSON Query获取Sabnzbd的Linux src.tar.gz源码包?
用Ansible调用GitHub API获取Sabnzbd的src.tar.gz下载链接
问题分析
你之前的JSON Query写法存在两处关键错误:一是未指向GitHub Release API返回结构中的assets数组(所有可下载文件都存储在此字段);二是匹配逻辑不符合JMESPath语法,错误使用了==和[*]进行模糊匹配,导致无法筛选出目标URL。
修正后的完整Playbook
以下是可以正确获取并下载*-src.tar.gz格式源码包的代码:
--- - name: Install sabnzbd hosts: all become: true gather_facts: false tasks: - name: Fetch latest release metadata from GitHub ansible.builtin.uri: url: "https://api.github.com/repos/sabnzbd/sabnzbd/releases/latest" return_content: yes headers: Accept: application/vnd.github.v3+json register: github_response - name: Extract src.tar.gz download URL ansible.builtin.set_fact: sabnzbd_src_url: "{{ github_response.json | json_query(query) | first }}" vars: query: "assets[?ends_with(browser_download_url, '-src.tar.gz')].browser_download_url" - name: Download Sabnzbd source tarball ansible.builtin.get_url: url: "{{ sabnzbd_src_url }}" dest: /tmp/ mode: '0644' register: sabnzbd_tarball - name: Confirm download result ansible.builtin.debug: msg: "Sabnzbd source package saved to {{ sabnzbd_tarball.dest }}"
JMESPath(JSON Query)用法解析
这里的核心是用正确的JMESPath语法筛选目标数据:
assets:指定要操作的数组字段,定位到所有可下载资产的集合[?ends_with(browser_download_url, '-src.tar.gz')]:筛选数组中browser_download_url字段以-src.tar.gz结尾的元素.browser_download_url:提取筛选后元素的下载URL值| first:由于筛选结果是单元素数组,用first取出字符串格式的URL,直接供get_url模块使用
额外优化说明
- 添加
Accept: application/vnd.github.v3+json请求头,确保GitHub返回标准API格式的数据 - 显式使用
ansible.builtin.前缀指定模块,避免环境中模块别名冲突 - 设置
mode: '0644'保证下载文件的权限合规
内容的提问来源于stack exchange,提问作者eekfonky
相关产品推荐
相关产品推荐

