可能以某种方式在playbook中使用通配符包括(或任何解决方法)?

时间:2017-03-17 16:56:10

标签: ansible

鉴于一个大型剧本也有许多剧本包括,我想有一些抽象的剧本,可以由具体用户定制。那个抽象的剧本不应该对具体的剧本有所了解,但要用一些通配符来包含它们。与OOP中的template method相当的东西。

在Ansible(2.2)中可以为任务包括:

执行此操作
tasks:
  - include: "{{item}}"
  with_fileglob: "dir/*.yml"

不幸的是,不可能为playbook包括:

- include: "{{item}}"
  with_fileglob: "dir/*.yml"

Ansible失败

  

ERROR! 'with_fileglob'不是PlaybookInclude

的有效属性

也许可以使用某种预处理器创建一个包含所有现有文件的文件,但这似乎很容易出错。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

由于目前还没有更好的解决方案,我创建了一个角色来创建这样的包含文件

角色/创建-包括/任务/ main.yml

- template:
    src: include.j2
    dest: "./include-{{inc_dir}}.yml"
  vars:
    idir: "{{inc_dir}}/*"
    fdir: "{{ lookup('fileglob',idir )}}"
    files: "{{ fdir.split(',') if fdir | length > 0 else []}}"

角色/创建-包括/模板/ include.j2

---
- hosts: localhost
  connection: local
  gather_facts: false

  tasks:
   - debug:
      msg: "include playbook"

{% for i in files %}
- include: "{{i}}"

{% endfor %}

然后可以调用它,指定目录:

  roles:
    - {  role: create-include, inc_dir: deploy_tasks }

这将在playbook根目录

中生成包含文件