vermillion
vermillion

Reputation: 85

Loop over YAML files in Ansible

I want to use a loop within a task to include any number of YAML files. Unfortunately it does not define the corresponding variables in the file.

fatal: [localhost]: FAILED! => {"msg": "Mandatory variable 'job_msg'  not defined."}
---
# task file

- name: "Print"
  ansible.builtin.debug:
    msg: "{{ item.job_msg | mandatory }} \n
          {{ item.job_msg2 | mandatory }}"
  loop: "{{ q('fileglob', 'tower_job_templates/*') | flatten(levels=1) }}"

---
# job1 file

  job:
    - job_msg: "a1"
      job_msg2: "a1s"

    - job_msg: "b1"
      job_msg2: "b1s"

---
# job2 file

  job:
    - job_msg: "a2"
      job_msg2: "a2s"

    - job_msg: "b2"
      job_msg2: "b2s"

Upvotes: 1

Views: 3680

Answers (1)

Vladimir Botka
Vladimir Botka

Reputation: 67984

You'll have to create the list first, e.g.

    - name: "Concatenate jobs"
      ansible.builtin.set_fact:
        jobs: "{{ jobs|d([]) + (lookup('file', item)|from_yaml).job }}"
      loop: "{{ q('fileglob', 'tower_job_templates/*') | flatten(levels=1) }}"

gives

  jobs:
  - job_msg: a2
    job_msg2: a2s
  - job_msg: b2
    job_msg2: b2s
  - job_msg: a1
    job_msg2: a1s
  - job_msg: b1
    job_msg2: b1s

Then use this list, e.g.

- name: "Print"
  ansible.builtin.debug:
    msg: "{{ item.job_msg | mandatory }} \n
          {{ item.job_msg2 | mandatory }}"
  loop: "{{ jobs }}"

Upvotes: 2

Related Questions