Ansible’ı komut satırından kullanmak işe yarıyor, ama ekibiniz büyüdükçe “o playbook’u kim çalıştırdı, hangi envantere karşı, ne zaman?” sorularına cevap bulmak zorlaşıyor. AWX tam bu noktada devreye giriyor. Ansible’ın açık kaynaklı web arayüzü olan AWX, playbook çalıştırma geçmişini tutuyor, rol tabanlı erişim kontrolü sunuyor ve işleri zamanlanmış olarak çalıştırmanızı sağlıyor. Kısacası Ansible’ı kurumsal bir yapıya kavuşturuyor.
Bu yazıda AWX’i Kubernetes üzerinde nasıl kuracağınızı, temel konfigürasyonları nasıl yapacağınızı ve gerçek dünya senaryolarında nasıl kullanacağınızı adım adım anlatacağım.
AWX Nedir, Neden Kullanmalısınız?
AWX, Red Hat’in ticari ürünü Ansible Tower’ın açık kaynaklı üst projesidir. Yani Tower’da gördüğünüz özelliklerin büyük çoğunluğu AWX’de de mevcut, üstelik ücretsiz.
AWX’in sunduğu temel özellikler şunlardır:
- Web tabanlı arayüz: Playbook’larınızı tarayıcıdan çalıştırın, terminale ihtiyaç duymayın
- RBAC (Role Based Access Control): Hangi ekip hangi projeye erişebilir, bunu granüler düzeyde kontrol edin
- Job Templates: Tekrar tekrar kullanabileceğiniz playbook konfigürasyonları tanımlayın
- Zamanlanmış görevler: Cron gibi, ama görsel arayüzle ve çalışma geçmişiyle
- Credential yönetimi: SSH anahtarları, vault şifreleri, bulut sağlayıcı token’larını güvenli saklayın
- Webhook entegrasyonu: GitHub/GitLab’dan push geldiğinde otomatik playbook tetikleyin
- Gerçek zamanlı çıktı: Job çalışırken anlık log takibi
Bir örnek senaryo düşünelim: Geliştirme ekibiniz her sabah test ortamını sıfırlamasını istiyor. AWX olmadan birinin terminale oturup playbook çalıştırması gerekiyor. AWX ile bu işi zamanlanmış bir job haline getirip herkesin ilgili butona tıklayabileceği bir sisteme dönüştürüyorsunuz.
Kurulum Gereksinimleri
AWX artık Kubernetes üzerinde çalışıyor. Eski Docker Compose kurulum yöntemi deprecated oldu, bu yüzden doğrudan Kubernetes yolunu anlatacağım. Tek node için K3s kullanmak en pratik çözüm.
Minimum sistem gereksinimleri:
- CPU: 4 core (önerilen 8 core)
- RAM: 8 GB (önerilen 16 GB)
- Disk: 40 GB boş alan
- İşletim sistemi: Ubuntu 22.04 veya RHEL/Rocky Linux 8+
- Kubernetes: K3s, Minikube veya full K8s cluster
Bu yazıda Ubuntu 22.04 üzerinde K3s kullanacağız.
K3s Kurulumu
Önce sistemi güncelleyelim ve gerekli paketleri yükleyelim:
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget git python3-pip
# K3s kurulumu
curl -sfL https://get.k3s.io | sh -
# K3s servisinin durumunu kontrol et
sudo systemctl status k3s
# kubectl erişimini ayarla
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config
chmod 600 ~/.kube/config
# Cluster'ın ayakta olduğunu doğrula
kubectl get nodes
Node durumu Ready olarak görünüyorsa devam edebiliriz.
AWX Operator Kurulumu
AWX, Kubernetes üzerinde Operator pattern’i kullanıyor. Önce AWX Operator’ı kuruyoruz, sonra operator aracılığıyla AWX instance’ı oluşturuyoruz.
# Kustomize aracını kur
curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash
sudo mv kustomize /usr/local/bin/
# AWX Operator için çalışma dizini oluştur
mkdir ~/awx-install && cd ~/awx-install
# kustomization.yaml dosyası oluştur
cat > kustomization.yaml << 'EOF'
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- github.com/ansible/awx-operator/config/default?ref=2.10.0
images:
- name: quay.io/ansible/awx-operator
newTag: 2.10.0
namespace: awx
EOF
# Namespace oluştur ve operator'ı kur
kubectl create namespace awx
kustomize build . | kubectl apply -f -
# Operator pod'unun başlamasını bekle
kubectl get pods -n awx --watch
Pod durumu Running olana kadar bekleyin. Bu genellikle 2-3 dakika sürüyor.
AWX Instance Oluşturma
Operator kurulduktan sonra AWX instance’ımızı tanımlıyoruz:
# AWX instance manifest dosyası
cat > awx-instance.yaml << 'EOF'
---
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
name: awx-demo
namespace: awx
spec:
service_type: nodeport
nodeport_port: 30080
admin_user: admin
admin_email: [email protected]
web_resource_requirements:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 1000m
memory: 2Gi
task_resource_requirements:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 2000m
memory: 4Gi
postgres_storage_requirements:
requests:
storage: 8Gi
EOF
kubectl apply -f awx-instance.yaml
# Kurulum sürecini izle (10-15 dakika sürebilir)
kubectl logs -f deployments/awx-operator-controller-manager -n awx -c awx-manager
Kurulum tamamlandığında tüm pod’ların durumunu kontrol edelim:
kubectl get pods -n awx
# Beklenen çıktı:
# awx-demo-postgres-13-0 1/1 Running
# awx-demo-task-xxxx 4/4 Running
# awx-demo-web-xxxx 3/3 Running
# awx-operator-controller-manager 2/2 Running
İlk Giriş ve Şifre Alma
AWX admin şifresini Kubernetes secret’tan almanız gerekiyor:
# Admin şifresini al
kubectl get secret awx-demo-admin-password -n awx -o jsonpath="{.data.password}" | base64 --decode
echo ""
# Servis portunu kontrol et
kubectl get svc -n awx | grep awx-demo-web
Tarayıcınızdan http://sunucu-ip:30080 adresine gidin. Kullanıcı adı admin, şifre ise yukarıdaki komuttan aldığınız değer.
İlk girişte şifreyi mutlaka değiştirin. Sağ üst köşeden profil ikonuna tıklayıp “User Details” bölümünden yeni şifrenizi belirleyin.
Temel Konfigürasyon: İlk Projeyi Oluşturma
Şimdi gerçek bir senaryo üzerinden gidelim. Nginx web sunucularını yöneten bir playbook’umuz var ve bunu AWX’e entegre edeceğiz.
Önce playbook’larımızı tutan bir Git reposu olduğunu varsayalım. Repomuzun yapısı şöyle:
# Örnek proje yapısı
ansible-playbooks/
├── inventories/
│ ├── production/
│ │ ├── hosts
│ │ └── group_vars/
│ └── staging/
│ └── hosts
├── roles/
│ └── nginx/
│ ├── tasks/
│ │ └── main.yml
│ └── templates/
│ └── nginx.conf.j2
├── site.yml
└── deploy-nginx.yml
AWX arayüzünde sırasıyla şunları yapacağız:
1. Credential oluşturma
Sol menüden “Credentials” > “Add” yolunu izleyin.
- Name: production-ssh-key
- Credential Type: Machine
- Username: ansible
- SSH Private Key: Sunuculara erişim için kullandığınız private key’i yapıştırın
Git reposuna erişim için de bir credential oluşturun:
- Name: github-access
- Credential Type: Source Control
- Username: github-kullanici-adi
- Password veya Token: GitHub personal access token’ınız
2. Proje oluşturma
“Projects” > “Add”:
- Name: Nginx Yonetim Playbooks
- Organization: Default
- Source Control Type: Git
- Source Control URL:
https://github.com/sirketiniz/ansible-playbooks.git - Source Control Branch: main
- Credential: github-access
Projeyi kaydettiğinizde AWX otomatik olarak repoyu senkronize etmeye başlar. Sol taraftaki dönen ikon yeşile dönünce sync tamamlanmış demektir.
3. Inventory oluşturma
“Inventories” > “Add” > “Inventory”:
- Name: Production Sunucular
- Organization: Default
Inventory oluşturduktan sonra “Sources” sekmesine geçin ve Git’ten inventory çekmek için kaynak ekleyin ya da “Hosts” sekmesinden manuel olarak sunucularınızı ekleyin.
Manuel host ekleme için “Hosts” > “Add”:
- Name: web01.sirketiniz.com
- Variables:
ansible_host: 192.168.1.101
ansible_user: ansible
ansible_port: 22
Job Template Oluşturma
Artık her şey hazır, job template oluşturabiliriz:
# Örnek playbook içeriği (deploy-nginx.yml)
---
- name: Nginx Kurulum ve Konfigurasyon
hosts: webservers
become: yes
vars:
nginx_port: 80
nginx_worker_processes: auto
tasks:
- name: Nginx paketini kur
apt:
name: nginx
state: present
update_cache: yes
when: ansible_os_family == "Debian"
- name: Nginx konfigurasyonunu deploy et
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
backup: yes
notify: Nginx servisini yeniden baslat
- name: Nginx servisini aktif et
service:
name: nginx
state: started
enabled: yes
handlers:
- name: Nginx servisini yeniden baslat
service:
name: nginx
state: restarted
AWX arayüzünde “Templates” > “Add” > “Job Template”:
- Name: Nginx Deploy – Production
- Job Type: Run
- Inventory: Production Sunucular
- Project: Nginx Yonetim Playbooks
- Playbook: deploy-nginx.yml
- Credentials: production-ssh-key
- Variables:
nginx_port: 80
nginx_worker_processes: 4
environment: production
“Enable Webhook” seçeneğini de işaretleyebilirsiniz, böylece GitHub’a push yapıldığında otomatik tetiklensin.
Survey ile Dinamik Job Template’ler
AWX’in en kullanışlı özelliklerinden biri Survey. Job çalıştırmadan önce kullanıcıya form gösterip değerleri playbook’a geçirebiliyorsunuz. Örneğin hangi ortama deploy yapılacağını sormak için:
Job Template düzenleme ekranında “Survey” sekmesine geçin ve “Add Question” butonuna tıklayın:
- Question: Hangi ortama deploy yapilacak?
- Answer Variable Name: target_environment
- Answer Type: Multiple Choice (single select)
- Choices:
– staging – production – development
Bir soru daha ekleyin:
- Question: Nginx versiyon
- Answer Variable Name: nginx_version
- Answer Type: Text
- Default Answer: latest
- Required: işaretli
Artık bu template çalıştırıldığında kullanıcıya bu sorular sorulacak ve cevaplar playbook’a variable olarak geçilecek.
Zamanlanmış Görevler (Schedules)
Her gece saat 02:00’de staging ortamını güncellemek istiyorsunuz diyelim. Job Template sayfasında “Schedules” sekmesine geçin:
- Name: Gece Staging Guncelleme
- Start Date/Time: Bugünün tarihi, 02:00
- Local Time Zone: Europe/Istanbul
- Repeat Frequency: Week
- Days: Monday, Tuesday, Wednesday, Thursday, Friday
Bu kadar. AWX her çalışma iş saatleri dışında staging ortamınızı otomatik güncelleyecek.
RBAC Konfigürasyonu
Gerçek bir kurumda farklı ekiplerin farklı yetkilere ihtiyacı var. AWX’te bunu şöyle yönetebilirsiniz:
“Organizations” bölümünden organizasyonunuzu seçin, ardından “Teams” kısmından ekipler oluşturun:
- DevOps Ekibi: Tüm projelere tam erişim
- Gelistirici Ekibi: Sadece staging template’lerini çalıştırabilir, production’a sadece okuma yetkisi
- Izleme Ekibi: Sadece job geçmişini görebilir, hiçbir şey çalıştıramaz
Bir team’e yetki atamak için ilgili kaynağa (template, inventory, credential) gidin ve “Access” sekmesinden “Add” butonuna tıklayın. Açılan pencerede team’i seçip role atayın:
- Admin: Tam yetki
- Use: Kaynağı kullanabilir, çalıştırabilir
- Read: Sadece okuyabilir
API ile AWX Otomasyonu
AWX’in REST API’si var ve bunu kullanarak AWX’i kendiniz otomatikleştirebilirsiniz. Örneğin CI/CD pipeline’ınızdan job tetiklemek için:
# AWX API token al
AWX_URL="http://awx.sirketiniz.com:30080"
AWX_USER="admin"
AWX_PASS="guclu-sifreniz"
TOKEN=$(curl -s -X POST
-H "Content-Type: application/json"
-d '{"description":"CI/CD Token","application":null,"scope":"write"}'
-u "${AWX_USER}:${AWX_PASS}"
"${AWX_URL}/api/v2/tokens/" | python3 -c "import sys,json; print(json.load(sys.stdin)['token'])")
echo "Token: $TOKEN"
# Job Template ID'sini öğren
curl -s -H "Authorization: Bearer $TOKEN"
"${AWX_URL}/api/v2/job_templates/" | python3 -m json.tool | grep -A2 '"name"'
# Job Template'i çalıştır (ID: 5 olduğunu varsayalım)
JOB_RESPONSE=$(curl -s -X POST
-H "Authorization: Bearer $TOKEN"
-H "Content-Type: application/json"
-d '{"extra_vars": {"target_environment": "staging", "nginx_version": "1.24"}}'
"${AWX_URL}/api/v2/job_templates/5/launch/")
JOB_ID=$(echo $JOB_RESPONSE | python3 -c "import sys,json; print(json.load(sys.stdin)['job'])")
echo "Job ID: $JOB_ID"
# Job durumunu takip et
while true; do
STATUS=$(curl -s -H "Authorization: Bearer $TOKEN"
"${AWX_URL}/api/v2/jobs/${JOB_ID}/" | python3 -c "import sys,json; print(json.load(sys.stdin)['status'])")
echo "$(date): Job durumu: $STATUS"
if [[ "$STATUS" == "successful" || "$STATUS" == "failed" || "$STATUS" == "error" ]]; then
break
fi
sleep 10
done
echo "Final durum: $STATUS"
[ "$STATUS" == "successful" ] && exit 0 || exit 1
Bu scripti GitLab CI veya Jenkins pipeline’ınıza ekleyerek deploy işlemini AWX üzerinden yönetebilirsiniz.
Webhook ile GitHub Entegrasyonu
Kod merge edildiğinde otomatik deploy için webhook kurulumu:
# Job Template'de webhook key'i al
curl -s -H "Authorization: Bearer $TOKEN"
"${AWX_URL}/api/v2/job_templates/5/" | python3 -c
"import sys,json; d=json.load(sys.stdin); print(f'Webhook Key: {d["webhook_key"]}')"
GitHub reposunda Settings > Webhooks > Add webhook:
- Payload URL:
http://awx.sirketiniz.com:30080/api/v2/job_templates/5/github/ - Content type: application/json
- Secret: AWX’ten aldığınız webhook key
- Events: Just the push event
Artık main branch’e her push yapıldığında AWX otomatik olarak ilgili job template’i tetikleyecek.
Yaygın Sorunlar ve Çözümleri
Kurulum sırasında karşılaşabileceğiniz sorunlar:
Pod’lar başlamıyor:
# Pod event'lerini incele
kubectl describe pod awx-demo-web-xxxxx -n awx
# Disk alanı sorunu olabilir, kontrol et
df -h
# Persistent Volume durumunu kontrol et
kubectl get pvc -n awx
AWX arayüzüne erişilemiyor:
# Servis durumunu kontrol et
kubectl get svc -n awx
# NodePort doğru mu açık?
sudo ss -tlnp | grep 30080
# Firewall kurallarını kontrol et
sudo ufw status
sudo ufw allow 30080/tcp
Job çalışıyor ama sunucuya bağlanamıyor:
- Credential’ın doğru olduğunu kontrol edin
- AWX pod’u ile hedef sunucu arasında network erişimi olduğunu doğrulayın
- SSH key’in ilgili kullanıcıya ait authorized_keys dosyasında kayıtlı olduğunu kontrol edin
# AWX task pod'una bağlanıp test et
kubectl exec -it deployment/awx-demo-task -n awx -- bash
ssh -i /tmp/test-key ansible@hedef-sunucu
Backup ve Recovery
Üretim ortamında AWX verilerini düzenli yedeklemek şart:
#!/bin/bash
# awx-backup.sh
BACKUP_DIR="/backup/awx/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
# PostgreSQL veritabanını yedekle
kubectl exec -n awx awx-demo-postgres-13-0 --
pg_dump -U awx awx > $BACKUP_DIR/awx-db.sql
# AWX secret'larını yedekle
kubectl get secrets -n awx -o yaml > $BACKUP_DIR/awx-secrets.yaml
# Konfigürasyon dosyalarını yedekle
cp ~/awx-install/awx-instance.yaml $BACKUP_DIR/
cp ~/awx-install/kustomization.yaml $BACKUP_DIR/
# Eski yedekleri temizle (30 günden eski)
find /backup/awx -type d -mtime +30 -exec rm -rf {} +
echo "Backup tamamlandi: $BACKUP_DIR"
ls -lh $BACKUP_DIR
Bu scripti cron’a ekleyin:
# /etc/cron.d/awx-backup
0 3 * * * root /opt/scripts/awx-backup.sh >> /var/log/awx-backup.log 2>&1
Performans Tuning
Üretim ortamında AWX’i daha verimli çalıştırmak için birkaç önemli ayar:
# awx-instance.yaml içinde kaynak limitlerini artır
spec:
web_resource_requirements:
requests:
cpu: 1000m
memory: 2Gi
limits:
cpu: 2000m
memory: 4Gi
task_resource_requirements:
requests:
cpu: 1000m
memory: 2Gi
limits:
cpu: 4000m
memory: 8Gi
# Aynı anda çalışabilecek max job sayisi
task_privileged: false
web_replicas: 2
task_replicas: 2
Değişikliği uygulayın:
kubectl apply -f awx-instance.yaml -n awx
# Rollout durumunu izle
kubectl rollout status deployment/awx-demo-web -n awx
kubectl rollout status deployment/awx-demo-task -n awx
Sonuç
AWX, Ansible kullanımını bireysel komut satırı alışkanlığından kurumsal bir platforma taşıyor. Ekibinizin boyutu ne olursa olsun, “ben o playbook’u dün çalıştırdım ama ne oldu bilmiyorum” sorununu ortadan kaldırıyor. Her şeyin kaydedildiği, yetkilendirildiği ve izlendiği bir otomasyon altyapısı kurmuş oluyorsunuz.
Kurulumun karmaşık göründüğünü fark ettim ama K3s üzerinde bir kez kurup çalıştırdıktan sonra günlük kullanımı son derece kolay. İlk hafta job template’lerinizi oluşturmak biraz zaman alıyor, ama bir kez kurulduktan sonra ekibinizdeki herkes kendi alanında bağımsız çalışabiliyor.
Eğer AWX’in bakım yükünden kaçınmak istiyorsanız Red Hat Ansible Automation Platform’a göz atabilirsiniz, ama küçük ve orta ölçekli ekipler için AWX ihtiyacı fazlasıyla karşılıyor. Açık kaynak olduğu için topluluk desteği de oldukça güçlü, sorun yaşadığınızda GitHub issues ve AWX Google Groups’ta mutlaka cevap bulabiliyorsunuz.