Ansible调用lookup插件时如何省略未定义的参数
问题原因
default(omit) 是Ansible为模块参数设计的特殊占位符,仅在传递给模块的action参数场景下,会被Ansible执行器自动识别并剔除对应参数。
lookup/query插件属于Jinja2渲染阶段在控制端本地执行的逻辑,不会自动处理omit占位符。当item.start_date未定义时,原写法会直接把omit对应的特殊对象值传给start_date参数,插件检测到参数已传入但格式不符合YYYY-MM-DD [HH:MM:SS]要求,就会抛出格式校验错误。
解决方案
不要使用default(omit)处理lookup插件的可选参数,通过动态构造传参的方式,仅在参数有有效值时才传入对应键值对,推荐两种可直接复用的写法:
写法1:内联动态传参(单task即可实现)
利用字典解包语法,参数存在时传入对应键值,不存在时传入空字典,不会传递无效参数,对原有代码改动最小:
- set_fact: myvar: >- {{ query( 'awx.awx.schedule_rrule', 'minute', **({'start_date': item.start_date} if item.start_date is defined else {}) ) }}
如果需要同时处理参数为空字符串/None的场景,可以把判断条件调整为item.start_date is defined and item.start_date | trim | length > 0,避免传入空值触发校验错误。
写法2:预构造参数列表(适合多可选参数场景)
如果需要处理的可选参数较多,可以先初始化基础参数列表,再按条件逐个追加可选参数,最后解包传给query插件:
# 初始化固定基础参数 - set_fact: rrule_base_params: ['minute'] # 有对应值时才追加start_date参数 - set_fact: rrule_base_params: "{{ rrule_base_params + [('start_date', item.start_date)] }}" when: item.start_date is defined # 调用插件时解包参数列表 - set_fact: myvar: "{{ query('awx.awx.schedule_rrule', *rrule_base_params) }}"
内容的提问来源于stack exchange,提问作者Kucharsky
相关产品推荐
相关产品推荐

