Ansible ve WinRM Kullanarak Onlarca Windows Sunucuya Sırayla Windows Update Yükleme ve Yeniden Başlatma Orkestrasyonu
Her ayın ikinci Salı günü Microsoft yeni güvenlik yamalarını (Patch Tuesday) yayınlar. 50 adet Windows sunucusu olan bir holdingde hafta sonu mesaiye kalıp 50 sunucuya tek tek Uzak Masaüstü (RDP) açmak, güncellemeleri tıklamak, beklemek, yeniden başlatmak ve servislerin açıldığını kontrol etmek en az 6 ila 8 saatlik sıkıcı ve hataya açık bir operasyondur. Açık kaynaklı orkestrasyon devi Ansible, bu süreci tek bir komutla kahvenizi içerken otonom icra eden bir mühendislik harikasıdır.
1. Mimari Tasarım: Ansible Control Node ve Windows WinRM
Ansible ajansızdır (agentless):
- Ansible Control Node: Hafif bir Ubuntu Linux sunucu üzerinde çalışır.
- Windows Hedefler: Windows Server'ın yerleşik WinRM (Windows Remote Management) servisi üzerinden haberleşir.
- Linux kontrol sunucusu Windows sunucularına bağlanır, PowerShell cmdlet'lerini uzaktan çalıştırır ve sonuçları toplar.
2. Envanter Dosyası (hosts.ini)
Sunucular rollere göre gruplanır:
[windows_servers:children]
domain_controllers
sql_servers
app_servers
[domain_controllers]
dc01.holding.local
dc02.holding.local
[sql_servers]
sql01.holding.local
[windows_servers:vars]
ansible_user=svc_ansible@HOLDING.LOCAL
ansible_password=GucluParola2023!
ansible_connection=winrm
ansible_winrm_transport=kerberos
ansible_winrm_server_cert_validation=ignore
3. Üretim Seviyesinde Windows Update Playbook (update_windows.yml)
Bu playbook sunucuları sırayla (rolling update) günceller; kümedeki tüm sunucuların aynı anda kapanmasını engeller (serial: 1):
---
- name: Kurumsal Windows Sunucu Yama Orkestrasyonu
hosts: windows_servers
serial: 1 # Sunucuları tek tek güncelle, küme kesintiye uğramasın!
tasks:
- name: 1. Eksik Güvenlik Yamalarını Ara ve Yükle
ansible.windows.win_updates:
category_names:
- SecurityUpdates
- CriticalUpdates
- UpdateRollups
reboot: true
reboot_timeout: 900
register: update_result
- name: 2. Güncelleme Sonucunu Konsola Yazdır
ansible.builtin.debug:
msg: "Sunucu: {{ inventory_hostname }} | Yüklenen Yama: {{ update_result.installed_update_count }} | Yeniden Başlatıldı: {{ update_result.reboot_required }}"
- name: 3. Kritik Windows Servislerinin Başladığını Doğrula
ansible.windows.win_service:
name: "{{ item }}"
state: started
loop:
- LanmanServer
- W32Time
4. Playbook'un Çalıştırılması
ansible-playbook -i hosts.ini update_windows.yml
Komutu verdikten sonra Ansible sırayla her sunucuya bağlanır, yamaları yükler, gerekiyorsa güvenle yeniden başlatır, sunucunun ayağa kalkmasını bekler, servisleri kontrol eder ve sonraki sunucuya geçer!
Karşılaşılan Kritik Hatalar ve Çözüm İpuçları
- WinRM Bellek Limiti Hatası: Büyük güncellemeler yüklenirken WinRM bellek taşması verebilir. Windows sunucularda WinRM max bellek boyutu artırılmalıdır:
winrm set winrm/config/winrs @{MaxMemoryPerShellMB="2048"}
- Domain Controller'ların Aynı Anda Reboot Olması: Playbook'ta
serial: 1parametresi hayati önem taşır. Eğer iki DC aynı anda yeniden başlarsa ağdaki tüm oturum açma işlemleri kilitlenir.
Mühendis Notu
Ansible ile yama yönetimini otomatize eden bir sistem yöneticisi, hafta sonu mesailerini ailesiyle geçirir. Rutin operasyonları koda dökmek bir lüks değil; modern sistem mühendisliğinin temel şartıdır.
