# group_vars and host_vars — Ansible: Automate Servers with Playbooks

Source: https://www.geekswithgeeks.com/en/ansible/var-group-host-vars

> Store variables per group and per host in a clean directory layout.

## Variables next to the inventory

Instead of cramming variables into the inventory file, create **`group_vars/<group>.yml`** and **`host_vars/<host>.yml`** beside it. Ansible loads them automatically. Variables in `group_vars/all.yml` apply everywhere, while `group_vars/web.yml` applies to the `web` group and `host_vars/web1.yml` only to that host. This keeps data separate from logic and makes environment differences easy to see in code review.

## A typical layout

Environment-specific values live in the inventory directory of that environment.

```text
inventories/
  staging/
    hosts.ini
    group_vars/
      all.yml        # app_env: staging
      web.yml        # http_port: 8080
  production/
    hosts.ini
    group_vars/
      all.yml        # app_env: production
      web.yml        # http_port: 80
playbooks/site.yml
roles/...
```

## One playbook, many environments

Run `ansible-playbook -i inventories/staging site.yml` and later `-i inventories/production`. The playbook stays identical; only the data changes.

**Quiz:** Where do you put variables that apply only to the web group?

- [ ] ansible.cfg only
- [x] group_vars/web.yml
- [ ] A random hosts file
- [ ] A comment in the playbook

*Answer:* group_vars/web.yml. Ansible loads group_vars/<group>.yml automatically for hosts in that group.
