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.