如何为Ansible Playbook的uri模块配置when条件:仅上传未存在文件
解决方案
要实现仅当文件不存在时才上传的需求,你需要先验证目标服务器上的文件状态,再根据验证结果触发上传操作。具体可以通过两个串联的Ansible任务实现:
1. 前置检查:验证服务器上是否已存在目标文件
先对每个待上传文件发送一个HEAD请求(比GET更高效,仅获取响应头),检查文件是否存在:
- name: Check if file exists on server uri: url: "{{ url }}:{{ port }}/application/{{ item | basename }}" method: HEAD force_basic_auth: yes status_code: [200, 404] # 允许200(文件存在)或404(文件不存在)的状态码,避免任务中断 with_fileglob: "{{ tmp_dir_for_files }}/configs/*" register: file_exists_result loop_control: index_var: file_index # 记录每个循环的索引,方便后续和上传任务的文件一一对应
2. 条件上传:仅当文件不存在时执行上传
在原有的上传任务中添加when条件,判断对应文件的检查结果是否为404(即文件不存在):
- name: Send file to server only if it doesn't exist uri: url: "{{ url }}:{{ port }}/application/{{ item | basename }}" method: POST body: "{{ lookup('file', item) }}" force_basic_auth: yes status_code: 201 body_format: json with_fileglob: "{{ tmp_dir_for_files }}/configs/*" register: code_result until: code_result.status == 201 retries: "{{ uri_retries }}" delay: "{{ uri_delays }}" loop_control: index_var: upload_index # 同样记录索引,关联检查任务的结果 when: file_exists_result.results[upload_index].status == 404
关键细节说明:
- 用
HEAD请求做检查:相比GET请求,它不会下载文件内容,仅验证资源是否存在,能节省带宽和时间。 status_code的设置:明确允许200和404两种状态,确保无论文件是否存在,检查任务都能正常完成,不会报错中断后续流程。loop_control的作用:通过索引变量把检查任务和上传任务的循环项一一绑定,保证每个文件的检查结果对应正确的上传操作。- 修正语法错误:你原代码里的
{{ tmp_dir)_for_files }}存在括号错位问题,上面的代码已修正为{{ tmp_dir_for_files }}。
内容的提问来源于stack exchange,提问作者Giedrius Ramanauskas
相关产品推荐
相关产品推荐

