我正在归档一个文件,然后将其传输到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 }}"这只是作为预演运行,并且有一个需求,即预演运行需要成功运行才能进行实际构建。但是,在第二步(传输到s3)中,试运行失败,并出现以下错误:
"msg": "Local object for PUT does not exist"我知道在这个时间点上实际的物理tgz对象并不存在,因为这只是一个预演,并且第一个任务实际上并没有被执行。我正在寻找让第二个任务识别它正在使用第一个任务的输出来获取tar文件的方法。有什么方法可以设置这个依赖关系吗?
发布于 2021-11-16 21:48:34
当使用检查模式时,你必须自己决定如何处理这样的情况,其中一个步骤依赖于前一个正在工作的步骤。您有三个基本选项。
即使在检查模式下也要运行第一个任务:
- name: Compress a directory
archive:
path: "local/usr/directory"
dest: "local/user/directory.tgz"
register: registered_directory
check_mode: false在检查模式下跳过第二个任务:
- name: Transfer archived directory to s3
aws_s3:
bucket: "{{ bucket }}"
object: "{{ bucket_folder }}/directory.tgz"
src: "{{ registered_directory.dest }}"
mode: put
region: "{{ aws_region }}"
when: not ansible_check_mode或者在检查模式下忽略第二个任务中的错误:
- name: Transfer archived directory to s3
aws_s3:
bucket: "{{ bucket }}"
object: "{{ bucket_folder }}/directory.tgz"
src: "{{ registered_directory.dest }}"
mode: put
region: "{{ aws_region }}"
ignore_errors: "{{ ansible_check_mode }}"您还可以做更复杂的事情,如更改模块参数,但我认为这与演练的精神相去甚远。
- name: Transfer archived directory to s3
aws_s3:
bucket: "{{ bucket }}"
object: "{{ bucket_folder }}/directory.tgz"
src: "{{ ansible_check_mode | ternary(registered_directory.dest, '/etc/hostname') }}"
mode: put
region: "{{ aws_region }}"https://stackoverflow.com/questions/69994359
复制相似问题