Krever
Krever

Reputation: 1467

Ansible items in separate files

Is it possible to have few .yml files and then read them as separate items for task?

Example:

 - name: write templates
   template: src=template.j2 dest=/some/path
   with_items: ./configs/*.yml

Upvotes: 1

Views: 1037

Answers (2)

Krever
Krever

Reputation: 1467

I have found pretty elegant solution:

---
- hosts: localhost
  vars:
    my_items: "{{ lookup('fileglob', './configs/*.yml',  wantlist=True) }}"
  tasks:
  - name: write templates
    template: src=template.j2 dest=/some/path/{{ (item | from_yaml).name }}
    with_file: "{{ my_items }}"

And then in template you have to add {% set item = (item | from_yaml) %} at the beginning.

Upvotes: 2

udondan
udondan

Reputation: 59979

Well, yes and no. You can loop over files and even use their content as variables. But the template module does not take parameters. There is an ugly workaround by using an include statement. Includes do take parameters and if the template task is inside the included file it will have access to them.

Something like this should work:

- include: other_file.yml parameters={{ lookup('file', item) | from_yaml }}
  with_fileglob: ./configs/*.yml

And in other_file.yml then the template task:

- name: write template
  template: src=template.j2 dest=/some/path

The ugly part here, beside the additional include, is that the include statement only takes parameters in the format of key=value. that's what you see in above task as parameters=.... parameters here has no special meaning, it just is the name of the variable with which the content of the file will be available inside the include.

So if your vars files have a variable foo defined, you would be able to access it in the template as {{ parameters.foo }}.

Upvotes: 1

Related Questions