8 Temmuz 2025 Salı

Ansible ile kullanabileceğimiz temel eklentiler, özellikler


Lookup Plug-in Nedir?

Lookup plug-in (eklenti), Ansible içinde Jinja2 şablonlama dili ile çalışan bir uzantıdır. Bu eklentiler sayesinde:

  • Dosyalardan,

  • Komut çıktılarından,

  • URL’lerden,

  • Ortam değişkenlerinden,

  • Kubernetes API gibi harici sistemlerden veri çekebiliriz.


🔧 Lookup ve Query Fonksiyonları

Ansible’da lookup plug-in’leri iki şekilde çağırabiliriz:

1. lookup() Fonksiyonu

Bu fonksiyon dış kaynaktan veri çeker ve sonucu virgülle ayırarak düz bir string (metin) olarak verir.

yaml
vars: hosts: "{{ lookup('ansible.builtin.file', '/etc/hosts', '/etc/resolv.conf') }}"

📌 Bu ifade, her iki dosyanın içeriğini tek bir metin olarak virgülle ayırarak hosts değişkenine atar.


2. query() Fonksiyonu

lookup() ile benzer çalışır ama liste (list) olarak sonuç döndürür. Yani işlemek daha kolay olur.

yaml
vars: hosts: "{{ query('ansible.builtin.file', '/etc/hosts', '/etc/resolv.conf') }}"

Bu ifade şu sonucu döndürür:

yaml
hosts: - "…/etc/hosts içeriği…" - "…/etc/resolv.conf içeriği…"

📂 Dosya İçeriği Okuma (file Plug-in’i)

Dosya içeriğini okumak için ansible.builtin.file plug-in’i kullanılır:

yaml
my_yaml: "{{ lookup('ansible.builtin.file', '/path/to/my.yaml') | from_yaml }}"

Bu şekilde YAML dosyası otomatik olarak sözlük (dict) haline getirilir.

📌 Dikkat: Dosya, playbook çalıştığı ortamda olmalı (execution environment). Eğer ansible-navigator ile --ee false kullanılırsa, kontrol nodu olur.


🔑 Örnek: Public Key Eklemek

yaml
- name: Add authorized keys hosts: all vars: users: - remzi - admin tasks: - name: Add authorized keys ansible.posix.authorized_key: user: "{{ item }}" key: "{{ lookup('ansible.builtin.file', item + '.key.pub') }}" loop: "{{ users }}"

Bu örnekte remzi.key.pub ve admin.key.pub dosyaları okunur ve ilgili kullanıcıya atanır.


🧠 Lookup Yerine slurp Kullanımı (Uzak Dosyalar)

Eğer dosya hedef (managed) host üzerindeyse slurp modülü kullanılır:

yaml
- name: Collect file content ansible.builtin.slurp: src: /home/user/.ssh/id_rsa.pub register: slurped_file - name: Decode and use vars: pub_key: "{{ slurped_file.content | b64decode }}" ansible.builtin.debug: var: pub_key

📝 Template Dosyası Okuma

Eğer dosya bir Jinja2 şablonu ise template plug-in’i ile işlenir:

yaml
msg: "{{ lookup('ansible.builtin.template', 'my.template.j2') }}"

Şablon içeriği örneğin şöyle olabilir:

nginx
Hello {{ name }}.

name: class olduğunda çıktı: Hello class. olur.

🔸 template plug-in’i ile template modülü farklı şeylerdir.


🖥 Komut Çıktısı Okuma (pipe ve lines)

Ansible içinden komut çalıştırıp çıktı almak için:

pipe: Çıktıyı tek string olarak döner

yaml
{{ query('ansible.builtin.pipe', 'ls files') }}

lines: Çıktıyı satır satır liste döner

yaml
{{ query('ansible.builtin.lines', 'ls files') }}

🌐 URL'den Veri Çekme

Bir URL içeriğini almak için:

yaml
{{ lookup('ansible.builtin.url', 'https://my.site.com/my.file') }}

Bu veri JSON/YAML filtreleriyle işlenebilir.


☸️ Kubernetes Verisi Alma

Kubernetes’ten veri almak için:

yaml
{{ lookup('kubernetes.core.k8s', kind='Deployment', namespace='ns', resource_name='my_res') }}

Bu plug-in okuma içindir. Güncelleme işlemleri için k8s modülü kullanılır.


🧩 Özel Lookup Plug-in Yazmak

Kendi lookup plug-in’lerinizi Python ile yazıp aşağıdaki dizinlerden birine koyarak kullanabilirsiniz:

  • lookup_plugins/

  • filter_plugins/

  • Collection kullanıyorsanız plugins/lookup/


⚠️ Hatalarla Baş Etme

Varsayılan olarak bir dosya bulunamazsa lookup hata verir. Ama bu davranışı değiştirebilirsiniz:

yaml
{{ lookup('ansible.builtin.file', 'my.file', errors='warn') }}
  • strict: Hata varsa durur (varsayılan)

  • warn: Uyarı verir, boş değer döner

  • ignore: Sessizce devam eder


📚 Referanslar

3 Temmuz 2025 Perşembe

Git kullanımı notları

 Temel ayarlar git kullanıcısı için:

$ git config --global user.name "Remzi AKYÜZ"

$ git config --global user.email "remzi@akyuz.tech"

$ git config --global push.default "simple"

$ git config --global credential.https://git.local.lab.username admin

$ git config --global credential.helper cache --timeout=7200


source /usr/share/git-core/contrib/completion/git-prompt.sh

export GIT_PS1_SHOWDIRTYSTATE=true

export GIT_PS1_SHOWUNTRACKEDFILES=true

export PS1='[\u@\h \W$(declare -F __git_ps1 &>/dev/null && __git_ps1 " (%s)")]\$ '




######################### terminalden git reposu oluşturulması #######################

#!/bin/bash


# Kullanım kontrolü

if [[ $# -ne 3 ]]; then

  echo "Kullanım: $0 <PRIVATE_TOKEN> <NAMESPACE_PATH> <REPO_NAME>"

  echo "Örnek : $0 glpat-abc123 do374v2.2 test-repo"

  exit 1

fi


# Argümanlar

TOKEN="$1"

NAMESPACE_PATH="$2"

REPO_NAME="$3"


# GitLab URL (gerekiyorsa düzenle)

GITLAB_URL="https://git.local.lab"


# Grup ID'sini al

GROUP_INFO=$(curl --silent --header "PRIVATE-TOKEN: $TOKEN" \

  "$GITLAB_URL/api/v4/groups?per_page=100")


GROUP_ID=$(echo "$GROUP_INFO" | jq -r '.[] | select(.path=="'"$NAMESPACE_PATH"'") | .id')


# Repo varsa, çık

EXISTING_REPO=$(curl --silent --header "PRIVATE-TOKEN: $TOKEN" \

    "$GITLAB_URL/api/v4/projects?search=$REPO_NAME" | \

    jq -r '.[] | select(.namespace.id == '"$GROUP_ID"') | .name')


if [[ "$EXISTING_REPO" == "$REPO_NAME" ]]; then

  echo "ℹ️  Repo '$REPO_NAME' zaten grup içinde mevcut. Oluşturulmadı."

  exit 0

fi


if [[ -z "$GROUP_ID" ]]; then

  echo "❌ Hata: Grup '$NAMESPACE_PATH' bulunamadı."

  exit 2

fi


echo "✅ Grup '$NAMESPACE_PATH' bulundu (ID: $GROUP_ID). Yeni repo '$REPO_NAME' oluşturuluyor..."


# Repo oluştur

CREATE_RESPONSE=$(curl --silent --write-out "%{http_code}" --output /tmp/create_gitlab_repo_response.json \

  --request POST "$GITLAB_URL/api/v4/projects" \

  --header "PRIVATE-TOKEN: $TOKEN" \

  --form "name=$REPO_NAME" \

  --form "namespace_id=$GROUP_ID")


if [[ "$CREATE_RESPONSE" == "201" ]]; then

  echo "✅ Repo başarıyla oluşturuldu:"

  jq '.ssh_url_to_repo, .http_url_to_repo' < /tmp/create_gitlab_repo_response.json

else

  echo "❌ Repo oluşturulamadı. HTTP kodu: $CREATE_RESPONSE"

  jq < /tmp/create_gitlab_repo_response.json

fi


######################### terminalden git reposu oluşturulması #######################



18 Haziran 2025 Çarşamba

ansible ile yerel quay sunucusu üzerinden execution environment kullanımı

 Yerel quay veya registry sunucularımızdaki ee leri ansible ile kullanabiliyoruz.

Bunun için kendi yaptığımız ee leri veya hazır ee leri yükleyerek kullanabiliriz.

İşlemler:

[rh294@bastion ~]$ podman tag registry.redhat.io/ansible-automation-platform-25/ee-supported-rhel9:1.0.0-1033 bastion.local.lab/ansible-automation-platform-25/ee-supported-rhel9:1.0.0-1033

[rh294@bastion ~]$ podman images

REPOSITORY                                                            TAG         IMAGE ID      CREATED      SIZE

registry.redhat.io/ansible-automation-platform-25/ee-supported-rhel8  latest      48ced021b0e1  13 days ago  2.28 GB

bastion.local.lab/library/ee-supported-rhel8                          1.0.0-1032  48ced021b0e1  13 days ago  2.28 GB

registry.redhat.io/ansible-automation-platform-25/ee-supported-rhel8  1.0.0-1032  48ced021b0e1  13 days ago  2.28 GB

bastion.local.lab/ansible-automation-platform-25/ee-supported-rhel9   1.0.0-1033  15f3a7cd419c  13 days ago  2.27 GB

registry.redhat.io/ansible-automation-platform-25/ee-supported-rhel9  1.0.0-1033  15f3a7cd419c  13 days ago  2.27 GB

registry.redhat.io/ansible-automation-platform-25/ee-supported-rhel9  latest      15f3a7cd419c  13 days ago  2.27 GB

bastion.local.lab/library/ee-supported-rhel9                          1.0.0-1033  15f3a7cd419c  13 days ago  2.27 GB

quay.io/ansible/ansible-runner                                        latest      bec0dc171168  3 years ago  816 MB

[rh294@bastion ~]$


[rh294@bastion ~]$ podman push bastion.local.lab/ansible-automation-platform-25/ee-supported-rhel9:1.0.0-1033 --remove-signatures

Copying blob 8361195c374b done   | 

Copying blob b492ce482b81 done   | 

Copying blob a080cada37e9 skipped: already exists  

Copying blob 80a3047bb0cc done   | 

Copying config 15f3a7cd41 done   | 

Writing manifest to image destination

[rh294@bastion ~]$ 




------------------------------------ansible-navigator.yml--------------------------------------------------
ansible-navigator:
  ansible:
    config:
      path: ./ansible.cfg
  execution-environment:
    image: bastion.local.lab/ansible-automation-platform-25/ee-supported-rhel9:1.0.0-1033
    pull:
      policy: missing
  playbook-artifact:
    enable: false

------------------------------------ansible-navigator.yml--------------------------------------------------


---------------------------------------------ansible.cfg------------------------------------------------------

[defaults]
remote_user=do374
inventory = ./inventory 
collections_path=~/.ansible/collections:/usr/share/ansible/collections:/home/admin/develop-navigator/mycollections

[privileges_escalation]
become = true
becamo_method = sudo
become_user = root
became_ask_pass = false

---------------------------------------------ansible.cfg------------------------------------------------------







10 Haziran 2025 Salı

rhel linuxlerde kurtarma modu püf noktası

RHEL tabanlı her hangi bir sistemde felaket durumunda kurtarma modunda açtığımızda chroot yapmadan önce aşağıdaki bağlantı işlemlerini yapmayı unutmamak gerekiyor. 

# mount -o bind /dev /mnt/sysimage/dev

# mount -o bind /dev/shm /mnt/sysimage/dev/shm
# mount -o bind /sys /mnt/sysimage/sys

# mount -t proc /proc /mnt/sysimage/proc

26 Mayıs 2025 Pazartesi

draid - zfs ile draid kullanımı

 36 ve üzeri disk kullanacak olduğumuzda, performans için draid kullanmamız doğru seçim olacaktır.
Unutmamamız gereken nokta, kapasite artırımı yapılmayı düşünüyorsak, draid oluştururken draid bölümlerini artırmayı düşündüğümüz alan kadar yapmamız gerekiyor. Yani bir jbod ilave ederek ve jbod üzerinde 36 disk gelecekse, birinci bölümümüzde 36 diske göre plan yapmamız gerekiyor. 

Örnek:

jbod disk kapasitesi : 36

eklenecek jbod disk kalitesi : 36 disk 
zpool create dpool2 draid2:34d:0s:36c /dev/sda{a..z} /dev/sdb{a..j}

34d: 34 adet data diski

36c: toplam 36 disk

2 disk parity diski olarak kullanılır.

İlave 36 diskli jbod gelince 

zpool add dpool2 draid2:34d:0s:36c sdc{a..z} sdd{a..j}


Genel yedek disk ekleme;

zpool add dpool2 spare /dev/sda[xy]

Veri güvenliği önemli olduğundan draid1 yerine draid2 kullandık, yani 2 tane paritimiz, iki tane spare  oldu.

spare diski draid oluştururken, dedike verirsek, bu disk sadece oluşturulan draid atanmış spare olur.
eklenecek ilave draid gurublarına faydası olmaz, fazladan diski boşta tutmamız gerekir.
Bundan dolayı draidler oluşturulduktan sonra spare direk pool atıyoruz. Pool içinde her hangi bir draid disk aksaklığı olursa, spare hemen onun yerine geçer. Bizimde arızalı diski bir an önce değiştirmemiz sürekliliği sağlar.

Benzer bir çalışmanın kayıtı:






                                           


13 Mayıs 2025 Salı

Bir sunucu uzerindeki zfs datasetinin yeni bir pool uzerine tasinmasi, yerel replikasyon

Asagidaki script eski zfs den yeni zfs veri kopyalamasi yapar.

##########################scriptin calistirma sorumlulugu calistirana aittir. #######################################

 #!/bin/bash
# zfs uzerindek verileri hizli tasimak icin zfs replikasyonu yapar
#
# Kullanım: ./zfs_local_replicate.sh source_dataset destination_dataset
# 2025.05.13
# Remzi AKYUZ
# remzi@akyuz.tech


SOURCE_FS="$1"
DEST_FS="$2"
DATE=$(date +"%Y%m%d-%H%M%S")
SNAPSHOT_NAME="${SOURCE_FS}@replica-${DATE}"

# Hatalı kullanım kontrolü
if [[ -z "$SOURCE_FS" || -z "$DEST_FS" ]]; then
  echo "Kullanım: $0 <source_dataset> <destination_dataset>"
  exit 1
fi

# 1. Snapshot oluştur
echo "[+] Snapshot oluşturuluyor: $SNAPSHOT_NAME"
zfs snapshot "$SNAPSHOT_NAME"

# 2. İlk defa mı yoksa incremental mi?
LAST_SNAP=$(zfs list -t snapshot -o name -s creation | grep "^${SOURCE_FS}@replica-" | tail -2 | head -1)

if [[ -n "$LAST_SNAP" && "$LAST_SNAP" != "$SNAPSHOT_NAME" ]]; then
  echo "[+] Incremental send: $LAST_SNAP -> $SNAPSHOT_NAME"
  zfs send -i "$LAST_SNAP" "$SNAPSHOT_NAME" | zfs receive -F "$DEST_FS"
else
  echo "[+] Tam send (ilk kez çalışıyor olabilir)"
  zfs send "$SNAPSHOT_NAME" | zfs receive -F "$DEST_FS"
fi

# 3. Replikasyon tamam
echo "[+] Replikasyon tamamlandı. Hedef: $DEST_FS"

# 4. Eski snapshot'ları sil (yalnızca replica- ile başlayanlar)
echo "[+] Eski snapshot'lar temizleniyor, yalnızca son 3 adet tutulacak..."

SNAPSHOTS=($(zfs list -t snapshot -o name -s creation | grep "^${SOURCE_FS}@replica-" ))

TOTAL=${#SNAPSHOTS[@]}

if (( TOTAL > 3 )); then
  COUNT=$((TOTAL - 3))
  for ((i=0; i<$COUNT; i++)); do
    OLD_SNAP="${SNAPSHOTS[$i]}"
    echo "[-] Siliniyor: $OLD_SNAP"
    zfs destroy "$OLD_SNAP"
  done
else
  echo "[=] Silinecek eski snapshot bulunamadı (toplam: $TOTAL)"
fi


echo "[+] Hedef dataset'teki eski snapshot'lar temizleniyor..."

DEST_SNAPSHOTS=($(zfs list -t snapshot -o name -s creation | grep "^${DEST_FS}@replica-" ))

TOTAL_DEST=${#DEST_SNAPSHOTS[@]}

if (( TOTAL_DEST > 3 )); then
  COUNT_DEST=$((TOTAL_DEST - 3))
  for ((i=0; i<$COUNT_DEST; i++)); do
    OLD_DEST_SNAP="${DEST_SNAPSHOTS[$i]}"
    echo "[-] Siliniyor (hedef): $OLD_DEST_SNAP"
    zfs destroy "$OLD_DEST_SNAP"
  done
else
  echo "[=] Silinecek hedef snapshot bulunamadı (toplam: $TOTAL_DEST)"
fi

##########################scriptin calistirma sorumlulugu calistirana aittir. #######################################

Ozellikle buyuk hacimli dosya sistemlerinin tasinmasi icin uygundur.

tasima islemleri snapshotlar ile yapilmaktadir. snapshot esnasinda acik dosya varsa, acik dosyalar kapatilip, script calistirilir ve tekrar dosya yazma islemlerine devam edilir.
Bellir bir servis kullaniyorsaniz, servisi durdurun, script baslatin, snaphot alindiktan ve kopyalama devam ederken, servisi tekrar baslatabilirsiniz.

Alternatif olarak scriptdeki asagidaki satirlari duzenleyebilirsiniz.


systemctl stop servis_ismi

# 1. Snapshot oluştur
echo "[+] Snapshot oluşturuluyor: $SNAPSHOT_NAME"

zfs snapshot "$SNAPSHOT_NAME"


systemctl start servis_ismi

Bu islem servisini anlik olarak durdurur, snap sonrasi tekrar baslatir.
Servisinizin data butunlugu korunmus olur.

2 Nisan 2025 Çarşamba

Red Hat Satellite - admin parolasını unutmak

 Red Hat satellite 6 kullanırkın admin parolasını unuttuysanız veya bir şekilde elinize ulaşmadıysa aşağıdaki şekilde değiştirebilirsiniz: 



Bu işlemden sonra ~/.hammer/cli.modules.d/foreman.yml   dosyasındaki kullanıcı adı ve parolasını güncellemeyi unutmayınız.



USB Disk Trim ( Discard ) Desteğinin kullanılması - Acasis TB406Pro

Yeni bir USB-NVMe kutusu aldım. İçine 2 TB'lık bir NVMe SSD taktım, diski LVM ile bölüp XFS ile biçimlendirdim. Kutunun kutusunda "...