AnsiblePilot — Master Ansible Automation

AnsiblePilot is the leading resource for learning Ansible automation, DevOps, and infrastructure as code. Browse over 1,400 tutorials covering Ansible modules, playbooks, roles, collections, and real-world examples. Whether you are a beginner or an experienced engineer, our step-by-step guides help you automate Linux, Windows, cloud, containers, and network infrastructure.

Popular Topics

About Luca Berton

Luca Berton is an Ansible automation expert, author of 8 Ansible books published by Apress and Leanpub including "Ansible for VMware by Examples" and "Ansible for Kubernetes by Example", and creator of the Ansible Pilot YouTube channel. He shares practical automation knowledge through tutorials, books, and video courses to help IT professionals and DevOps engineers master infrastructure automation.

How to Check if a File Exists in Ansible (4 Methods)

By Luca Berton · Published 2024-01-01 · Category: database-automation

How to check if a file exists in Ansible using stat module, when conditional, and find module. Complete guide with playbook examples for file existence checks.

How to Check if a File Exists in Ansible (4 Methods)

Checking whether a file exists before taking action is one of the most common patterns in Ansible. Here are four methods, from simplest to most flexible.

See also: Ansible stat Module: Check File Properties and Existence (Complete Guide)

- name: Check if config file exists
  ansible.builtin.stat:
    path: /etc/myapp/config.yml
  register: config_file

- name: Copy default config if missing
  ansible.builtin.copy:
    src: default-config.yml
    dest: /etc/myapp/config.yml
  when: not config_file.stat.exists

Method 2: stat with Multiple Properties

- name: Check file details
  ansible.builtin.stat:
    path: /opt/myapp/data.db
  register: db_file

- name: Fail if file is missing or empty
  ansible.builtin.assert:
    that:
      - db_file.stat.exists
      - db_file.stat.size > 0
    fail_msg: "Database file is missing or empty!"

- name: Show file info
  ansible.builtin.debug:
    msg: "File size: {{ db_file.stat.size }}, Owner: {{ db_file.stat.pw_name }}"
  when: db_file.stat.exists

See also: Ansible Check If Directory Exists: stat Module Guide

Method 3: find Module (Multiple Files)

- name: Find all backup files
  ansible.builtin.find:
    paths: /backup
    patterns: '*.sql.gz'
    age: -1d
  register: recent_backups

- name: Alert if no recent backups
  ansible.builtin.fail:
    msg: "No backups found from the last 24 hours!"
  when: recent_backups.matched == 0

Method 4: creates/removes Parameters

Some modules have built-in file existence checks:

- name: Run migration only if not already done
  ansible.builtin.command: /opt/myapp/migrate.sh
  args:
    creates: /opt/myapp/.migrated

- name: Clean up only if temp file exists
  ansible.builtin.command: rm -rf /tmp/build-artifacts
  args:
    removes: /tmp/build-artifacts

See also: Ansible win_stat: Check if File or Directory Exists on Windows (Examples)

Check if Directory Exists

- name: Check directory
  ansible.builtin.stat:
    path: /opt/myapp
  register: app_dir

- name: Handle based on type
  ansible.builtin.debug:
    msg: "Is directory: {{ app_dir.stat.isdir | default(false) }}"
  when: app_dir.stat.exists

Check Remote vs Local File

# Check on remote host (default)
- name: Check remote file
  ansible.builtin.stat:
    path: /etc/nginx/nginx.conf
  register: remote_file

# Check on control node
- name: Check local file
  ansible.builtin.stat:
    path: files/nginx.conf
  register: local_file
  delegate_to: localhost

FAQ

What is the best way to check if a file exists in Ansible?

Use ansible.builtin.stat with register, then check result.stat.exists in a when conditional. This is the standard, idempotent approach.

Can I check if a file exists on the Ansible control node?

Yes. Add delegate_to: localhost to the stat task to check files on the control node instead of the remote host.

How do I check if a file exists and is not empty?

Use stat and check both result.stat.exists and result.stat.size > 0 in your conditional.

Method Comparison

MethodUse CaseReturnsIdempotent
ansible.builtin.statCheck any file attributeFull stat infoYes
when: file is existsSimple Jinja2 testBooleanYes
ansible.builtin.findSearch for files by patternList of filesYes
ansible.builtin.command: test -fQuick shell checkReturn codeNo

Complete Example: Conditional Configuration

- name: Deploy config based on file existence
  hosts: all
  become: true
  tasks:
    - name: Check if custom config exists
      ansible.builtin.stat:
        path: /etc/myapp/custom.conf
      register: custom_config

    - name: Deploy default config (only if custom doesn't exist)
      ansible.builtin.template:
        src: default.conf.j2
        dest: /etc/myapp/custom.conf
        owner: root
        group: root
        mode: '0644'
      when: not custom_config.stat.exists

    - name: Backup existing config before changes
      ansible.builtin.copy:
        src: /etc/myapp/custom.conf
        dest: /etc/myapp/custom.conf.bak
        remote_src: true
      when: custom_config.stat.exists

Check Multiple Files

    - name: Check if required files exist
      ansible.builtin.stat:
        path: "{{ item }}"
      register: required_files
      loop:
        - /etc/ssl/certs/server.crt
        - /etc/ssl/private/server.key
        - /etc/myapp/config.yml

    - name: Fail if any required file is missing
      ansible.builtin.fail:
        msg: "Missing required file: {{ item.item }}"
      loop: "{{ required_files.results }}"
      when: not item.stat.exists

FAQ

Which method is best for checking file existence?

ansible.builtin.stat is the most versatile — it provides file size, permissions, timestamps, and more. Use it when you need file attributes beyond existence.

Can I check if a file exists on the control node?

Yes. Use delegate_to: localhost or ansible.builtin.stat with connection: local:

- name: Check local file
  ansible.builtin.stat:
    path: /local/path/file.txt
  delegate_to: localhost
  register: local_file

How do I check if a directory exists?

Use ansible.builtin.stat and check stat.isdir:

- name: Check directory
  ansible.builtin.stat:
    path: /var/log/myapp
  register: dir_check

- name: Create if missing
  ansible.builtin.file:
    path: /var/log/myapp
    state: directory
  when: not dir_check.stat.exists

Category: database-automation

Browse all Ansible tutorials · AnsiblePilot Home