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

Ansible更新结果写入MySQL失败,请求技术协助

解决Ansible写入MySQL时'package_name'未定义的问题

你遇到的'package_name'未定义错误,核心原因是写入MySQL的任务中,没有正确引用extracted_changes.updated列表里的包信息字段。以下是针对性的解决步骤:

1. 确认更新包的数据结构

先核对extracted_changes.updated的实际输出结构,它应该是一个包含字典元素的列表,示例如下:

extracted_changes.updated:
  - name: "httpd"
    old_version: "2.4.53-1.amzn2"
    new_version: "2.4.54-1.amzn2"
  - name: "openssl"
    old_version: "1.0.2k-25.amzn2.0.1"
    new_version: "1.0.2k-26.amzn2.0.1"

每个字典里的键(比如name、old_version)就是你要引用的字段,而非凭空使用package_name。

2. 修正MySQL写入任务的循环与变量引用

将写入数据库的任务改成以下写法,确保直接遍历extracted_changes.updated列表,并正确引用每个元素的字段:

- name: 将更新包信息写入MySQL
  community.mysql.mysql_query:
    login_host: "{{ db_host }}"
    login_user: "{{ db_user }}"
    login_password: "{{ db_password }}"
    db: "{{ db_name }}"
    query: "INSERT INTO updated_packages (package_name, old_version, new_version, server_hostname) VALUES (%s, %s, %s, %s)"
    args:
      - "{{ item.name }}"
      - "{{ item.old_version }}"
      - "{{ item.new_version }}"
      - "{{ ansible_hostname }}"
  loop: "{{ extracted_changes.updated }}"
  when: extracted_changes.updated | length > 0

注意:如果你的extracted_changes.updated里包名字段不是name,而是package_name,则把item.name改成item.package_name,必须与实际输出的键名完全匹配。

3. 排查常见错误点

  • 无需使用with_together:extracted_changes.updated本身就是包含所有包信息的单列表,直接用loop遍历即可,多此一举的合并操作会导致变量混乱。
  • 增加前置验证:可以先添加一个debug任务,确认变量引用是否正确:
- name: 验证更新包变量
  debug:
    msg: "包名: {{ item.name }}, 旧版本: {{ item.old_version }}, 新版本: {{ item.new_version }}"
  loop: "{{ extracted_changes.updated }}"

如果debug能正常输出所有包信息,再执行MySQL写入任务就不会出现未定义变量的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:10:12