Ansible Değişkenler ve Gerçeklerle Nasıl Çalışılır - Bölüm 8


Bu Ansible serisinde değişkenlerden bahsettik ve sadece biraz kafanızı karıştırmak istedik. Değişken, birçok programlama dilinde olduğu gibi, aslında bir değeri temsil eden bir anahtardır.

Geçerli Bir Değişken Adı Nelerden Oluşur?

Bir değişken adı harfler, sayılar, alt çizgiler veya bunların 2'sinin veya hepsinin karışımını içerir. Ancak değişken adının her zaman bir harfle başlaması ve boşluk içermemesi gerektiğini unutmayın.

Geçerli ve kabul edilemez değişken adlarına ilişkin birkaç örneğe göz atalım:

Geçerli Değişken Adı Örnekleri:

football 
foot_ball
football20 
foot_ball20

Geçersiz Değişken Adı Örnekleri:

foot ball
20 
foot-ball

Değişken türlerini tartışalım:

1. Başucu Kitabı Değişkenleri

Başucu Kitabı değişkenleri oldukça kolay ve basittir. Bir başucu kitabında bir değişken tanımlamak için değişkenlerinizi girintili olarak yazmadan önce vars anahtar kelimesini kullanmanız yeterlidir.

Değişkenin değerine erişmek için onu tırnak işaretleriyle çevrelenmiş çift küme parantezlerinin arasına yerleştirin.

İşte basit bir başucu kitabı örneği:

- hosts: all
  vars:
    greeting: Hello world! 

  tasks:
  - name: Ansible Basic Variable Example
    debug:
      msg: "{{ greeting }}"

Yukarıdaki başucu kitabında, başucu kitabı çalıştırıldığında selamlama değişkeninin yerine Merhaba dünya! değeri gelir. Başucu kitabı yürütüldüğünde yalnızca Merhaba dünya! mesajını yazdırır.

Ek olarak, gösterildiği gibi bir listeye veya değişken dizisine sahip olabilirsiniz:

Aşağıdaki başucu kitabı kıtalar adı verilen bir değişkeni göstermektedir. Değişken 5 farklı değere sahiptir – kıta adları. Bu değerlerin her birine, ilk değişken olarak dizin 0 kullanılarak kolayca erişilebilir.

Aşağıdaki başucu kitabı örneği Asya (Dizin 1)'i getirir ve görüntüler.

- hosts: all
  vars:
    continents:
      - Africa
      - Asia
      - South America
      - North America
      - Europe
      
  tasks:
  - name: Ansible List variable Example
    debug:
      msg: "{{ continents [1] }}"

Değişken listesi gösterildiği gibi benzer şekilde yapılandırılabilir:

vars:
    Continents: [Africa, Asia, South America, North America, Europe]

Listedeki tüm öğeleri listelemek için with_items modülünü kullanın. Bu, dizideki tüm değerler arasında döngü oluşturacaktır.

- hosts: all
  vars:
    continents: [Africa, Asia, South America, North America, Europe]

  tasks:
  - name: Ansible array variables example
    debug: 
      msg: "{{ item }}"
    with_items:
      - "{{ continents }}"

Ansible değişkeninin başka bir türü de sözlük değişkenidir.

Sözlük değişkenleri ayrıca başucu kitabında da desteklenmektedir. Sözlük değişkenini tanımlamak için, sözlük değişkeni adının hemen altındaki anahtar/değer çiftini tanımlamanız yeterlidir.

hosts: switch_f01

vars:
   http_port: 8080
   default_gateway: 10.200.50.1
   vlans:
       id: 10
       port: 2

Yukarıdaki örnekte vlans sözlük değişkenidir, id ve port ise anahtar/değer çiftleridir.

hosts: switch_f01

vars:
   http_port: 8080
   default_gateway: 
   vlans:
      id: 10
      port: 20

 tasks:
   name: Configure default gateway
   system_configs:
   default_gateway_ip: “{{ default_gateway  }}“


   name: Label port on vlan 10
   vlan_config:
	vlan_id: “{{ vlans[‘id’]  }}“
     port_id: 1/1/ {{ vlans[‘port’]  }}

port_id için, değeri değişkenle değil metinle başlattığımız için küme parantezlerini tırnak içine almak gerekli değildir.

2. Özel Değişkenler

Ansible, Jinja2 şablonlarında ve oyun kitaplarında başvurulabilen ancak kullanıcı tarafından değiştirilemeyen veya tanımlanamayan önceden tanımlanmış değişkenlerin bir listesini sağlar.

Ansible'ın önceden tanımlanmış değişkenlerinin listesine toplu olarak Ansible gerçekleri adı verilir ve bunlar, bir oyun kitabı yürütüldüğünde toplanır.

Tüm Ansible değişkenlerinin bir listesini almak için Ansible geçici komutundaki setup modülünü aşağıda gösterildiği gibi kullanın:

ansible -m setup hostname

Bu, çıktıyı gösterildiği gibi JSON formatında görüntüler:

ansible -m setup localhost

Çıktıdan Ansible özel değişken örneklerinin bazılarının şunları içerdiğini görebiliriz:

ansible_architecture
ansible_bios_date
ansible_bios_version
ansible_date_time
ansible_machine
ansible_memefree_mb
ansible_os_family
ansible_selinux

Başka birçok Ansible özel değişkeni var, bunlar sadece birkaç örnek.

Bu değişkenler, gösterildiği gibi bir Jinja2 şablonunda kullanılabilir:

<html>
<center>
   <h1> The hostname of this webserver is {{ ansible_hostname }}</h1>
   <h3> It is running on {{ ansible_os_family}}system </h3>
</center>
</html>

3. Envanter Değişkenleri

Son olarak listede Ansible envanter değişkenlerimiz var. Envanter, Ansible tarafından yönetilecek tüm ana bilgisayarları içeren INI biçiminde bir dosyadır.

Envanterlerde, bir ana sisteme bir değişken atayabilir ve bunu daha sonra bir taktik kitabında kullanabilirsiniz.

[web_servers]

web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=ubuntu http_port=8080

Yukarıdakiler, gösterildiği gibi bir başucu kitabı YAML dosyasında temsil edilebilir:

---
   web_servers:
     web_server_1:
        ansible_user=centos
	   http_port=80

web_server_2:
        ansible_user=ubuntu
	   http_port=8080

Ana bilgisayar sistemleri aynı değişkenleri paylaşıyorsa envanter dosyasında başka bir grup tanımlayarak daha az hantal hale getirebilir ve gereksiz tekrarlardan kaçınabilirsiniz.

Örneğin:

[web_servers]

web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=centos http_port=80

Yukarıdakiler şu şekilde yapılandırılabilir:

[web_servers]
web_server_1
web_server_2


[web_servers:vars]
ansible_user=centos
http_port=80

Ve playbook YAML dosyasında bu, gösterildiği gibi tanımlanacaktır:

---
   web_servers:
    
     hosts: 
       web_server_1:
	  web_server_2:

     vars: 
        ansible_user=centos
   http_port=80

Anlaşılabilir Gerçekler

Playbook'ları çalıştırırken Ansible'ın yaptığı ilk görev kurulum görevinin yürütülmesidir. Çıktıyla karşılaşmış olduğunuzdan oldukça eminim:

TASK:  [Gathering facts] *********

Yanıtlanabilir gerçekler, sistem özelliklerinden veya bağlandığınız uzak düğümler hakkındaki bilgi parçalarından başka bir şey değildir. Bu bilgiler Sistem mimarisini, işletim sistemi sürümünü, BIOS bilgilerini, sistem saatini ve tarihini, sistem çalışma süresini, IP adresini ve donanım bilgilerini içerir.

Herhangi bir sistemle ilgili gerçekleri öğrenmek için aşağıdaki komutta gösterildiği gibi kurulum modülünü kullanmanız yeterlidir:

ansible -m setup hostname

Örneğin:

ansible -m setup database_server

Bu, büyük bir veri kümesini gösterildiği gibi JSON biçiminde yazdırır:

Yanıtlanabilir gerçekler, sistem yöneticilerine hangi işlemleri gerçekleştirmeleri gerektiği konusunda yardımcı olmak açısından kullanışlıdır; örneğin, işletim sistemine bağlı olarak hangi yazılım paketlerinin kurulması gerektiğini ve bunların nasıl yapılandırılacağını vb. bilebilir.

Özel Bilgiler

Ansible tarafından toplanabilecek kendi özel bilgilerinizi de oluşturabileceğinizi biliyor muydunuz? Evet yapabilirsin. Peki bunu nasıl yapacaksınız? Vites değiştirelim ve nasıl olduğunu görelim.

İlk adım, yönetilen veya uzak düğümde bir /etc/ansible/facts.d dizini oluşturmaktır.

Bu dizinin içinde .fact uzantılı bir dosya(lar) oluşturun. Bu dosya(lar), başucu kitabı Ansible kontrol düğümünde çalıştırıldığında JSON verilerini döndürecektir; bu, Ansible'ın bir başucu kitabı çalıştırıldıktan sonra aldığı diğer bilgileri de içerir.

Burada, tarih ve saati alan date_time.fact adlı özel bir bilgi dosyası örneği verilmiştir.

mkdir -p /etc/ansible/facts.d
vim /etc/ansible/facts.d/date_time.fact

İçine aşağıdaki satırları ekleyin.

#!/bin/bash
DATE=`date`
echo "{\"date\" : \"${DATE}\"}"

Dosyayı kaydedip çıkın.

Şimdi yürütme izinlerini atayın:

chmod +x /etc/ansible/facts.d/date_time.fact

Şimdi Ansible kontrol düğümünde check_date.yml adında bir başucu kitabı oluşturdum.

---

- hosts: webservers

  tasks:
   - name: Get custom facts
     debug:
      msg: The custom fact is {{ansible_local.date_time}}

Bilgi dosyasını ansible_local değişkenine ekleyin. ansible_local tüm özel bilgileri saklar.

Şimdi başucu kitabını çalıştırın ve Ansible'ın bilgi dosyasına kaydedilen bilgileri aldığını gözlemleyin:

ansible_playbook check_date.yml

Çözüm

Bu bizi Ansible değişkenleri ve gerçekleriyle çalışmaya ilişkin bu eğitimin sonuna getiriyor.