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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:23:05