Ansible to execute a task only when multiple files exist

966 Views Asked by At

I want to execute a task only when multiple files exist . if only single file is exist i need to ignore this task. How can i achieve this. Am unable to achieve with the below playbook

---
- name: Standardize
  hosts: test
  gather_facts: false
  vars:
    file_vars:
      - {id: 1, name: /etc/h_cm}
      - {id: 2, name: /etc/H_CM}

  tasks:
    - block:
      - name: Check if both exists
        stat:
          path: "{{ item.name }}"
        with_items: "{{ file_vars }}"
        register: cm_result

      - name: Move both files
        shell: mv "{{ item.item }}" /tmp/merged
        with_items: "{{ cm_result.results }}"
        when: item.stat.exists
2

There are 2 best solutions below

0
On

After check if both exist task, you can add a set fact task like this one:

  - name: set facts
    set_fact:
      files_exist: "{{ (files_exist | default([])) + [item.stat.exists] }}"
    with_items: "{{ cm_result.results }}"

And you change your move files task to:

  - name: Move both files
    debug:
      msg: "{{ item.stat.exists }}"
    with_items: "{{ cm_result.results }}"
    when: false not in files_exist
4
On
You have to specify shell: mv "{{ item.item.name }}" /tmp/merged insted of shell: mv "{{ item.item }}" /tmp/merged


Check the below works?:

- name: Standardize
  hosts: test
  gather_facts: false
  become: yes ## If needed
  vars:
    file_vars:
      - {id: 1, name: /etc/h_cm}
      - {id: 2, name: /etc/H_CM}

  tasks:
    - block:
      - name: Check if both file exists
        stat:
          path: "{{ item.name }}"
        with_items: "{{ file_vars }}"
        register: cm_result

      - debug:
          var: item.stat.exists
        loop: "{{ cm_result.results }}"

      - name: Crate a dummy list
        set_fact:
          file_state: []

      - name: Add true to list if file exists
        set_fact: 
          file_state: "{{ file_state }} + ['{{ item.stat.exists }}']"
        loop: "{{ cm_result.results }}"
        when: item.stat.exists == true

      - name: Move both files
        shell: mv "{{ item.item.name }}" /tmp/merged
        loop: "{{ cm_result.results }}"
        when: file_state|length > 1