2

如果文件存在,我正在寻找一种有条件地在 Ansible 播放中包含文件的方法。如果文件不存在,不幸的是,使用“include”会引发致命错误。我正在遍历一堆包并安装它们,我想检查每个包的可选配置文件。请参见下面的简化示例:

---
- name: Basic setup of an Ubuntu box
  hosts: all
  vars:
    packages:
      - ack-grep
      - vim
      - zsh
      - htop
      - openssh-server
      - cowsay
  tasks:
    - name: Run package configuration
      action: apt name=$item
      include: "packages/${item}.yml"
      with_items: $packages

一旦脚本试图包含一个不存在的文件,它就会停止并出现错误。我确定我只是想以错误的方式做某事,但我已经做了几个小时并尝试了我能想到的一切,但没有结果。

4

4 回答 4

5

你不应该这样做,因为它在https://github.com/ansible/ansible/issues/2726上描述了特别看一下这个评论:

是的 include + with_items 不是人们应该使用的东西。

我们不应该记录它。

虽然我知道您现在在变量中有特定的结构,但最好在任务中使用 with_items 。

它不适用于库存变量,所以这就是为什么你想在你的任务/角色中放置循环。

Ansible 1.5 甚至不支持它。如果你尝试运行它,你会得到这个错误:

错误:[已弃用]:include + with_items 是已删除的弃用功能。请更新您的剧本。Ansible 未能成功完成。任何错误输出都应该在上面可见。请修复这些错误,然后重试。

在你的剧本中包含其他变量和任务的最佳使用方法是使用角色。看看http://docs.ansible.com/playbooks_roles.html#task-include-files-and-encouraging-reuse

于 2014-03-13T01:54:04.350 回答
1

我个人使用

- include: ...
  when: condition

因此,您可以根据某个 var 是 true 还是 false 或设置等来调整您的包含。这些 var 甚至可以在库存文件中设置。

于 2014-07-25T09:53:53.993 回答
1

我正在使用 Ansible 版本 2.9.20

---
- name: Basic setup of an Ubuntu box
  hosts: all
  vars:
    packages:
      - ack-grep
      - vim
      - zsh
      - htop
      - openssh-server
      - cowsay
  tasks:
    - name: check if file exists
      local_action: stat path=packages/{{ item }}.yml
      with_items: "{{ packages }}"
      register: check_file

    - name: Run package configuration
      action: apt name={{ item.item }}
      with_items: "{{ check_file.results }}"
      when: item.stat.exists

在这里,我在一个剧本中创建了 2 个任务:

  • 任务 1 将检查文件是否存在并将输出提供给check_file变量,该变量将在第二个任务中读取以执行操作。
  • 任务 2 将根据文件状态执行操作,即,如果文件存在则执行操作,否则不执行操作。
于 2021-08-03T13:59:55.053 回答
0

'include' 是一个任务,用于包含戏剧、角色或更多任务而不是数据文件。任务也必须单独执行(- 块)。如上所述,您需要使用“vars_files”来包含带有变量的文件,以便在播放中使用。

于 2013-08-29T19:07:37.573 回答