Ansible提取podman_container_info注册变量用于条件判断
报错根因
你取错了数据层级:containers.podman.podman_container_info返回的containers字段是列表,不是单层字典。不管你查1个还是多个容器,所有匹配结果都会塞在这个列表里,你直接对列表取.Name键,当然会报变量不存在。
正确操作方法
- 不确定结构时先打印全量返回
拿不准返回字段层级的时候,别瞎猜路径,先把整个注册变量打出来核对:- name: 打印模块完整返回结果 debug: var: gitlabrunner_status - 提取容器名称的正确写法
你调用模块时已经指定了name: gitlab-runner,如果容器存在,对应的信息会存在containers列表的第一个元素中,提取Name字段的正确路径是gitlabrunner_status.containers[0].Name。
注意必须先判断列表非空,否则容器不存在时直接取[0]会触发索引越界报错:- name: 打印匹配到的容器名称 debug: var: gitlabrunner_status.containers[0].Name when: gitlabrunner_status.containers | length > 0 - 后续任务的条件判断写法
实际使用时根本不需要特意提取Name字段做判断:你调用模块时已经指定了要查询的容器名,只要containers列表长度大于0,就代表指定名称的容器存在,后续任务直接加这个条件即可,是最稳妥不会出错的写法:- name: 仅当gitlab-runner存在时执行的任务 # 替换为你自己的业务逻辑 ansible.builtin.shell: echo "gitlab-runner已部署" when: gitlabrunner_status.containers | length > 0
扩展场景
如果你调用模块时没有指定name参数、是查询节点上所有容器,要判断gitlab-runner是否存在,可以用过滤器做匹配:
when: gitlabrunner_status.containers | selectattr('Name', '==', 'gitlab-runner') | list | length > 0
内容的提问来源于stack exchange,提问作者d1530
相关产品推荐
相关产品推荐

