Ansible Dry 运行 未捕获上一个任务中创建的资源

Ansible Dry Run not catching a created resource in a previous task

我正在归档文件,然后将其传输到 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 }}"

这只是运行宁作为干运行,并且干运行需要运行成功才能完成实际构建。但是,dry 运行 在第二步(转移到 s3)中失败并出现以下错误:

"msg": "Local object for PUT does not exist"

我知道实际的物理 tgz 对象在这个时间点不存在,因为这只是一个空 运行 并且第一个任务实际上没有被执行。我正在为第二个任务寻找某种方法来识别它正在使用第一个任务的输出来获取 tar 文件。有什么方法可以设置这种依赖?

在检查模式下工作时,您必须自己决定如何处理这种情况,其中一个步骤取决于前一个步骤是否有效。您有三个基本选项。

运行第一个任务连检查模式:

- 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 }}"