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

Aş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.

- name: Check /etc/hosts file
  hosts: all
  tasks:
    - shell: cat /etc/hosts
      register: result  # <--- Komutun çıktısı "result" değişkenine kaydedilir

    - debug:
        var: result

Çalışma sırası:

  1. shell: cat /etc/hosts komutu her bir host üzerinde çalışır.

  2. Komutun çıktısı result adlı bir değişkene kaydedilir.

  3. debug modülü ile result 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

register 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.

- name: Check /etc/hosts file
  hosts: all
  tasks:
    - shell: cat /etc/hosts
      register: result

    - debug:
        var: result.stdout

Bu şekilde çıktıda sadece stdout bilgisi (yani /etc/hosts içeriği) gözükecektir. Aynı mantıkla:

- debug:
    var: result.stderr  # Hata mesajlarını ekrana yazdırır

veya

- debug:
    var: result.rc      # Komutun dönüş kodunu ekrana yazdırır

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:

- name: Check /etc/hosts file
  hosts: all
  tasks:
    - shell: cat /etc/hosts
      register: result

    - debug:
        var: result.rc

- name: Second Play
  hosts: all
  tasks:
    - debug:
        var: result.rc

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?