Environment_Infrastructure/setup/07-prod-ansible-bootstrap.md
Murat ÖZDEMİR a25fa37aec Refine Ansible bootstrapping documentation for simplified command execution
Adjusts documentation for test and production Ansible bootstrapping to leverage `ansible.cfg`. Commands are now run from specific environment directories (`ansible/test/` or `ansible/prod/`), eliminating the need to explicitly specify inventory and playbook paths.

Also adds an initial step to install required Ansible collections using `ansible-galaxy`.
2026-05-11 17:51:01 +03:00

5.9 KiB
Raw Blame History

07 - Prod Ansible Bootstrap

Bu aşamanın amacı Terraform ile oluşturulan prod makinelerini Linux, security hardening, Docker ve Swarm açısından hazır hale getirmektir. DB cluster yazılımı bu playbook tarafından kurulmaz; ancak DB node'ları Swarm'a worker olarak katılır.

Ansible Kurulumu

Ansible, kontrol makinesinde (kendi bilgisayarınızda) yüklü olmalıdır. Hedef sunuculara herhangi bir ajan kurulmaz, sadece SSH erişimi yeterlidir.

İşletim Sistemine Göre Kurulum

  • Ubuntu / Debian:

    sudo apt update  
    sudo apt install -y pipx python3-venv  
    
    pipx ensurepath  
    export PATH="$HOME/.local/bin:$PATH"  
    
    pipx install --include-deps ansible
    
  • Fedora / Rocky Linux / RHEL:

    sudo dnf install -y pipx python3-virtualenv
    
    pipx ensurepath
    export PATH="$HOME/.local/bin:$PATH"
    
    pipx install --include-deps ansible
    
  • macOS (Homebrew):

    brew install ansible
    
  • Python Pip ile (Her platformda):

    pipx install --include-deps ansible
    

Kurulumun Doğrulanması

Hangi yöntemle kurarsanız kurun, kurulumun başarılı olduğunu doğrulamak için aşağıdaki komutları kullanın:

# Ansible versiyonunu ve yapılandırma yollarını kontrol edin
ansible --version

# Ansible binarysinin hangi konumdan çalıştığını kontrol edin
which -a ansible

Ansible Komutlarını Çalıştırma

Tüm komutlar ansible/prod/ dizininden çalıştırılmalıdır. ansible.cfg inventory ve roles_path'i otomatik olarak tanımlar.

0. Gerekli Collection'ları Kur (İlk kurulumda bir kez)

ansible-galaxy collection install -r ../requirements.yml

1. Bağlantı Testi (Ping)

ansible all -m ping

2. Bootstrap Playbook'unu Çalıştırma

ansible-playbook prod-bootstrap.yml --ask-vault-pass

Not: --ask-vault-pass parametresi Ansible Vault parolasını sorar; StorageBox şifresi bu şekilde çözülür.

3. Sadece Belirli Bir Rolü Çalıştırma (Tags)

ansible-playbook prod-bootstrap.yml --tags "hardening" --ask-vault-pass

Hedef Makineler

Host Rol
iklim-app-01 Swarm manager + app worker
iklim-app-02 Swarm manager + app worker
iklim-app-03 Swarm manager + app worker
iklim-db-01 Manuel DB cluster node
iklim-db-02 Manuel DB cluster node
iklim-db-03 Manuel DB cluster node

Önerilen Dosya Yapısı

ansible/
  prod/
    ansible.cfg
    inventory/
      generated/
        prod.yml
    group_vars/
      all.yml
      prod.yml
    prod-bootstrap.yml
  roles/
    base/
    hardening/
    docker/
    swarm/
    node_dirs/
    storagebox/
    storagebox_ssh_key/

Base Role

Tüm prod node'larına uygulanır:

  • Paket cache update
  • Temel paketler (sırasıyla kurulur):
    • epel-release — fail2ban ve davfs2 bu repo'dan gelir; önce kurulur
    • curl
    • wget
    • git
    • jq
    • tar
    • unzip
    • bash-completion
    • gettext — envsubst için; CI/CD deploy pipeline'larında gerekli
    • tree
    • ca-certificates
    • fail2ban
    • firewalld
    • chrony
    • python3
    • python3-pip
    • htop — interaktif proses izleme (EPEL)
    • btop — kaynak monitörü, grafik arayüz (EPEL)
  • timezone: Europe/Istanbul
  • hostname ayarı
  • chrony/NTP aktif

Security Hardening Role

Tüm prod node'larına uygulanır:

  • SSH password auth kapatılır.
  • Root SSH login kapatılır.
  • Sadece SSH key auth kalır.
  • PermitEmptyPasswords no
  • MaxAuthTries 3
  • fail2ban aktif edilir.
  • dnf-automatic ile otomatik güvenlik güncelleştirmeleri aktif edilir.
  • firewalld default: incoming deny (drop zone), outgoing allow.
  • SSH sadece admin CIDR'dan açılır.
  • DB portları public açılmaz.

Hetzner Cloud Firewall asıl perimeter kabul edilir. firewalld host üzerinde ikinci savunma katmanıdır.

Docker Role

Tüm prod node'larında (hem app hem db) zorunludur. DB node'ları Swarm Worker olarak ağa dahil olacağı için Docker Engine her makinede kurulu olmalıdır.

Kurulacak paketler:

  • docker-ce
  • docker-ce-cli
  • containerd.io
  • docker-buildx-plugin
  • docker-compose-plugin

Kurulum resmi Docker dnf repository üzerinden yapılacak (https://download.docker.com/linux/rhel/docker-ce.repo).

Swarm Role

Prod Swarm 3 manager ile kurulacak:

  1. iklim-app-01 üzerinde docker swarm init (Advertise/data path addr: 10.20.10.11)
  2. iklim-app-02 ve iklim-app-03 manager olarak join olur.
  3. iklim-db-01/02/03 worker olarak join olur.
  4. Overlay network oluşturulur: iklimco-net
  5. Node etiketleri:
    • iklim-app-* -> type=service
    • iklim-db-* -> role=db
  6. Tüm node'lar AVAILABILITY=Active kalır.

Node Directory Role

Tüm iklim-app-* node'larında:

/opt/iklimco/ssl
/opt/iklimco/init
/opt/iklimco/stacks

DB node'larında:

/opt/iklimco/db
/opt/iklimco/backup

StorageBox DAVFS Mount Role

Her node'a uygulanır (tüm iklim-app-* ve iklim-db-*).

Prod Sub-Account

Parametre Değişken Değer
Ana hesap storagebox_account u469968
Sub-account storagebox_user u469968-sub5
WebDAV URL storagebox_url https://u469968-sub5.your-storagebox.de/
Mount point storagebox_mount_point /mnt/storagebox

StorageBox SSH Key Role

Her node'a uygulanır. Sunucu üzerinde ed25519 SSH anahtar çifti üretilir ve StorageBox ana hesabına yüklenir.

Kabul Kriterleri

  • ansible -i inventory/generated/prod.yml all -m ping başarılı olur.
  • 3 Swarm manager node docker node ls içinde Leader/Reachable görünür.
  • 3 DB node docker node ls içinde Worker olarak görünür.
  • Manager quorum sağlanır (3 manager, 1 kayıp tolere edilir).
  • iklimco-net overlay network vardır.
  • Node etiketleri (type=service, role=db) inspect ile doğrulanır.
  • Her node'da /mnt/storagebox mount edilmiştir.
  • Public firewall sadece 22, 80, 443 ingress'e izin verir.