Variable Scope

Ansible değişken modeli, bir değişkenin hangi parçalar tarafından görülebildiğini (yani “scope” veya kapsamını) belirler. Değişkenlerin nerede tanımlandıkları, o değişkenin hangi Ansible görevlerinde ve hangi hedef sunucularda kullanılabileceğini etkiler. Ansible’da üç temel kapsam (scope) vardır:

  1. Host Kapsamı

  2. Play Kapsamı

  3. Global Kapsam

1. Host Scope

Tanım

“Host scope”, belirli bir host (sunucu) için tanımlanmış değişkenlerin yalnızca o host içerisinde erişilebilir olduğu anlamına gelir. Başka bir deyişle, bir değişken belirli bir makineye atandıysa, o değişkeni playbook içerisinde yalnızca o makineye görev gönderildiğinde kullanabilirsiniz.

Örnek

Bir envanter (inventory) dosyası düşünelim:

web1 ansible_host=172.20.1.100
web2 ansible_host=172.20.1.101 dns_server=10.5.5.4
web3 ansible_host=172.20.1.102

Burada dns_server değişkeni yalnızca web2 host’u için tanımlanmıştır. Eğer bir playbook yazıp bütün host’lara dns_server değerini bastırmak istersek:

---
- name: Print DNS Server
  hosts: all
  tasks:
    - debug:
        msg: "{{ dns_server }}"

Çıktıda, web2 için dns_server değeri görüntülenirken diğer host’lar için “VARIABLE IS NOT DEFINED!” hatası görünür. Çünkü host kapsamındaki bir değişken, tanımlı olmadığı diğer host’larda erişilebilir değildir.

2. Play Scope

Tanım

“Play scope”, bir değişkenin tanımlandığı play içinde geçerli olması demektir. Eğer bir play’de değişken tanımlarsanız, o değişken yalnızca o play’de kullanılabilir. Bir sonraki play’e otomatik olarak taşınmaz.

Örnek

Aşağıdaki playbook’ta birinci play’de ntp_server değişkeni tanımlanmış, ikinci play’de ise tanımlanmamıştır:

---
- name: Play1
  hosts: web1
  vars:
    ntp_server: 10.1.1.1
  tasks:
    - debug:
        var: ntp_server


- name: Play2
  hosts: web1
  tasks:
    - debug:
        var: ntp_server

Çalıştırdığımızda Ansible:

  • Play1 içerisinde ntp_server değişkenini başarıyla basacak (çünkü orada tanımlı).

  • Play2 içerisinde, aynı değişkeni bulamayacak ve “VARIABLE IS NOT DEFINED!” diyecek.

Bu örnek, play’lerin birbirinden bağımsız kapsamları olduğunu gösterir. Eğer bir değişkeni iki farklı play’de de kullanmak istiyorsak, her iki play’de de tanımlamalıyız (ya da global yapmalıyız).

3. Global Scope (Genel Kapsam)

Tanım

Global değişkenler, playbook’un tüm kısımlarında ve hatta tüm play’ler boyunca geçerlidir. Örneğin, komut satırından ekstra değişken (--extra-vars) olarak geçtiğiniz değerler global kapsamda değerlendirilir.

Örnek

Playbook’u şu şekilde çalıştırdığınızı düşünelim:

ansible-playbook playbook.yml --extra-vars "ntp_server=10.1.1.1"

Bu durumda ntp_server değişkeni, hangi play olursa olsun otomatikman tanımlıdır. Böylece bütün play’leriniz bu değere erişebilir.

---
- name: Play1
  hosts: web1
  tasks:
    - debug:
        var: ntp_server

- name: Play2
  hosts: web1
  tasks:
    - debug:
        var: ntp_server

Çıktıda, her iki play’de de ntp_server değeri rahatlıkla basılır.

Özetle:

  • Host scope: Değişken yalnızca tanımlandığı host’ta geçerli.

  • Play scope: Değişken yalnızca tanımlandığı play’de geçerli.

  • Global scope: Tüm play’ler ve host’lar için geçerli.

Last updated

Was this helpful?