Ansible中Jinja2小写转换的异常行为咨询
Ansible中Jinja2
lower过滤器的行为差异解释 问题核心原因
你遇到的问题本质是Jinja2的lower过滤器作用在列表上时的行为差异:
- 当在
set_fact中使用exclusion_functions | lower时,Ansible会隐式遍历列表元素,逐个应用lower过滤器,最终得到全小写的字符串列表。 - 但在
when条件表达式中直接使用(exclusion_functions | lower)时,Jinja2会先把整个列表转换成字符串(比如"['Vrijwilliger', 'Maatje']"),再对这个字符串执行lower操作,最终得到的是一个字符串"['vrijwilliger', 'maatje']",而非列表。
这样一来,(job_function | lower)的结果vrijwillig会被判定为存在于这个字符串中(因为字符串包含子串vrijwillig),所以when条件成立,任务没有被跳过。
三个场景对比
场景1:正常跳过
这里exclusion_functions本身就是全小写列表,vrijwillig不在列表内,条件不成立,任务跳过,符合预期。
- name: Lowercase test hosts: localhost gather_facts: false vars: job_function: 'VRIJwillig' exclusion_functions: - vrijwilliger - maatje tasks: - name: Test for function in exclusions debug: msg: In exclusions when: (job_function | lower) in exclusion_functions
场景2:正常跳过
set_fact中,Ansible自动处理列表元素,将exclusion_functions每个元素转小写,最终exclusions是['vrijwilliger', 'maatje']列表,vrijwillig不在其中,任务跳过。
- name: Lowercase test hosts: localhost gather_facts: false vars: job_function: 'VRIJwillig' exclusion_functions: - Vrijwilliger - Maatje tasks: - name: Initialiseer variabelen set_fact: exclusions: "{{ exclusion_functions | lower }}" - name: Test for function in exclusions debug: msg: In exclusions when: (job_function | lower) in exclusions
场景3:未跳过(问题场景)
when条件里的(exclusion_functions | lower)被处理成字符串"['vrijwilliger', 'maatje']",vrijwillig是该字符串的子串,in操作返回True,任务执行。
--- - name: Lowercase test hosts: localhost gather_facts: false vars: job_function: 'VRIJwillig' exclusion_functions: - Vrijwilliger - Maatje tasks: - name: Test for function in exclusions debug: msg: In exclusions when: (job_function | lower) in (exclusion_functions | lower)
正确写法
要在when条件中直接对列表元素批量转小写,需使用map('lower')过滤器配合list()将结果转为列表:
- name: Test for function in exclusions debug: msg: In exclusions when: (job_function | lower) in (exclusion_functions | map('lower') | list)
这样能确保每个元素都被转成小写,再以列表形式参与in判断,符合预期。
内容的提问来源于Stack Exchange,提问作者Haruka Shitou
相关产品推荐
相关产品推荐

