带条件语句的循环

sha*_*lin 8 ansible

Ansible 中是否可以使用带条件语句的循环?我想要的是查找特定文件的路径是否存在。如果存在,则执行循环,并且仅针对该特定文件查看条件语句。下面的代码示例

  - name: File exist
    stat:
      path: <path to the file or directory you want to check>
    register: register_name

- name: Copy file
  copy:
    src: '{{ item }}'
    dest: '<destination path>'
  with_fileglob:
    - ../spring.jar
    - <perform if statement. if register_name.stat.exists, ../info.txt, else dont copy this info.txt >


# ... few other task with loop instead of with_fileglob
Run Code Online (Sandbox Code Playgroud)

β.ε*_*.βε 9

您可以,并且您提供的伪代码接近可行的解决方案。

\n

有一个内联 if 表达式可以让您对列表中的项目进行操作。
\n从那里开始,如果您期望的文件不存在 \xe2\x80\x94 ,您可以创建一个空字符串,因为遗憾的是,您不能使用omitlist 的元素

\n

因为copy带有空元素的 a 会使其失败,所以您现在有两个选择,要么过滤列表以删除空元素,要么使用 a 创建条件来when跳过它们。

\n

这是使用select过滤器过滤空元素的解决方案:

\n
- copy:\n    src: "{{ item }}"\n    dest: /tmp\n  loop: "{{ _loop | select }}"\n  vars:\n    _loop:\n      - ../spring.jar\n      - "{{ \'../info.txt\' if register_name.stat.exists else \'\' }}"\n
Run Code Online (Sandbox Code Playgroud)\n

这是使用条件的解决方案:

\n
- copy:\n    src: "{{ item }}"\n    dest: /tmp\n  loop:\n    - ../spring.jar\n    - "{{ \'../info.txt\' if register_name.stat.exists else \'\' }}"\n  when: "item != \'\'"\n
Run Code Online (Sandbox Code Playgroud)\n