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
相关产品推荐
相关产品推荐

