Ansible assert任务校验Docker Compose服务运行状态时属性不存在错误的排查求助
看起来你在使用Ansible的assert模块校验Docker Compose服务运行状态时遇到了属性引用的问题,明明输出里能看到对应服务,却报错说找不到属性,我来帮你分析下可能的原因和解决办法:
首先还原下你的场景:
你写的Ansible任务是这样的:
- name: Verify that web and db services are running ansible.builtin.assert: that: - "output.services.artifactory-exporter-pdp.devopsmonitoring_artifactory-exporter-pdp_1.state.running"
得到的报错是:
2023-07-20T13:57:06.2633470Z fatal: [server]: FAILED! => {"msg": "The conditional check 'output.services.artifactory-exporter-pdp.devopsmonitoring_artifactory-exporter-pdp_1.state.running' failed. The error was: error while evaluating conditional (output.services.artifactory-exporter-pdp.devopsmonitoring_artifactory-exporter-pdp_1.state.running): 'dict object' has no attribute 'artifactory'"}
核心问题:特殊字符导致的属性引用失败
这里的关键问题是你用了点符号.来引用带连字符-的键名,Ansible在解析这种表达式的时候,会把artifactory-exporter-pdp当成是artifactory减去exporter减去pdp的运算,而不是一个完整的键名——因为Python字典的属性名(用点引用的方式)不允许包含连字符这类特殊字符。
解决办法
- 改用方括号+引号的方式引用键名
把原来的点链式引用改成方括号包裹的键名引用,这样就能正确识别带特殊字符的键了,修改后的任务如下:
- name: Verify that web and db services are running ansible.builtin.assert: that: - "output['services']['artifactory-exporter-pdp']['devopsmonitoring_artifactory-exporter-pdp_1']['state']['running']"
- 先确认输出结构的正确性
为了保险起见,你可以先加一个debug任务,把output.services的完整结构打印出来,确认键名和层级是否和你预期的一致:
- name: Debug Docker Compose services structure ansible.builtin.debug: var: output.services
通过debug输出,你能明确看到每个键的准确名称,避免因为键名拼写、层级错误导致的问题。
- 检查是否混淆了服务名和容器名
有时候Docker Compose的服务名和实际生成的容器名会有差异(比如容器名会带上项目前缀),你可以通过debug输出确认:你要校验的是服务名对应的状态,还是容器全名对应的状态,再调整引用路径。
备注:内容来源于stack exchange,提问作者Verthais

