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
相关产品推荐
相关产品推荐

