Ansible: Bloklar Nasıl Kullanılır

Bloklar, Ansible’da görevleri gruplandırmanıza ve koşulların veya yönergelerin ne zaman olacağı gibi ortak öznitelikleri blok içindeki tüm görevlere uygulamanıza olanak tanıyan güçlü bir özelliktir.

Bu, Ansible oyun kitaplarınızı daha okunabilir ve sürdürülebilir hale getirebilir.

Bloklar sayesinde hataları zarif bir şekilde yönetebilir, birden fazla görev için ayrıcalıkları aynı anda artırabilir ve iç içe geçmiş bloklar ile görevleri hiyerarşik olarak düzenleyebilirsiniz.

Bu eğitimde Ansible bloklarının nasıl kullanılacağını pratik örneklerle inceleyeceğiz.

Ansible Bloklarının Temel Sözdizimi

Yanıtlayıcı

- name: Example block
  block:
    - name: Task 1
      ansible.builtin.command: echo "This is task 1"

    - name: Task 2
      ansible.builtin.command: echo "This is task 2"

Bu örnekte, her iki görev de bir blok içinde gruplandırılmıştır. Ne zaman, ne zaman, ne zaman veya kurtarma gibi ortak nitelikleri tüm bloğa uygulayabilirsiniz.

Koşullu Yürütme ile Blokları Kullanma

Bir grup görevi yalnızca belirli bir koşul karşılandığında yürütmek istediğinizi varsayalım. Koşulu her bir göreve ayrı ayrı uygulamak yerine, tüm bloğa uygulayabilirsiniz.

Aşağıdaki içerikle bir playbook oluşturun.

- name: Conditional block example
  hosts: localhost
  vars:
    run_tasks: true
  tasks:
    - name: Execute tasks if condition is met
      block:
        - name: Task 1
          ansible.builtin.command: echo "This is task 1"

        - name: Task 2
          ansible.builtin.command: echo "This is task 2"
      when: run_tasks

Bu kılavuzda, run_tasks adlı bir değişken tanımlayıp true olarak ayarlıyoruz. Ardından, iki görevi gruplamak için bir blok kullanıyoruz. Bloğa when koşulu uygulandığından, her iki görev de yalnızca run_tasks true olduğunda çalışacaktır.

Bu yaklaşım, koşulu her göreve ayrı ayrı uygulamak yerine bloğa bir kez uygulayarak plabooku basitleştirir.

Yukarıdaki playbooku çalıştırın.

ansible-playbook conditional_block_example.yml

Bu, yalnızca run_tasks koşulu doğruysa görev bloğunu çalıştıracaktır.

PLAY [Conditional block example] ***********************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Execute tasks if condition is met] ***************************************
skipping: [localhost]

TASK [Task 1] ******************************************************************
ok: [localhost] => {
    "changed": false,
    "msg": "This is task 1"
}

TASK [Task 2] ******************************************************************
ok: [localhost] => {
    "changed": false,
    "msg": "This is task 2"
}

PLAY RECAP *********************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

Hata İşleme ile Blokları Kullanma

Kurtarma ve her zaman bölümlerini ekleyerek hataları zarif bir şekilde ele almak için blokları kullanabilirsiniz.

Bir oyun kitabı oluşturalım.

- name: Error handling block example
  hosts: localhost
  tasks:
    - name: Block with error handling
      block:
        - name: Task that might fail
          ansible.builtin.command: /bin/false

        - name: Task that won't be executed
          ansible.builtin.command: echo "This won't run"

      rescue:
        - name: Handle the error
          ansible.builtin.command: echo "An error occurred"

      always:
        - name: This always runs
          ansible.builtin.command: echo "This runs always"

Bu kılavuzda, blok bölümü başarısız olabilecek görevleri içerir. Kurtarma bölümü, bloktaki herhangi bir görev başarısız olursa çalıştırılacak görevleri içerir ve her zaman bölümü, başarı veya başarısızlıktan bağımsız olarak çalıştırılacak görevleri içerir.

Bu yapı, hataları zarif bir şekilde yönetmenize ve belirli eylemlerin her zaman gerçekleştirilmesini sağlamanıza olanak tanır.

Şimdi yukarıdaki playbooku çalıştırın.

ansible-playbook error_handling_block_example.yml

Bu, hataları yönetecek ve belirli görevlerin her zaman çalışmasını sağlayacaktır.

PLAY [Error handling block example] ********************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Block with error handling] ***********************************************
fatal: [localhost]: FAILED! => {"changed": false, "cmd": "/bin/false", "rc": 1}

TASK [Handle the error] ********************************************************
ok: [localhost] => {
    "changed": false,
    "msg": "An error occurred"
}

TASK [This always runs] ********************************************************
ok: [localhost] => {
    "changed": false,
    "msg": "This runs always"
}

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=1    ignored=0

Ayrıcalık Yükseltme ile Blokları Kullanma

Birden fazla göreve aynı anda ayrıcalık yükseltme (olma) uygulamak için blokları kullanabilirsiniz.

Aşağıdaki içerikle bir playbook oluşturun.

- name: Privilege escalation block example
  hosts: localhost
  tasks:
    - name: Block with privilege escalation
      block:
        - name: Task 1 as root
          ansible.builtin.command: echo "Task 1 as root"

        - name: Task 2 as root
          ansible.builtin.command: echo "Task 2 as root"
      become: yes

Bu kılavuzda, become: yes yönergesi bloğa uygulandığından, her iki görev de yükseltilmiş ayrıcalıklarla çalışır. Bu, birden fazla görevi farklı bir kullanıcı olarak çalıştırmanız gerektiğinde kullanışlıdır ve ayrıcalık yükseltmesini tüm bloğa uygulayarak gereksiz tekrarları azaltır.

Şimdi bu playbookuı çalıştıralım.

ansible-playbook privilege_escalation_block_example.yml

Bu playbook bloktaki görevleri kök ayrıcalıklarıyla yürütür.

PLAY [Privilege escalation block example] **************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Block with privilege escalation] *****************************************
ok: [localhost] => {
    "changed": false,
    "msg": "Task 1 as root"
}

ok: [localhost] => {
    "changed": false,
    "msg": "Task 2 as root"
}

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

İç içe geçmiş bloklar

Karmaşık görev yapıları oluşturmak için blokları diğer blokların içine yerleştirebilirsiniz. Bu, görevleri mantıksal gruplar halinde düzenlemenize ve hiyerarşinin farklı seviyelerine belirli öznitelikler uygulamanıza yardımcı olabilir.

Bir playbook oluşturun ve aşağıdaki içeriği ekleyin.

- name: Nested blocks example
  hosts: localhost
  tasks:
    - name: Outer block
      block:
        - name: Task in outer block
          ansible.builtin.command: echo "This is in the outer block"

        - name: Inner block
          block:
            - name: Task in inner block
              ansible.builtin.command: echo

Bu kılavuzda, dış blok kendi içinde başka bir blok barındırır. Dış blok, dış blokta olduğunu belirten bir mesajı yankılayan bir göreve sahiptir. İç blok ise dış bloğun içine yerleştirilmiştir ve iç blokta olduğunu belirten bir mesajı yankılayan bir görev içerir.

Yukarıdaki playbooku çalıştırın.

ansible-playbook nested_blocks_example.yml

Aşağıdaki çıktıyı alacaksınız.

PLAY [Nested blocks example] ***************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Outer block] *************************************************************
ok: [localhost] => {
    "changed": false,
    "msg": "This is in the outer block"
}

TASK [Inner block] *************************************************************
ok: [localhost] => {
    "changed": false,
    "msg": "This is in the inner block"
}

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Blokları İşleyicilerle Kullanma

Önceki görev sonuçlarına göre koşullu olarak yürütülmesi gereken görevleri yönetmek için yararlı olabilecek işleyicileri bilgilendirmek için blokları kullanabilirsiniz.

Aşağıdaki içerikle bir playbook oluşturun:

- name: Blocks with handlers example
  hosts: localhost
  tasks:
    - name: Block with handler notification
      block:
        - name: Task that changes something
          ansible.builtin.command: echo "This changes something"
          notify: Restart service

        - name: Another task
          ansible.builtin.command: echo "This is another task"
      notify: Restart service

  handlers:
    - name: Restart service
      ansible.builtin.command: echo "Service restarted"

Bu örnekte, blok iki görev içerir ve her ikisi de işleyici Restart hizmetini bildirir. İşleyici Restart hizmeti, hizmetin yeniden başlatıldığını belirten bir iletiyi yankılayacak şekilde tanımlanmıştır.

Şimdi bu playbooku çalıştırın.

ansible-playbook blocks_with_handlers_example.yml

Bu playbook, işleyicileri bilgilendirmek için blokları kullanır ve böylece belirli görevlerin blok içindeki görevlerin sonuçlarına göre çalışmasını sağlar.

PLAY [Blocks with handlers example] ********************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Block with handler notification] *****************************************
ok: [localhost] => {
    "changed": false,
    "msg": "This changes something"
}

ok: [localhost] => {
    "changed": false,
    "msg": "This is another task"
}

RUNNING HANDLER [Restart service] **********************************************
ok: [localhost] => {
    "changed": false,
    "msg": "Service restarted"
}

PLAY RECAP *********************************************************************
localhost                  : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

 

Yazının orijinalini buradan okuyabilirsiniz.

Hüseyin GÜÇ

Kariyerime 26 yıl önce başladım. Windows ve Linux sistemlerinin kurulumu, yapılandırılması, yönetimi ve bakımı dahil olmak üzere birden fazla sistem üzerinde uzmanlaştım. Açık kaynak dünyasındaki en son gelişmelerden haberdar olmaktan ve Linux hakkındaki en son araçları, özellikleri ve hizmetleri denemekten hoşlanıyorum. Son 6 yıldır  sistem ve ağ yöneticisi olarak görev yapıyorum ayrıca Pardus Dönüşüm Projesini yönetiyorum ve Pardus İşletim Sisteminin yaygınlaşması adına uğraş gösteriyorum. Boş zamanlarımda açık kaynaklı uygulamaların Türkçe çevirisine katılıyorum ve The Document Foundation üyesiyim.