Ansible Dry Run未识别前序任务创建资源的报错如何解决
Ansible Dry Run 场景下归档转S3任务报错修复方案
问题根因
Ansible 执行 --check 空跑时,archive 模块仅模拟执行逻辑,不会真实生成目标压缩包。后续 aws_s3 模块在空跑阶段仍会校验本地源文件是否存在,因此触发 Local object for PUT does not exist 报错。
可选修复方案
方案一:适配空跑错误规则,不额外生成文件
修改S3传输任务的报错和状态判定规则,仅忽略空跑场景下的预期源文件不存在错误,其他异常仍会正常抛出,不影响校验准确性:
- name: Compress a directory archive: path: "local/usr/directory" dest: "local/user/directory.tgz" register: registered_directory - name: Transfer archived directory to s3 aws_s3: bucket: "{{ bucket }}" object: "{{ bucket_folder }}/directory.tgz" src: "{{ registered_directory.dest }}" mode: put region: "{{ aws_region }}" register: s3_transfer_result # 仅非空跑场景、或者空跑时非源文件不存在的错误才判定为失败 failed_when: - s3_transfer_result is failed - not (ansible_check_mode and '"Local object for PUT does not exist" in s3_transfer_result.msg') # 空跑场景下捕获到预期错误时,手动标记任务为待执行状态 changed_when: - s3_transfer_result is changed - or (ansible_check_mode and '"Local object for PUT does not exist" in s3_transfer_result.msg')
方案二:空跑时生成临时占位文件
在归档任务后新增空跑专属的占位文件生成逻辑,不需要修改原有S3任务的校验规则,空跑流程完全对齐真实执行逻辑:
- name: Compress a directory archive: path: "local/usr/directory" dest: "local/user/directory.tgz" register: registered_directory # 空跑场景下生成临时占位文件,满足S3模块的源文件校验要求 - name: Generate archive placeholder for dry run file: path: "{{ registered_directory.dest }}" state: touch when: - ansible_check_mode - registered_directory is changed - name: Transfer archived directory to s3 aws_s3: bucket: "{{ bucket }}" object: "{{ bucket_folder }}/directory.tgz" src: "{{ registered_directory.dest }}" mode: put region: "{{ aws_region }}"
真实执行时归档任务会自动覆盖临时生成的占位文件,不会对最终上传的压缩包内容产生影响。
内容的提问来源于stack exchange,提问作者J. Patwary
相关产品推荐
相关产品推荐

