Ansible循环执行OpenSSL命令失败求助:无法找到CSR文件
问题排查:Ansible执行OpenSSL验证CSR文件时报文件不存在
问题描述
需对fetch模块生成的目录(示例结构host1.csr/req、host2.csr/req)中的CSR文件执行openssl req -text -noout -verify -in <CSR文件路径>命令,测试阶段仅保留两个目录。编写的Ansible Playbook通过语法检查,但执行时提示host1.csr、host2.csr文件不存在,尽管find模块已成功找到这两个文件。
错误分析
原Playbook存在以下关键问题:
- 缺少循环逻辑:
shell任务未使用loop遍历找到的CSR文件,无法逐个处理目标文件。 - 变量引用错误:
cmd中同时传入{{ csr }}(整个find结果对象)和{{ item.path }},前者会输出冗余结构内容,导致命令解析错误。 - 缩进与符号问题:
set_fact的变量定义未正确缩进,且使用了中文引号“/‘,会导致Ansible无法正确解析变量。 - 不必要的basename处理:提取文件名而非完整路径,OpenSSL无法定位到文件实际位置。
修正后的Playbook
- name: Find CSR files ansible.builtin.find: paths: /etc/cert_dir/workstations file_type: file patterns: "*.csr" recurse: yes register: csr_result - name: Extract full CSR file paths set_fact: csr_files: "{{ csr_result.files | map(attribute='path') | list }}" - name: Debug found CSR files debug: msg: "Located CSR files: {{ csr_files }}" - name: Verify CSR files with OpenSSL ansible.builtin.shell: cmd: openssl req -text -noout -verify -in {{ item }} loop: "{{ csr_files }}" register: openssl_verify_results - name: Print verification outputs debug: msg: "{{ item.stdout_lines }}" loop: "{{ openssl_verify_results.results }}"
修正说明
- 变量命名优化:将
register结果命名为csr_result,避免与后续变量混淆,提升可读性。 - 保留完整路径:直接提取文件的完整路径存入
csr_files,确保OpenSSL能准确定位文件。 - 添加循环逻辑:通过
loop: "{{ csr_files }}"实现对每个CSR文件的逐个处理。 - 修复符号与缩进:替换所有中文引号为英文引号,修正
set_fact的缩进问题,确保变量正确定义。 - 新增结果输出:添加任务打印OpenSSL的验证结果,方便排查问题。
内容的提问来源于stack exchange,提问作者TR757
相关产品推荐
相关产品推荐

