Use variables to retrieve the results of running commands
Ansible’da bir komut veya görev çalıştırdığımızda, çoğu zaman çıktısını (output) görmek veya daha sonrasında bu veriyi başka bir göreve girdi olarak kullanmak isteriz. Bunu yapmak için Ansible bize register adlı bir direktif sunar. Bu sayede komut sonuçlarını bir değişkene kaydedip istediğimiz zaman kullanabiliriz.
1. Neden Register Kullanıyoruz?
Bir komutun çıktılarını başka bir adımda kullanmak isteyebiliriz. Örneğin,
/etc/hosts
dosyasının içeriğini okuyup sonra dosyayı kontrol etmek veya içindeki veriye göre başka işlemler yapmak isteyebiliriz.Başka bir örnekte, bir komutun dönüş kodunu (return code) inceleyip, 0 mı değil mi diye bakıp koşullu bir işlem (örneğin
when:
ifadesi ile) gerçekleştirebiliriz.
Kısacası, register
değişkeni sayesinde Ansible’ın her bir host üzerinde çalıştırdığı komutların detaylarına erişebiliyor ve bu bilgileri sonraki adımlarda (tasks) kullanarak dinamik bir yapı kurabiliyoruz.
2. Basit Bir Örnek: /etc/hosts
Dosyasını Okumak
/etc/hosts
Dosyasını OkumakAşağıdaki basit playbook örneğinde, her bir host üzerinde cat /etc/hosts
komutu çalıştırılıp, çıktı bir değişkene kaydedilir. Sonrasında debug
modülüyle ekrana bastırılır.
Çalışma sırası:
shell: cat /etc/hosts
komutu her bir host üzerinde çalışır.Komutun çıktısı
result
adlı bir değişkene kaydedilir.debug
modülü ileresult
değişkeni ekrana bastırılır.
Bu çalıştığında, Ansible bize result
altında komutun çıktısını, dönüş kodunu (rc
), komutun ne kadar sürdüğünü (delta
) ve benzeri detayları gösterecektir.
3. result
Değişkeninin İçeriğini Anlamak
result
Değişkeninin İçeriğini Anlamakregister
edilen değişken, genellikle JSON benzeri bir sözlük (dictionary) yapısına sahiptir. Aşağıdakiler sıkça kullanılan alanlardır:
stdout: Komutun standart çıktısı (tek bir metin bloğu halinde).
stdout_lines: Komutun standart çıktısının satır satır dizisi.
stderr: Hata çıktılarını barındırır.
stderr_lines: Hata çıktılarının satır satır dizisi.
rc: Komutun dönüş kodu. 0 ise başarı, 0 değilse hata/sorun olduğunu gösterir.
start, end, delta: Komutun ne zaman başlayıp bittiğini ve kaç saniye sürdüğünü gösterir.
Playbook’taki debug: var: result
ile çıktıyı inceleyip hangi alana ihtiyacınız olduğunu görebilirsiniz.
4. İçeriğin Belirli Kısımlarına Erişmek
Bazen bütün bilgiyi değil, sadece belli kısımları almak isteriz. Bu durumda debug
’ta direkt olarak istediğimiz alana erişebiliriz.
Bu şekilde çıktıda sadece stdout
bilgisi (yani /etc/hosts
içeriği) gözükecektir. Aynı mantıkla:
veya
kullanabilirsiniz.
5. Kayıtlı Değişkenlerin Kapsamı (Scope)
Önceki derslerden hatırlayacağınız gibi, Ansible’da kayıtlı değişkenler host kapsamındadır (host scope). Yani bir görev, web1
üzerinde çalışıyorsa result
sadece web1
için geçerlidir. Başka bir host (web2
gibi) üzerinde aynı değişken farklı bir değere sahip olabilir.
Ek olarak, playbook’un aynı koşum (run) süresince aynı host üzerinde sonraki görevlerde de result
değerine erişebilirsiniz. Yeter ki aynı playbook içinde kalınmış olsun.
6. Birden Fazla Play’de Kullanım
Eğer playbook’unuzda birden fazla play
tanımladıysanız, her iki play’de de aynı host’lar yer alıyorsa, Ansible aynı “host scope” değişkenlerini tutmaya devam eder. Dolayısıyla bir play’de kaydettiğiniz result
, aynı playbook içindeki bir sonraki play’de de kullanılabilir.
Örnek:
Burada “Second Play” kısmında da result.rc
değerine erişilebilmekte. Tabii bu, aynı playbook içindeki aynı host olduğu için geçerlidir.
Playbook’ları -v
(verbose) seçeneğiyle çalıştırırsanız (örn. ansible-playbook playbook.yml -v
), birçok detayı ekstra herhangi bir debug
satırı yazmaya gerek kalmadan görebilirsiniz. Daha ayrıntılı çıktılar için -vv
veya -vvv
gibi ek düzeyler de kullanabilirsiniz.
Last updated
Was this helpful?