# Magic Variables

Ansible'da her bir sunucu (host) için değişkenler tanımlayabilirsin. Örneğin, bir `web2` adlı sunucun için özel bir DNS sunucusu IP adresi tanımladın. Normal şartlarda bu `dns_server` değişkeni sadece `web2` sunucusu üzerinde çalıştırılan görevler tarafından bilinir ve kullanılabilir. `web1` veya `web3` sunucuları bu bilgiye doğrudan erişemez.

İşte tam bu noktada **Magic Variables** devreye giriyor! 🪄

### Magic Variables Nedir?

**Magic Variables**, Ansible'ın sana sunduğu, önceden tanımlanmış ve her zaman erişebileceğin özel değişkenlerdir. Bu değişkenler, playbook çalışırken Ansible'ın kendisi tarafından otomatik olarak doldurulur. En büyük faydalarından biri, bir sunucunun başka bir sunucuya ait bilgilere veya genel envanter yapısına dair verilere ulaşmasını sağlamaktır.

Ansible bir playbook başlattığında her bir host için ayrı işlemler (sub-processes) oluşturur. Normalde her işlem sadece kendi host'una ait değişkenleri bilir. Magic variables bu sınırları aşmamızı sağlar.

### En Sık Kullanılan Magic Variables

#### 1. `hostvars`

Bu, belki de en sihirli olanıdır ✨ `hostvars` sayesinde **bir host, envanterdeki başka bir host'un değişkenlerine erişebilir.**

Diyelim ki envanter dosyan (`/etc/ansible/hosts`) şöyle:

```ini
web1 ansible_host=172.20.1.100
web2 ansible_host=172.20.1.101 dns_server=10.5.5.4
web3 ansible_host=172.20.1.102
```

`web2` için bir `dns_server` tanımladık. Şimdi `web1` veya `web3` üzerinden bu bilgiye ulaşmak istersen, playbook'unda şöyle bir ifade kullanırsın:

```yaml
- name: Print DNS server IP from web2
  hosts: all
  tasks:
    - debug:
        msg: "Web2'nin DNS sunucusu: {{ hostvars['web2'].dns_server }}"
```

Bu görev çalıştığında, `web1`, `web2` ve `web3` sunucularının hepsi `web2`'nin `dns_server` değerini (yani `10.5.5.4`) ekrana basacaktır. Harika, değil mi?

Sadece kendi tanımladığın değişkenlere değil, Ansible'ın topladığı **facts** (sunucu hakkındaki bilgiler: işletim sistemi, IP adresi, mimari vb.) bilgilerine de `hostvars` ile erişebilirsin.

Örnek: `{{ hostvars['web2'].ansible_facts.architecture }}` ifadesi `web2` sunucusunun mimarisini (örn: x86\_64) döndürür.

Altyazılarda da belirtildiği gibi, şu iki yazım şekli de aynı sonucu verir:

* `hostvars['web2'].dns_server`
* `hostvars.web2.dns_server` (Eğer host adında özel karakterler yoksa bu daha kısa bir yoldur)

#### 2. `groups`

Bu magic variable, envanterindeki **grupları ve o gruplara dahil olan host'ların bir listesini** verir.

Diyelim ki envanterin şöyle:

```ini
[web_servers]
web1
web2
web3

[db_servers]
db1
```

Playbook'unda `{{ groups['web_servers'] }}` ifadesini kullanırsan, bu sana `['web1', 'web2', 'web3']` listesini döndürür. Ya da `{{ groups['all'] }}` tüm hostları listeler.

Örnek: `americas` grubundaki tüm host'ları yazdırmak için:

```yaml
- debug:
    msg: "{{ groups['americas'] }}"
```

#### 3. `group_names`

Bu değişken, o an görevin çalıştığı **host'un hangi gruplara üye olduğunu** bir liste olarak verir.

Örneğin, `web1` host'u hem `web_servers` hem de `americas` grubuna üye ise, `web1` üzerinde çalışan bir görevde `{{ group_names }}` ifadesi `['web_servers', 'americas']` listesini döndürür.

#### 4. `inventory_hostname`

Bu değişken, o an görevin çalıştığı **host'un envanter dosyasındaki adını** verir. Bu, sunucunun gerçek hostname'i (FQDN) olmak zorunda değildir; envanterde nasıl tanımladıysan o isimdir.

Örneğin, envanterde `webserver_ana` olarak tanımlı bir host varsa, `{{ inventory_hostname }}` ifadesi `webserver_ana` değerini döndürür, sunucunun kendi içindeki `hostname` komutunun çıktısını değil.

***

### Neden Önemliler?

Magic variables, playbook'larını daha dinamik ve esnek hale getirmeni sağlar:

* Bir sunucunun yapılandırmasını, başka bir sunucunun özelliklerine göre ayarlayabilirsin (örneğin, bir web sunucusuna veritabanı sunucusunun IP'sini bildirmek).
* Belirli bir gruptaki tüm sunuculara toplu işlemler yapabilirsin.
* Raporlama ve denetleme için host'lar arası bilgi toplayabilirsin.

Unutma, Ansible dokümantasyonu bu konuda en iyi dostundur. "Magic variables" veya "special variables" olarak arama yaparsan daha fazlasını bulabilirsin.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## 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-advanced/magic-variables.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.
