如何实现Ansible uri模块循环处理目录文件调用PUT API?
解决方法
直接用以下Playbook即可实现需求,核心是正确提取find模块返回的文件属性,结合lookup读取文件内容:
- name: 批量调用Pipeline API hosts: localhost tasks: - name: 查找目标目录下的JSON文件 ansible.builtin.find: paths: /app/pipelines patterns: "pipeline-*.json" file_type: file register: pipeline_files - name: 循环发起PUT请求 ansible.builtin.uri: # 用文件名(去掉.json后缀)拼接API路径,根据你的实际接口调整 url: "https://your-api-domain/api/pipelines/{{ item.basename | regex_replace('\\.json$', '') }}" method: PUT # 直接读取文件内容作为请求体 body: "{{ lookup('file', item.path) }}" body_format: json status_code: 200 headers: Content-Type: application/json # 遍历find找到的所有文件 loop: "{{ pipeline_files.files }}" # 避免无匹配文件时执行空循环 when: pipeline_files.files | length > 0
关键说明
find模块返回的pipeline_files.files列表中,每个元素包含path(文件完整路径)和basename(纯文件名,如pipeline-prod.json)两个核心属性,直接调用即可获取你需要的文件名- 用
regex_replace('\\.json$', '')可以去掉文件名的.json后缀,如果你的API路径不需要后缀可以加上,不需要则直接用item.basename lookup('file', item.path)会直接读取对应文件的原始内容,确保请求体是正确的JSON格式- 如果是在远程主机执行,要确保
/app/pipelines目录在远程主机上,或者根据实际情况调整delegate_to参数
内容的提问来源于stack exchange,提问作者Hamdi Charef
相关产品推荐
相关产品推荐

