# Ansible Facts

Bu bilgilerle, bir playbook çalıştırıldığında Ansible’ın hedef makineler (host’lar) hakkında nasıl sistem bilgisi topladığını ve bu bilgileri nasıl kullanabileceğinizi öğreneceksiniz.

### 1. Ansible Facts Nedir?

**Ansible Facts**, Ansible’ın her playbook çalıştığında hedef makinelerden (host’lardan) otomatik olarak topladığı sistem bilgileridir. Örneğin:

* İşletim sistemi (distribution, versiyon, vb.)
* Sistem mimarisi (32-bit mi, 64-bit mi?)
* Ağ arayüzleri (ip adresleri, MAC adresleri, vb.)
* Bellek (memory), disk, CPU gibi donanım detayları
* Makinenin tam adı (FQDN), tarih/saat bilgisi, vs.

Bu bilgiler Ansible tarafından, **setup** isimli özel bir modül aracılığıyla toplanır. Her host için ayrı ayrı toplanan bu bilgiler, `ansible_facts` adlı değişkenin içinde saklanır.

### 2. Basit Bir Örnek: `ansible_facts` Değişkenini Yazdırmak

Aşağıdaki örnek playbook’ta sadece `debug` modülüyle `ansible_facts` adlı değişkeni ekrana bastırıyoruz:

```yaml
---
- name: Print Ansible Facts
  hosts: all
  tasks:
    - debug:
        var: ansible_facts
```

**Ne olur?**

1. Playbook başladığında, Ansible **her host** için otomatik olarak **facts** toplar (`TASK [Gathering Facts]`).
2. Sonra `debug` modülü, `ansible_facts` değişkenini ekrana basar.
3. Çıktıda “architecture”, “distribution”, “ansible\_facts.interfaces” gibi pek çok bilgi göreceksiniz.

Örnek Kısa Çıktı:

```bash
"ansible_facts": {
  "distribution": "Ubuntu",
  "distribution_version": "16.04",
  "all_ipv4_addresses": [
    "192.168.56.101"
  ],
  "machine": "x86_64",
  ...
}
```

Bu şekilde, host’un işletim sistemi, IP adresi, donanım bilgisi vb. her şeyi görebilirsiniz.

### 3. Fact Toplama (Gathering Facts) Nasıl ve Neden Otomatik Olur?

Standart Ansible davranışında, playbook’ta **hiçbahsetmeseniz** bile, her host’a ilk bağlandığında bir “setup” görevi çalıştırır. Bu görevin çıktısı `ansible_facts` olarak depolanır. Örneğin:

```yaml
- name: Print hello message
  hosts: all
  tasks:
    - debug:
        msg: "Hello from Ansible!"
```

Playbook’ta tek görev olsa bile, **playbook çıktısında** iki görev görürsünüz:

1. `TASK [Gathering Facts]`
2. `TASK [debug]`

Çünkü Ansible, `setup` modülünü otomatik çağırarak **facts** toplar.

### 4. Facts Kullanarak Dinamik Yapılandırma

Toplanan bu bilgiler, playbook’larınızı **daha akıllı** ve **dinamik** yapmaya yarar. Örneğin:

* **İşletim sistemine göre** paket kurma (“Ubuntu ise `apt`, CentOS ise `yum` kullan” şeklinde).
* **Disklerinizin boyutuna göre** bir mantık.
* **İnterface adlarına göre** ağ ayarları yapma.

Hepsinde `ansible_facts` altındaki verilerden yararlanabilirsiniz.

### 5. Facts’i Kapatmak (gather\_facts: no)

Eğer playbook’ta bu bilgilere **hiç ihtiyacınız yoksa** veya her seferinde toplanması gerekmiyorsa:

```yaml
---
- name: Print hello message without gathering facts
  hosts: all
  gather_facts: no
  tasks:
    - debug:
        var: ansible_facts
```

Bu durumda “`TASK [Gathering Facts]`” aşaması oluşmaz ve `ansible_facts` boş (`{}`) döner. Böylece zaman kazandırabilir, gereksiz network trafiğinden kaçınabilirsiniz.

### 6. Ansible.cfg’deki Ayarlar

`/etc/ansible/ansible.cfg` içinde `gathering` parametresi vardır:

* `implicit` (varsayılan): Otomatik fact toplar. İsterseniz `gather_facts: no` diyerek kapatabilirsiniz.
* `explicit`: Otomatik toplamaz, `gather_facts: yes` demeniz gerekir.
* `smart`: Bir kez toplar, sonra tekrar toplamaz gibi optimize davranış.

**Playbook’taki ayar** (`gather_facts: no` veya `yes`) her zaman konfigürasyondaki değerin üzerindedir (**daha yüksek öncelik**).

### 7. Neden Bazı Host’ların Facts Verisi Yok?

Ansible sadece **playbook’un hedef aldığı host’lar** için fact toplar. Örneğin envanterinizde `web1`, `web2` var ama playbook’u sadece `hosts: web1` derseniz, `web2` için hiç bir facts toplanmaz. Bu nedenle `web2` üzerinde `ansible_facts` “tanımsız” olabilir.

### 8. Özet

* **Facts**, Ansible’ın otomatik topladığı kapsamlı sistem bilgileri (`ansible_facts`).
* **Varsayılan**: Otomatik olarak toplanır (`gather_facts: yes`).
* **Kullanım**: `ansible_facts` içindeki alanlar (ör. `ansible_facts['distribution']`, `ansible_facts.network_interfaces` vb.) ile koşullu mantıklar, dinamik konfigürasyon yapabilirsiniz.
* **Kapatmak**: `gather_facts: no` ile kapatarak performans artırabilirsiniz (host bilgisine gerek yoksa).

Bu şekilde Ansible Facts ile sistemlerinizi **daha akıllı** yöneten playbook’lar hazırlayabilir, **farklı OS/donanım** senaryolarına **dinamik** şekilde uyum sağlayabilirsiniz.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://note.onurbolatoglu.com/ansible-1/ansible-facts.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
