ansible include_if_exists

Ger*_*rry 2 file-io yaml configurationmanager include ansible

如果文件存在,我正在寻找一种有条件地将文件包含在 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
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*dim 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-encourage-reuse