如何在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误报状态
注意事项
- 确保
date +%Y-%m-%d的输出格式与dpkg.log中的日期格式一致(Ubuntu默认即为YYYY-MM-DD,无需调整) - 若需监控多个指定软件包,复制对应筛选、提取和通知任务,替换
jellyfin为目标包名即可 - 方案二更适合仅关注特定软件包的场景,资源占用更低
内容的提问来源于stack exchange,提问作者davidsteg
相关产品推荐
相关产品推荐

