如何消除Ansible条件语句中的Jinja2模板分隔符警告
解决Ansible中device变量引发的条件语句警告问题
问题场景
目标是消除由device变量引发的Ansible警告,尝试使用lookup('ansible.builtin.vars', 'device')未解决问题。原Playbook及执行警告如下:
原Playbook
- name: Distribution Setup hosts: apollo become: true gather_facts: true vars: device: ASMedia tasks: - name: Set device id ansible.builtin.command: cmd: lsusb -s 2:2 changed_when: device_id.stdout.find("{{ device }}") != -1 register: device_id - name: Set attribute ansible.builtin.set_fact: attribute: "{{ device_id.stdout | regex_search('ID\\s+(.*)\\s+' + lookup('ansible.builtin.vars', 'device'), '\\1') | join | trim | split(':') }}" - name: Print attribute information ansible.builtin.debug: var: attribute when: attribute is iterable and (attribute | length == 2)
执行警告
[WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: device_id.stdout.find("{{ device }}") != -1
原因分析
- Ansible的条件字段(如
changed_when、when)本身默认处于Jinja2解析上下文,不需要额外用{{ }}包裹变量,否则会触发语法警告。 lookup('ansible.builtin.vars', 'device')属于多余操作:device是直接定义在vars中的变量,直接引用即可,无需通过lookup获取。
解决方案
对Playbook做两处修正:
- 移除
changed_when条件里的{{ }},直接使用变量名device - 移除
set_fact中多余的lookup调用,直接拼接device变量到正则表达式中
修正后的完整Playbook
- name: Distribution Setup hosts: apollo become: true gather_facts: true vars: device: ASMedia tasks: - name: Set device id ansible.builtin.command: cmd: lsusb -s 2:2 changed_when: device_id.stdout.find(device) != -1 register: device_id - name: Set attribute ansible.builtin.set_fact: attribute: "{{ device_id.stdout | regex_search('ID\\s+(.*)\\s+' + device, '\\1') | join | trim | split(':') }}" - name: Print attribute information ansible.builtin.debug: var: attribute when: attribute is iterable and (attribute | length == 2)
验证结果
执行修正后的Playbook,原警告会消失,且功能保持正常,最终输出如下:
PLAY [Distribution Setup] ********************************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************************************************* ok: [apollo] TASK [Set device id] *************************************************************************************************************************************** changed: [apollo] TASK [Set attribute] ******************************************************************************************************************************** ok: [apollo] TASK [Print attribute information] ************************************************************************************************************************* ok: [apollo] => { "attribute": [ "174c", "55aa" ] } PLAY RECAP ************************************************************************************************************************************************* apollo : ok=4 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
内容的提问来源于stack exchange,提问作者Floren
相关产品推荐
相关产品推荐

