Ansible File Separation

“Ansible File Separation” konusuna giriyoruz. Hedefimiz: envanteri, değişkenleri ve görevleri (tasks) dosyalara ayırarak daha düzenli, yeniden kullanılabilir bir yapı kurmak.

1. Sorun ne?

Inventory dosyasını şöyle tuttuğunu düşün:

[web_servers]
web1 ansible_host=172.20.1.100 dns_server=10.1.1.5
web2 ansible_host=172.20.1.101 dns_server=10.1.1.5
web3 ansible_host=172.20.1.102 dns_server=10.1.1.5
  • Değişkenler (vars) de burada, host listesi de burada.

  • Sunucu sayısı artınca dosya “çorba” oluyor.

2. Çözüm 1 – host_vars (sunucuya özel değişkenler)

  1. Klasör: host_vars/

  2. Dosya adı: Sunucunun inventordaki ismi (web1, web2, …).

  3. İçerik: YAML (anahtar: değer).

inventory/
├─ hosts          # ana envanter dosyası
├─ host_vars/
   ├─ web1.yml
   ├─ web2.yml
   └─ web3.yml

host_vars/web1.yml:

ansible_host: 172.20.1.100
size: big

Dosya adı web1.yml olmalı ki Ansible “bu değişkenler web1’e ait” diye otomatik eşleştirsin; ekstra ayara gerek yok.

3. Çözüm 2 – group_vars (gruba ortak değişkenler)

Aynı DNS adresi tüm web sunucularında ortaksa:

  1. Klasör: group_vars/

  2. Dosya adı: Grubun adı (web_servers.yml).

inventory/
└─ group_vars/
   └─ web_servers.yml

group_vars/web_servers.yml:

dns_server: 10.1.1.5

→ Böylece ortak değerleri tek noktada tutarsın, kopyala-yapıştır biter.

4. Klasör düzeni önerisi

project/
├─ inventory/
│   ├─ hosts
│   ├─ host_vars/
│   └─ group_vars/
├─ playbooks/
└─ roles/ ...

İstasyondaki her şey (inventory, host_vars, group_vars) inventory dizinine toplanır; playbook dizini tertemiz kalır.

5. Vars dosyası “default” konumda değilse – include_vars

Merkezi bir yol düşün: /opt/apps/common-data/email/info.yml

# info.yml
admin_email: [email protected]

Playbook’ta kullanmak:

- hosts: webservers
  tasks:
    - include_vars:
        file: /opt/apps/common-data/email/info.yml
        name: email_data          # değişken namespace'i

    - mail:
        to: "{{ email_data.admin_email }}"
        subject: "Deploy bitti"
        body: "Web sunucusu hazır"

Ansible çalışma anında dosyayı okuyup email_data sözlüğü içine yükler.

6. Envanteri “son hâliyle” görmek – ansible-inventory -y

ansible-inventory -i inventory/ -y
  • Tüm host & group değişkenlerini öncelik sırasına göre birleştirip YAML basar.

  • “Bu host hangi değeri nereden aldı?” sorusunu debug etmek için süper.

7. Görevleri bölmek – include_tasks

Tek playbook’ta DB + Web kuruyorsun ama bazen sadece DB lazım:

tasks/
├─ db.yml
└─ web.yml

deploy.yml:

- hosts: webservers
  tasks:
    - include_tasks: tasks/db.yml   # sadece DB kur
    - include_tasks: tasks/web.yml  # web de kurulsun

Başka bir playbook yazıp yalnız db.yml’i include edersen saf DB kurulumu elde edersin. Task’lar kopyalanmıyor, “import” ediliyor.

8. Mini rehber – Değişken önceliği (en yüksek aşağıda)

  1. Extra vars (-e "key=val")

  2. Playbook içi vars

  3. Host vars (host_vars/)

  4. Group vars (group_vars/)

  5. Inventory satırı

→ Aynı isimli değişken çakışırsa yüksek öncelikli olan kazanır.

Özet

  • host_vars/<hostname>.yml → O host’a özel değerler

  • group_vars/<groupname>.yml → Gruba ortak değerler

  • include_vars → Değişken dosyası nerede olursa olsun yükle

  • include_tasks → Görev dosyalarını modüler kullan

  • ansible-inventory -y → “Gerçek” envanteri gözden geçir

Last updated

Was this helpful?