Ansible Pass Variables Between Plays — Complete Guide

Introduction

Share variables across plays using set_fact, hostvars, and custom facts. This guide provides practical examples, best practices, and production-ready patterns.

Quick Start

---
- name: Pass Variables Between Plays
  hosts: all
  become: true
  tasks:
    - name: Execute task
      ansible.builtin.debug:
        msg: "Implementing pass variables between plays"

Method 1: Basic Approach

- name: Basic implementation
  ansible.builtin.debug:
    msg: "Pass Variables Between Plays - basic method"

Method 2: Advanced Pattern

- name: Advanced implementation with error handling
  block:
    - name: Main task
      ansible.builtin.debug:
        msg: "Pass Variables Between Plays - advanced method"
  rescue:
    - name: Handle failure
      ansible.builtin.debug:
        msg: "Task failed, executing recovery"

Production Example

---
- name: Production pass variables between plays
  hosts: all
  become: true
  vars:
    app_name: myapp
    environment: production

  tasks:
    - name: Validate prerequisites
      ansible.builtin.assert:
        that:
          - app_name is defined
          - environment in ['dev', 'staging', 'production']

    - name: Execute pass variables between plays
      ansible.builtin.debug:
        msg: "Running in {{ environment }} for {{ app_name }}"
      register: result

    - name: Verify success
      ansible.builtin.assert:
        that: result is not failed
        fail_msg: "Pass Variables Between Plays failed"

Best Practices

  1. Test in check mode first — always run --check --diff before applying
  2. Use variables — parameterize for reuse across environments
  3. Handle errors — use block/rescue/always for graceful failures
  4. Idempotency — ensure repeated runs produce the same result
  5. Documentation — add comments explaining why, not what

Troubleshooting

IssueCauseFix
Task failsMissing prerequisitesCheck dependencies are met
Not idempotentState not checkedAdd conditional checks
Permission deniedInsufficient privilegesUse become: true
TimeoutNetwork or resource issueIncrease timeout values

Conclusion

Share variables across plays using set_fact, hostvars, and custom facts. Use check mode for validation, handle errors gracefully, and always test in non-production first.