仅当文件存在时,Ansible包括任务

Leo*_*lán 31 ansible

我正在尝试仅在文件存在时包含文件.如果我的角色的用户需要,这允许现有"任务/角色"之间的自定义"任务/角色".我找到了这个:

- include: ...
  when: condition
Run Code Online (Sandbox Code Playgroud)

但Ansible文档指出:

"评估所有任务,但条件适用于每项任务" - http://docs.ansible.com/playbooks_conditionals.html#applying-when-to-roles-and-includes

所以

- stat: path=/home/user/optional/file.yml
  register: optional_file
- include: /home/user/optional/file.yml
  when: optional_file.stat.exists
Run Code Online (Sandbox Code Playgroud)

如果包含的文件不存在,则会失败.我想可能还有另一种允许用户将任务添加到现有配方的机制.我不能让用户在我之后添加一个角色,因为他们无法控制订单:他们的角色将在我之后执行.

Dav*_*pka 29

with_first_found条件可以在没有stat或没有的情况下完成local_action.此条件将通过本地文件列表执行任务,item并将set设置为存在的第一个文件的路径.包括skip: truewith_first_found选项会阻止它,如果文件不存在失败.

例:

- hosts: localhost
  connection: local
  gather_facts: false

  tasks:
    - include: "{{ item }}"
      with_first_found:
        - files:
            - /home/user/optional/file.yml
          skip: true
Run Code Online (Sandbox Code Playgroud)

  • 这是 Ansible 的一项隐藏得很好的功能,但却是一项很棒的功能,谢谢!请注意,较新版本的 Ansible 已切换为使用带有“first_found”过滤器的“lookup”。请参阅 https://docs.ansible.com/ansible/latest/plugins/lookup/first_found.html (2认同)

Leo*_*lán 10

感谢你的帮助!在最终尝试所有回复和我自己的问题的代码回到今天的Ansible之后,我正在回答我自己的问题:ansible 2.0.1.0

我的原代码,似乎现在的工作,除了可选的文件我一直在寻找在我的本地机器上,所以我必须贯穿统计local_action并设置become: no为特定的任务,所以ansible不会试图做须藤在我的本地机器和错误:"sudo:需要密码\n"

- local_action: stat path=/home/user/optional/file.yml
  register: optional_file
  become: no
- include: /home/user/optional/file.yml
  when: optional_file.stat.exists
Run Code Online (Sandbox Code Playgroud)


Hel*_*ira 8

在 Ansible 2.5 及更高版本中,可以使用如下测试来完成:

- include: /home/user/optional/file.yml
  when: "'/home/user/optional/file.yml' is file"
Run Code Online (Sandbox Code Playgroud)

更多详细信息:https://docs.ansible.com/ansible/latest/user_guide/playbooks_tests.html#testing-paths

  • 在我的设置(Ansible 2.10)中,需要完整路径,因此为了使其在角色中工作,我必须使用 `when: (role_path, '/templates/', item, '.yml.j2') | join('') 是文件` (3认同)
  • 原则上这看起来不错,**但**请注意,测试始终在本地主机(运行 Ansible 的主机)而不是目标主机上进行评估。这对于这个问题的用例来说很好,但可能不适合其他用例。 (3认同)

小智 6

我使用类似的东西,但对于文件模块,我的诀窍是检查变量定义,尝试类似于:

when: optional_file.stat.exists is defined and optional_file.stat.exists
Run Code Online (Sandbox Code Playgroud)

只有当变量存在时,任务才会运行.