You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ansible find模块结合Jinja条件设置pattern失效问题求助

Ansible find模块匹配失败问题解决

问题描述

根据操作系统类型用Jinja条件给my_pattern赋值后,debug显示变量值看似正确,但find模块找不到对应文件;静态赋值该变量时,find模块能正常找到目标文件。

原因分析

从debug输出能看到:通过Jinja条件生成的my_pattern前后带有多余空格(比如" resolv.co* "),而静态赋值的变量是无多余空格的resolv.co*。find模块会将带空格的模式当作文件名的一部分去匹配,系统中不存在带前导/尾随空格的目标文件,因此匹配失败。

多余空格来自Jinja模板的换行和缩进——Jinja默认会保留模板中的空白字符,你写在条件块里的换行、缩进被直接包含到了变量值中。

解决方案

有两种常见的解决方式:

1. 调整Jinja模板格式,去除多余空白

把条件语句写在同一行,避免换行和缩进带来的多余空格:

- name: set file pattern
  set_fact:
    my_pattern: "{% if ansible_distribution == 'RedHat' and ansible_distribution_major_version == '6' %}redhat-rel*{% else %}resolv.co*{% endif %}"

2. 使用trim过滤器去除变量前后空白

如果不想调整模板格式,可以用Jinja的trim过滤器自动去掉变量值的前后空格和换行:

- name: set file pattern
  set_fact:
    my_pattern: "{% if ansible_distribution == 'RedHat' and ansible_distribution_major_version == '6'  %}
    redhat-rel*
    {% else %}
    resolv.co*
    {% endif %}" | trim

或者在调用find模块时直接对变量应用过滤器:

- name: Find installation package
  find: paths="/etc/" patterns="{{ my_pattern | trim }}"
  delegate_to: localhost
  register: file_path

验证

修改后重新运行playbook,debug输出的my_pattern会变成无多余空格的resolv.co*,find模块就能正常匹配到目标文件。

内容的提问来源于stack exchange,提问作者andrew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:12:35