# Facts About Hosts — Ansible: Automate Servers with Playbooks

Source: https://www.geekswithgeeks.com/en/ansible/var-facts

> Use gathered facts to adapt tasks to each host's operating system and hardware.

## Ansible asks the host about itself

At the start of a play Ansible runs the **`setup` module** and collects **facts** such as `ansible_os_family`, `ansible_distribution`, memory, CPUs and network interfaces. You can use them in tasks and templates, for example to choose `apt` on Debian and `dnf` on Red Hat. Fact gathering takes a little time, so set `gather_facts: false` when you do not need them (as the example playbook does).

## Asking one fact, run

I ran this on this machine; it is a Debian-family system.

```bash
ansible -i inventory.ini web1 -m ansible.builtin.setup -a "filter=ansible_os_family"
```

Output:

```
"ansible_os_family": "Debian",
```

## Using a fact in a task

Choosing the right package manager from a fact keeps one playbook working on both families. (Illustrative; not run here.)

```yaml
- name: Install nginx (Debian family)
  ansible.builtin.apt:
    name: nginx
    state: present
  when: ansible_os_family == "Debian"

- name: Install nginx (Red Hat family)
  ansible.builtin.dnf:
    name: nginx
    state: present
  when: ansible_os_family == "RedHat"
```

**Quiz:** Which module collects facts?

- [x] setup
- [ ] ping
- [ ] copy
- [ ] debug

*Answer:* setup. The setup module gathers facts at the start of a play unless gather_facts is false.
