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

如何在Ansible更新任务中提取并通知指定软件包的版本?

解决方案:针对指定软件包的版本更新通知实现

方案一:基于现有更新记录筛选提取

保留原有的全量更新记录任务,新增筛选和提取逻辑,实现精准通知:

- name: Manages Packages
  hosts: ubuntu
  become: true
  tasks:
    - name: Cache Update and Upgrade
      apt:
        update_cache: yes
        cache_valid_time: 86400
        upgrade: full

    - name: Get today's package update records
      shell: grep -E "^$(date +%Y-%m-%d).+ (install|upgrade) " /var/log/dpkg.log | cut -d " " -f 3-5
      register: result

    - name: Show all update records (debug)
      debug: msg="{{ result.stdout_lines }}"
      when: result.stdout_lines is defined

    # 筛选Jellyfin相关的升级记录
    - name: Filter Jellyfin upgrade entries
      set_fact:
        jellyfin_upgrades: "{{ result.stdout_lines | select('search', 'upgrade jellyfin') | list }}"
      when: result.stdout_lines is defined

    # 提取Jellyfin版本号(所有组件版本一致,取第一条的版本)
    - name: Extract Jellyfin updated version
      set_fact:
        jellyfin_version: "{{ jellyfin_upgrades[0] | regex_replace('^.+ ', '') }}"
      when: jellyfin_upgrades | length > 0

    # 发送Jellyfin专属更新通知
    - name: Send Jellyfin update alert to Telegram
      telegram:
        token: '###'
        chat_id: '###'
        msg: "{{ ansible_hostname }} 上的Jellyfin已更新至 {{ jellyfin_version }}"
      when: jellyfin_upgrades | length > 0

    # 可选:保留全量更新通知(如果需要)
    - name: Send full update summary to Telegram
      telegram:
        token: '###'
        chat_id: '###'
        msg: '{{ansible_hostname}} 更新了 {{ result.stdout_lines | length }} 个软件包: {{ result.stdout_lines }}'
      when: result.stdout_lines | length > 0

逻辑说明

  • select('search', 'upgrade jellyfin'):从全量更新记录中筛选所有包含Jellyfin升级的行,自动匹配jellyfin-server、jellyfin-web等相关组件
  • regex_replace('^.+ ', ''):通过正则替换去掉每行开头到最后一个空格的内容,直接提取版本号(每行格式固定为upgrade 包名:架构 版本号,最后一段即为目标版本)

方案二:直接提取Jellyfin更新记录(更高效)

跳过全量记录提取,直接从日志中过滤Jellyfin的升级信息,减少后续处理开销:

- name: Manages Packages
  hosts: ubuntu
  become: true
  tasks:
    - name: Cache Update and Upgrade
      apt:
        update_cache: yes
        cache_valid_time: 86400
        upgrade: full

    # 直接提取当天Jellyfin的升级版本号
    - name: Get Jellyfin updated version
      shell: grep -E "^$(date +%Y-%m-%d).+ upgrade jellyfin" /var/log/dpkg.log | cut -d " " -f 5 | uniq
      register: jellyfin_version_result
      changed_when: false

    # 发送Jellyfin更新通知(仅当有更新时)
    - name: Send Jellyfin update alert to Telegram
      telegram:
        token: '###'
        chat_id: '###'
        msg: "{{ ansible_hostname }} 上的Jellyfin已更新至 {{ jellyfin_version_result.stdout }}"
      when: jellyfin_version_result.stdout != ""

逻辑说明

  • grep -E "^$(date +%Y-%m-%d).+ upgrade jellyfin":仅匹配当天的Jellyfin升级记录
  • cut -d " " -f 5:直接提取日志行中的版本号字段(Ubuntu默认dpkg.log升级行的第5个字段为版本号)
  • uniq:去重处理,避免多个Jellyfin组件重复输出相同版本号
  • changed_when: false:标记该任务无系统变更,避免Ansible误报状态

注意事项

  1. 确保date +%Y-%m-%d的输出格式与dpkg.log中的日期格式一致(Ubuntu默认即为YYYY-MM-DD,无需调整)
  2. 若需监控多个指定软件包,复制对应筛选、提取和通知任务,替换jellyfin为目标包名即可
  3. 方案二更适合仅关注特定软件包的场景,资源占用更低

内容的提问来源于stack exchange,提问作者davidsteg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:35:34