This commit brings the `README.md` and Ansible setup guides (`03-test-ansible-bootstrap.md`, `07-prod-ansible-bootstrap.md`) in sync with the current state of the Ansible automation.
Key updates include:
- Acknowledging the presence of in-repository Ansible playbooks and shared roles.
- Correcting Ansible inventory output paths and Terraform output commands.
- Detailing the new `group_vars/all/{vars.yml,vault.yml}` structure.
- Updating Ansible prerequisites to include `passlib` for password hashing.
- Adding documentation for `iklim` system user creation, keyboard layout, and refined firewall rules.
- Removing outdated "Known Gaps" related to missing Ansible code.
6.5 KiB
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
Ek Python Bağımlılıkları
password_hash filtresi için passlib kontrol makinesinde gereklidir:
pipx inject ansible passlib
pipile kurduysanız:pip install passlib
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 binary’sinin 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/
vars.yml
vault.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
epel-release— ayrı task olarak önce kurulur;fail2ban,davfs2,htop,btopbu repoya bağımlı- temel paketler (
epel-releaseaktif olduktan sonra):curlwgetgitjqtarunzipbash-completiongettext— envsubst için; CI/CD deploy pipeline'larında gereklitreeca-certificatesfail2banchronypython3python3-pippython3-passlib—password_hashfiltresi için (EPEL)htop— interaktif proses izleme (EPEL)btop— kaynak monitörü, grafik arayüz (EPEL)
- timezone:
Europe/Istanbul - hostname ayarı
- klavye düzeni:
trq(Türkçe Q) - 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 noMaxAuthTries 3fail2banaktif edilir.dnf-automaticile otomatik güvenlik güncelleştirmeleri aktif edilir.iklimsistem kullanıcısı oluşturulur;wheelgrubuna eklenir (şifre vault'tan alınır).firewallddefault: incoming deny (drop zone), outgoing allow.- SSH kuralı önce
dropzone'a rich rule olarak yazılır, ardından default zonedropyapılır. - 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-cedocker-ce-clicontainerd.iodocker-buildx-plugindocker-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:
iklim-app-01üzerindedocker swarm init(Advertise/data path addr:10.20.10.11)iklim-app-02veiklim-app-03manager olarak join olur.iklim-db-01/02/03worker olarak join olur.- Overlay network oluşturulur:
iklimco-net - Node etiketleri:
iklim-app-*->type=serviceiklim-db-*->role=db
- Tüm node'lar
AVAILABILITY=Activekalı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 all -m pingbaşarılı olur.- 3 Swarm manager node
docker node lsiçinde Leader/Reachable görünür. - 3 DB node
docker node lsiçinde Worker olarak görünür. - Manager quorum sağlanır (3 manager, 1 kayıp tolere edilir).
iklimco-netoverlay network vardır.- Node etiketleri (
type=service,role=db) inspect ile doğrulanır. - Her node'da
/mnt/storageboxmount edilmiştir. - Public firewall sadece
22,80,443ingress'e izin verir.