Ansible: delegate_to Kullanarak Farklı Uzak Sistemlerde Görevleri Çalıştırma 

Varsayılan olarak Ansible, envanterinizde belirttiğiniz uzak sistemlerde görevleri çalıştırır. delegate_to bu davranışı geçersiz kılarak Ansible’a belirli bir ana bilgisayar veya grup üzerinde belirli bir görevi yürütmesi talimatını verir. Bu, bağımlılıklar veya kaynak gereksinimleri nedeniyle belirli bir makinede çalışması gereken görevler için yararlı olabilir.

Ansible’ın delegate_to yönergesi, görev yürütme kontrolünü geçici olarak farklı bir ana bilgisayara kaydırarak çalışır. İşte sürecin bir dökümü:

  • Playbook Execution: Ansible playbook’unuzu, envanterinizde tanımlanan belirli ana bilgisayarları (veya grupları) hedefleyerek çalıştırırsınız.
  • Task Encountered: Playbook, delegate_to yönergesine sahip bir görevle karşılaştığında, Ansible yönergede belirtilen hedef konağı tanımlar.
  • Connection and Delegation: Ansible, uygun bağlantı eklentisini (örneğin, Linux için SSH) kullanarak hedef ana bilgisayarla bağlantı kurar. Daha sonra belirli görev talimatlarını ve gerekli dosyaları hedef ana bilgisayara gönderir.
  • Local Execution on Target Host: Hedef ana bilgisayar, görev talimatlarını ve dosyalarını alır. Daha sonra kendi kaynaklarını ve ortamını kullanarak görevi yerel olarak yürütür.
  • Result Gathering: Görevin hedef ana bilgisayarda yürütülmesi bittiğinde, sonuçlar (başarı/başarısızlık, çıktı) Ansible denetleyici makinesine geri gönderilir.
  • Playbook Resumes: Hedef ana bilgisayardan sonuçları aldıktan sonra Ansible, başlangıçta hedeflenen ana bilgisayarlarda (veya gruplarda) playbook’u yürütmeye devam eder.

Bu yazımızda Ansible delegate_to nasıl kullanılacağını pratik örneklerle anlatacağız.

Önkoşullar

Bu eğitime devam etmek için aşağıdakilere ihtiyacınız olacak:

  • Ansible’ın yüklü ve yapılandırılmış olduğu bir Ansible yönetim düğümü
  • Ansible hedef düğümü.
  • Yönetim düğümü ile hedef düğüm arasında SSH anahtar tabanlı kimlik doğrulaması

delegate_to’in Temel Sözdizimi

Ansible’daki delegate_to parametresi, belirli bir görevin yürütülmesi gereken farklı bir ana bilgisayar belirtmenize olanak tanır. Temel sözdizimi şöyledir:

delegate_to: <host_pattern>

İşte bir döküm:

  • delegate_to: Bu, görevin farklı bir konağa devredilmesi gerektiğini belirtmek için kullanılan anahtar sözcüktür.
  • <host_pattern>: Bu, belirli bir ana bilgisayarın adı, bir ana bilgisayar grubu veya birden çok ana bilgisayarla eşleşen bir model olabilir. Ansible envanter dosyalarında ana bilgisayarları belirtmek için kullanılan sözdizimini takip eder.

Örneğin, şunları kullanabilirsiniz:

  • Belirli bir ana bilgisayar adı, örneğin delegate_to: node1
  • delegate_to gibi bir grup adı: web sunucuları
  • Birden çok ana bilgisayarla eşleşen bir desen, örneğin delegate_to: “*.example.com”

delegate_to kullandığınızda görev, oyun için varsayılan hedef  bilgisayar yerine belirtilen bilgisayarda yürütülür.

Örnek 1

Bu basit örnek playbook’ta, görev 1 node1’de yürütülür ve ana bilgisayar adını görüntüler. Görev 2, node2’ye devredilir, bu da varsayılan hedef  bilgisayar yerine node2’de yürütüleceği anlamına gelir.

- name: Display the hostname of the remote server
  hosts: node1
  tasks:
    - name: "Task 1: Display hostname of node1"
      debug:
        msg: "Hostname of {{ inventory_hostname }} is {{ ansible_hostname }}"

    - name: "Task 2: Display hostname of node2"
      debug:
        msg: "Hostname of {{ inventory_hostname }} is {{ ansible_hostname }}"
      delegate_to: node2

Bu playbooku çalıştıralım:

ansible-playbook playbook.yml

Aşağıdaki ekran görüntüsünü göreceksiniz:

Display hostname using delgate_to in Ansible

Örnek 2

Bir LAMP yığınını birden çok sunucuya dağıtmak için bir playbook olduğunu varsayalım. Hedef bilgisayarlara paket kurulumu veya veritabanı kurulumu gibi yoğun kaynak gerektiren görevler yüklemek yerine, bu görevleri daha yüksek hesaplama kapasitesine sahip belirlenmiş bir node2 ye devredebilirsiniz.

- name: Install LAMP Server
  hosts: webservers
  tasks:
    - name: Install LAMP packages
      apt:
        name: "{{ item }}"
        state: present
      delegate_to: node2
      with_items:
        - apache2
        - mariadb-server
        - php
        - php-common
        - php-fpm
        - php-curl
        - php-json
        - php-cli

Yukarıdaki playbook dosyasını kaydedin ve aşağıdaki komutu kullanarak çalıştırın.

ansible-playbook playbook.yml

Aşağıdaki ekran görüntüsünü göreceksiniz:

Install LAMP server using delgate_to in Ansible

Örnek 3

Ansible kopyalama modülünü kullanarak bir dosyayı node1’den node2’ye kopyalamanız gerektiğini düşünün. Bu playbook’ta delegate_to parametresi, bir dosyayı node1’den node2’ye kopyalama görevini devretmek için kullanılır.

- name: Copy file from node1 to node2
  hosts: node1
  tasks:
    - name: Copy file from node1 to control node
      fetch:
        src: /etc/hosts
        dest: /tmp/
        flat: yes

    - name: Copy fetched file from control node to node2
      copy:
        src: /tmp/hosts
        dest: /mnt/
      delegate_to: node2

Bu oyun kitabında delegate_to rolünü inceleyelim:

  • Task Description: “Dosyayı kopyala” görevi, node1 üzerindeki /etc/hosts kaynak yolundan denetim bilgisayarında /tmp/ hedef yoluna bir dosya kopyalamak için fetch modülünü kullanır. “Getirilen dosyayı kopyala” görevi, bir dosyayı denetim bilgisayarındaki /tmp/hosts kaynak yolundan node2’deki /mnt/ hedef yoluna kopyalamak için kopyalama modülünü kullanır.
  • delegate_to: node2: Bu, görevin belirli bir  bilgisayara (node2) atanması gerektiğini belirtir. Bu, playbook’un kontrol düğümünü hedeflemesine rağmen, bu belirli görevin node2’de yürütüleceği anlamına gelir.

Şimdi, yukarıdaki oyun kitabını çalıştırın.

ansible-playbook playbook.yml

Aşağıdaki ekran görüntüsünü göreceksiniz.

Copy file from node1 to node2 using delgate_to in Ansible

Örnek 4

Bu örnekte, playbook web sunucularında hızlı bir web sunucusu başlatır, ardından bu sunucudan bilgi alır ve delegate_to kullanarak yerel olarak işler.

- name: "Ansible Delegate_to examples"
  hosts: webservers
  tasks:
    - name: "Task1: start a quick webserver with NC on remote server"
      shell: 'while true; do echo -e "HTTP/1.0 200 OK\nContent-Length: 13\n\nHello from WebServer!" | nc -l -p 8091 -q 1; done &'
      async: 1
      poll: 0

    - name: "Task2: Check the status of the remote server from localhost"
      command: curl --http0.9 -i http://{{ansible_default_ipv4.address}}:8091
      delegate_to: localhost
      register: curl_output

    - name: "Task3: Printing the website output from the Task2"
      debug:
       msg: "{{ curl_output.stdout }}"

Bu Ansible playbook’u aşağıdaki görevleri gerçekleştirir:

  • Playbook, Görev 1 (zaman uyumsuz) kullanarak web sunucularında geçici bir web sunucusu başlatır.
  • Ansible denetleyicisine (localhost) devredilen Görev 2, web sunucularındaki web sunucusuna erişmeyi dener:8091.
  • Web sunucusu çalışıyorsa ve erişilebilir durumdaysa, Görev 2 içerikle birlikte başarılı bir yanıt kaydeder (“Web Sunucusundan Merhaba!”).
  • Görev 3 , curl_output değişkeninden içeriği alır ve hata ayıklama modülünü kullanarak görüntüler.

Bu playbook, delegate_to’in Ansible denetleyicisinde belirli amaçlar için görevlerin yürütülmesine nasıl izin verdiğini gösterir. Görev 1’in zaman uyumsuz yapısı, playbook’un web sunucusunun başlamasını beklemeden devam etmesini sağlar.

Şimdi, aşağıdaki komutu kullanarak bu playbook’u çalıştırın:

ansible-playbook playbook.yml

Aşağıdaki ekran görüntüsünü göreceksiniz:

Start a webserver and prints message using delgate_to in Ansible

 

 

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.