Sistem/DevOps•8 dk okuma

Ansible ve WinRM Kullanarak Onlarca Windows Sunucuya Sırayla Windows Update Yükleme ve Yeniden Başlatma Orkestrasyonu

Her ay onlarca Windows sunucuya tek tek RDP ile bağlanıp Windows Update yapma eziyetine son: Ansible ve PowerShell WinRM ile kontrollü yama yükleme, reboot ve servis doğrulama playhook mimarisi.

AE

Ahmet Ertekin

24 March 2023

Ansible ve WinRM Kullanarak Onlarca Windows Sunucuya Sırayla Windows Update Yükleme ve Yeniden Başlatma Orkestrasyonu

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: 1 parametresi 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.