Magic Variables
Bu değişkenler sayesinde, bir host üzerinde tanımlanmış değişkeni başka bir host’tan okumak, belli bir grubun tüm üyelerini listelemek veya envanterdeki host’un ismine ulaşmak gibi “normalde” basit yollarla yapılamayan işlemleri gerçekleştirebilirsiniz.
1. Neden Magic Variables?
Daha önce öğrenmiş olabileceğiniz gibi, Ansible normalde her host’a ayrı bir “alt süreç” (subprocess) açar ve o host’a tanımlanan değişkenler sadece o host içinde geçerli olur. Örneğin, web2’de tanımlanan dns_server=10.5.5.4 değeri, normal koşullarda web1 veya web3’te tanımsız olur. Peki diğer host’lar bu değere ihtiyaç duyarsa ne yapacağız?
Magic variables burada devreye girer ve başka host’ların değişken ve fact bilgilerine erişme, bir grubun üyelerini listeleme gibi özel işlemleri mümkün kılar.
2. hostvars – Başka Bir Host’taki Değişkenleri Okumak
hostvars – Başka Bir Host’taki Değişkenleri Okumak2.1 Nasıl Çalışır?
hostvars adındaki sihirli değişken, tüm host’ların değişkenlerini (envanterde tanımlı veya gather_facts ile elde edilen bilgileri) bir sözlük (dictionary) biçiminde tutar. Yani:
hostvars["web2"]["dns_server"]ya da
hostvars["web2"].dns_serverile web2 host’una ait dns_server değişkenine erişirsiniz.
Örnek Envanter:
web1 ansible_host=192.168.56.101
web2 ansible_host=192.168.56.102 dns_server=10.5.5.4
web3 ansible_host=192.168.56.103Örnek Playbook:
- name: Print DNS server of web2 from all hosts
hosts: all
tasks:
- debug:
msg: "web2's DNS = {{ hostvars['web2'].dns_server }}"Bu playbook’u çalıştırdığınızda,
web1,web2,web3üzerinde her biri “web2’nin dns_server değeri 10.5.5.4” diye çıktı verir.Çünkü
hostvarssihirli değişkeni, normalde “kendi host” dışında olanweb2değişkenlerini de almamıza izin verir.
2.2 Diğer Bilgiler (ansible_facts)
hostvars["web2"].ansible_facts altında, web2 host’unda gather_facts ile toplanan CPU, disk, mount, network vb. bilgileri de bulabilirsiniz. Örnek:
hostvars["web2"].ansible_facts.processor
hostvars["web2"].ansible_facts.architecture3. groups – Bir Grubun Tüm Host’larını Listelemek
groups – Bir Grubun Tüm Host’larını ListelemekEnvanterdeki [web_servers], [db_servers] gibi grupların hangi host’lara sahip olduğunu groups sihirli değişkeni ile görebilirsiniz:
- name: Show members of 'web_servers' group
hosts: all
tasks:
- debug:
msg: "{{ groups['web_servers'] }}"Çıktıda mesela ["web1", "web2", "web3"] gibi bir liste dönecektir.
4. group_names – Mevcut Host’un Üye Olduğu Gruplar
group_names – Mevcut Host’un Üye Olduğu GruplarHangi host üzerinde komut çalışıyorsa, o host’un üye olduğu grupları öğrenmek için group_names değişkeni kullanabilirsiniz:
- name: Show which groups I'm in
hosts: web1
tasks:
- debug:
var: group_namesEğer web1, [web_servers] ve [americas] gibi iki gruba üyeyse, group_names değeri ["web_servers", "americas"] olur.
5. inventory_hostname – Envanterdeki Host İsmi
inventory_hostname – Envanterdeki Host İsmiBu sihirli değişken, envanter dosyasında o host için kullandığınız takma ad (alias) veya kısa ismi döndürür. Örneğin envanterde:
web1 ansible_host=192.168.56.101varsa, inventory_hostname “web1” olur.
Bazen bu, gerçek sunucu adı veya FQDN’den farklı olabilir (ansible_host ile IP veya FQDN verirsiniz). Örnek kullanım:
- name: Show my inventory hostname
hosts: web1
tasks:
- debug:
msg: "My inventory name is {{ inventory_hostname }}"hostvars: Başka bir host’un envanter değişkenlerini ve facts bilgilerini okumanızı sağlar.groups: Bir grup adını (“web_servers” vb.) verirsiniz, size o gruptaki host listesini döndürür.group_names: Mevcut host, hangi gruplara üye?inventory_hostname: Envanterdeki takma ad (alias). Gerçek IP veya FQDN’den farklı olabilir.Daha fazlası da var:
ansible_play_hosts,ansible_play_batchvb.
Bu “sihirli değişkenler”, normalde “kendi host’u dışında tanımsız” olan bilgilere paylaşım yapmamızı ya da envanterin grup/host yapısını dinamik şekilde kullanmamızı sağlar. Böylece karmaşık senaryolarda “web2 sunucusunun IP’sini web1’de kullanmam gerek” gibi ihtiyaçlar karşılanır.
6. Diğer Magic Variables
ansible_play_hosts: Mevcut play’de hala aktif olan host’ların listesi.ansible_play_batch: “Bölümler” halinde çalışıyorsanız (ör. serial veya batch), o anki batch’te bulunan host’ların listesi.ansible_playbook_python: Ansible komutunu çalıştırmak için kullanılan Python yolunu verir.
Örnek Playbook
---
- name: Demo Magic Variables
hosts: all
serial: 2 # Bu sayede 'batch' mantığını görebiliriz (2 host birden)
gather_facts: no
tasks:
- name: Show ansible_play_hosts
debug:
var: ansible_play_hosts
- name: Show ansible_play_batch
debug:
var: ansible_play_batch
- name: Show ansible_playbook_python
debug:
var: ansible_playbook_pythonNasıl Çalışır?
hosts: all: Envanterdeki tüm host’ları hedefliyoruz.serial: 2: Ansible, host’ları 2’şerli gruplar halinde çalıştıracak. Dolayısıyla “batch” dediğimiz kavram devreye girecek.
Görevler:
debug: var=ansible_play_hostsBu sihirli değişken, mevcut play’deki tüm host’ların listesidir.
Örneğin 4 host’unuz varsa (
web1,web2,db1,db2),ansible_play_hostslistesi["web1", "web2", "db1", "db2"]olabilir.
debug: var=ansible_play_batchBu, o anki “batch”te bulunan host’ların listesi.
serial: 2kullandığımız için, ilk batch’te belki["web1", "web2"], ikinci batch’te["db1", "db2"]şeklinde çalışabilir.Her batch tamamlandıktan sonra diğer batch devreye girer ve o sırada
ansible_play_batchdeğişir.
debug: var=ansible_playbook_pythonAnsible komutunun kullandığı Python yorumlayıcısının tam yolunu verir.
Örneğin
/usr/bin/python3gibi bir output alabilirsiniz.
Örnek Çıktı (Temsili):
İlk batch (örneğin web1, web2):
TASK [Show ansible_play_hosts] ***********************************************
ok: [web1] => {
"ansible_play_hosts": [
"web1",
"web2",
"db1",
"db2"
]
}
ok: [web2] => {
"ansible_play_hosts": [
"web1",
"web2",
"db1",
"db2"
]
}
TASK [Show ansible_play_batch] ***********************************************
ok: [web1] => {
"ansible_play_batch": [
"web1",
"web2"
]
}
ok: [web2] => {
"ansible_play_batch": [
"web1",
"web2"
]
}
TASK [Show ansible_playbook_python] ******************************************
ok: [web1] => {
"ansible_playbook_python": "/usr/bin/python3"
}
ok: [web2] => {
"ansible_playbook_python": "/usr/bin/python3"
}İkinci batch (örneğin db1, db2):
TASK [Show ansible_play_hosts] ***********************************************
ok: [db1] => {
"ansible_play_hosts": [
"web1",
"web2",
"db1",
"db2"
]
}
ok: [db2] => {
"ansible_play_hosts": [
"web1",
"web2",
"db1",
"db2"
]
}
TASK [Show ansible_play_batch] ***********************************************
ok: [db1] => {
"ansible_play_batch": [
"db1",
"db2"
]
}
ok: [db2] => {
"ansible_play_batch": [
"db1",
"db2"
]
}
TASK [Show ansible_playbook_python] ******************************************
ok: [db1] => {
"ansible_playbook_python": "/usr/bin/python3"
}
ok: [db2] => {
"ansible_playbook_python": "/usr/bin/python3"
}Ek Bilgiler
ansible_play_hostsvsansible_play_batchansible_play_hosts: Bu play’de genel olarak hedeflenen tüm host’ların listesidir. Batch ayarından bağımsız herkes yer alır.ansible_play_batch: Anlık olarak işlem gören host’lar (ör.serial: 2ile 2’şerli gruplar).
ansible_playbook_pythonAnsible hangi Python yorumlayıcısı ile çalışıyorsa onun yolunu döndürür (sistem genelinde
/usr/bin/python3, sanal ortamdaysa başka bir yol vb.).
Farklı Ayarlar
serialveyabatch_sizegibi ayarları yoksa,ansible_play_batchçoğu zamanansible_play_hostsile aynı olur (tüm hostlar tek batch).
Kullanım Senaryoları
ansible_play_hosts→ Koşullar (when) veya döngü (loop) oluştururken “Play’deki tüm host’ların adına göre bir işlem yapma” gibi senaryolarda.ansible_play_batch→ Paralel işlemlerde, “anlık” partiyi hedefleyen advanced senaryolarda.ansible_playbook_python→ Belirli bir Python path’ini bilmek veyacommandmodülünde “hangi Python ile” bazı script’leri çalıştırmak istediğinizi kontrol etmek için kullanılabilir.
Bu şekilde, ansible_play_hosts, ansible_play_batch ve ansible_playbook_python gibi sihirli değişkenlerin nasıl çalıştığına dair net bir örnek ve senaryo görmüş oldunuz.
Last updated
Was this helpful?