Ansible kullanmaya başladığınızda, her şeyi sıfırdan yazmak zorunda olmadığınızı fark etmek ciddi bir rahatlama yaratıyor. Galaxy tam da bu noktada devreye giriyor: topluluk tarafından geliştirilmiş, test edilmiş ve paylaşıma açılmış rolleri birkaç komutla indirip kullanabileceğiniz bir ekosistem. Bir web sunucusu kurmak mı istiyorsunuz? NGINX rolü hazır. PostgreSQL yapılandırması mı? Zaten yazılmış. Siz sadece indirin, parametreleri ayarlayın ve çalıştırın.
Bu yazıda Galaxy’yi gerçek dünya senaryolarıyla nasıl kullanacağınızı, indirdiğiniz rolleri nasıl özelleştireceğinizi ve production ortamına almadan önce nelere dikkat etmeniz gerektiğini konuşacağız.
Ansible Galaxy Nedir, Neden Kullanmalıyız?
Ansible Galaxy, Ansible rollerinin ve koleksiyonlarının paylaşıldığı merkezi bir depodur. Adres olarak galaxy.ansible.com üzerinden erişebilirsiniz. Burada binlerce rol bulunuyor, gönüllüler ve şirketler tarafından geliştirilmiş, topluluk tarafından derecelendirilmiş.
Sıfırdan bir Apache rolü yazmak saatler alabilir. Değişkenleri tanımlamak, handler’ları kurmak, farklı dağıtımlar için koşullar eklemek… Oysa Galaxy’de geerlingguy.apache gibi bir rol zaten bunu çözmüş, üstelik Ubuntu, CentOS, Debian gibi pek çok dağıtımı destekliyor.
Tabii ki her rolü kör kör kullanmak doğru değil. Kaynak koduna bakmak, ne kadar aktif geliştirildiğini kontrol etmek ve kendi ortamınıza uygunluğunu test etmek gerekiyor. Ama başlangıç noktası olarak çok değerli.
ansible-galaxy Komutuna Giriş
Ansible kurulumunuzla birlikte ansible-galaxy komutu otomatik geliyor. Temel komutlara bakalım:
# Rol arama
ansible-galaxy search nginx
# Rol hakkında bilgi alma
ansible-galaxy info geerlingguy.nginx
# Rol indirme
ansible-galaxy install geerlingguy.nginx
# Yüklü rolleri listeleme
ansible-galaxy list
# Rol silme
ansible-galaxy remove geerlingguy.nginx
# Versiyon belirterek indirme
ansible-galaxy install geerlingguy.nginx,2.8.0
Varsayılan olarak roller ~/.ansible/roles dizinine indirilir. Proje bazlı çalışmak istiyorsanız bunu değiştirebilirsiniz, biraz sonra buna geleceğiz.
requirements.yml ile Rol Yönetimi
Tek tek ansible-galaxy install komutu çalıştırmak pratik değil, özellikle birden fazla sunucuyu yönetiyorsanız ya da CI/CD pipeline’ınız varsa. Bunun yerine requirements.yml dosyası kullanın. Bu dosya hem projenizin bağımlılıklarını belgeler hem de tek komutla hepsini indirir.
# requirements.yml
---
roles:
- name: geerlingguy.nginx
version: "3.2.0"
- name: geerlingguy.php
version: "5.0.0"
- name: geerlingguy.mysql
version: "4.3.2"
- name: dev-sec.ssh-hardening
version: "8.4.0"
- src: https://github.com/yourusername/custom-role.git
scm: git
version: main
name: my_custom_role
collections:
- name: community.general
version: "7.0.0"
- name: ansible.posix
version: "1.5.4"
Dosyayı hazırladıktan sonra tek komutla hepsini indiriyorsunuz:
# Tüm bağımlılıkları indir
ansible-galaxy install -r requirements.yml
# Proje dizinine indir (önerilen)
ansible-galaxy install -r requirements.yml -p ./roles
# Koleksiyonları da indir
ansible-galaxy collection install -r requirements.yml
-p ./roles parametresi önemli. Bu şekilde roller global dizine değil, projenizin roles klasörüne iniyor. Takım çalışmasında veya Docker container içinde Ansible çalıştırıyorsanız bu yaklaşım çok daha temiz.
ansible.cfg ile Yapılandırma
Proje bazlı rol dizini kullanmak için ansible.cfg dosyanızı düzenleyin:
# ansible.cfg
[defaults]
inventory = inventory/
roles_path = ./roles:~/.ansible/roles
collections_paths = ./collections:~/.ansible/collections
remote_user = ansible
private_key_file = ~/.ssh/id_ed25519
host_key_checking = False
retry_files_enabled = False
stdout_callback = yaml
[privilege_escalation]
become = True
become_method = sudo
become_user = root
roles_path satırına dikkat edin. İki dizin var: önce ./roles (proje dizini) sonra ~/.ansible/roles (global). Ansible önce proje dizininde arar, bulamazsa global’e bakar.
Gerçek Dünya Senaryosu: LEMP Stack Kurulumu
Diyelim ki Ubuntu 22.04 üzerine Laravel uygulaması için LEMP stack (Linux, Nginx, MySQL, PHP) kuracaksınız. Bunu Galaxy rolleriyle nasıl yaparsınız?
Önce proje yapısını oluşturalım:
mkdir -p lemp-stack/{inventory,group_vars,host_vars,roles}
cd lemp-stack
touch ansible.cfg requirements.yml site.yml
requirements.yml dosyamız:
---
roles:
- name: geerlingguy.nginx
version: "3.2.0"
- name: geerlingguy.php
version: "5.0.0"
- name: geerlingguy.mysql
version: "4.3.2"
- name: geerlingguy.php-mysql
version: "1.5.0"
- name: dev-sec.ssh-hardening
version: "8.4.0"
Rolleri indirelim:
ansible-galaxy install -r requirements.yml -p ./roles
Şimdi envanter dosyamızı hazırlayalım:
# inventory/hosts
[webservers]
web01 ansible_host=192.168.1.10
web02 ansible_host=192.168.1.11
[dbservers]
db01 ansible_host=192.168.1.20
[all:vars]
ansible_user=ubuntu
ansible_python_interpreter=/usr/bin/python3
Rolleri Özelleştirme: Variables ile Çalışmak
Galaxy rollerinin gücü, değişkenler aracılığıyla özelleştirilebilir olmalarından geliyor. Önce rolün defaults/main.yml dosyasına bakın, hangi değişkenlerin var olduğunu görün. Bunu şöyle yapabilirsiniz:
# Rolün default değişkenlerini incele
cat roles/geerlingguy.nginx/defaults/main.yml
# Ya da doğrudan GitHub'da bak
ansible-galaxy info geerlingguy.nginx
group_vars kullanarak rolleri özelleştirelim:
# group_vars/webservers.yml
---
# Nginx ayarları
nginx_vhosts:
- listen: "80"
server_name: "app.orneksite.com"
root: "/var/www/laravel/public"
index: "index.php index.html"
extra_parameters: |
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ .php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
nginx_remove_default_vhost: true
nginx_worker_processes: "auto"
# PHP ayarları
php_version: "8.1"
php_packages:
- php8.1-cli
- php8.1-fpm
- php8.1-mysql
- php8.1-xml
- php8.1-mbstring
- php8.1-zip
- php8.1-curl
- php8.1-gd
php_memory_limit: "256M"
php_max_execution_time: "60"
php_upload_max_filesize: "64M"
php_post_max_size: "64M"
php_fpm_pools:
- name: www
user: www-data
group: www-data
listen: /var/run/php/php8.1-fpm.sock
listen.owner: www-data
listen.group: www-data
pm: dynamic
pm.max_children: 50
pm.start_servers: 5
pm.min_spare_servers: 5
pm.max_spare_servers: 10
# group_vars/dbservers.yml
---
# MySQL ayarları
mysql_root_password: "{{ vault_mysql_root_password }}"
mysql_databases:
- name: laravel_db
encoding: utf8mb4
collation: utf8mb4_unicode_ci
mysql_users:
- name: laravel_user
host: "192.168.1.%"
password: "{{ vault_mysql_user_password }}"
priv: "laravel_db.*:ALL"
mysql_bind_address: "0.0.0.0"
mysql_innodb_buffer_pool_size: "512M"
mysql_innodb_log_file_size: "128M"
Parolaları Ansible Vault ile koruyalım:
# Vault dosyası oluştur
ansible-vault create group_vars/all/vault.yml
# İçeriği ekle
vault_mysql_root_password: "SuperGizliParola123!"
vault_mysql_user_password: "LaravelGizliParola456!"
Playbook Yazımı
Artık her şeyi bir araya getirelim:
# site.yml
---
- name: Web sunucularını yapılandır
hosts: webservers
become: yes
pre_tasks:
- name: Sistem güncellemesi
apt:
update_cache: yes
cache_valid_time: 3600
when: ansible_os_family == "Debian"
- name: Temel paketleri kur
apt:
name:
- git
- curl
- unzip
- software-properties-common
state: present
roles:
- role: geerlingguy.nginx
tags: nginx
- role: geerlingguy.php
tags: php
- role: geerlingguy.php-mysql
tags: php
- role: dev-sec.ssh-hardening
tags: security
post_tasks:
- name: Nginx servisini başlat
service:
name: nginx
state: started
enabled: yes
- name: PHP-FPM servisini başlat
service:
name: "php{{ php_version }}-fpm"
state: started
enabled: yes
- name: Veritabanı sunucularını yapılandır
hosts: dbservers
become: yes
vars_files:
- group_vars/all/vault.yml
roles:
- role: geerlingguy.mysql
tags: mysql
- role: dev-sec.ssh-hardening
tags: security
Playbook’u çalıştırmak:
# Önce dry-run (check mode)
ansible-playbook site.yml --check --diff --ask-vault-pass
# Sadece belirli tag'leri çalıştır
ansible-playbook site.yml --tags "nginx,php" --ask-vault-pass
# Sadece belirli host için çalıştır
ansible-playbook site.yml --limit web01 --ask-vault-pass
# Gerçek çalıştırma
ansible-playbook site.yml --ask-vault-pass
Bir Rolü İncelemek ve Güvenli Kullanmak
Galaxy’den bir rol indirmeden önce birkaç şeyi kontrol etmeyi alışkanlık haline getirin:
İndirme sayısı ve yıldızlar: Çok indirilen ve yüksek puan alan roller genellikle daha güvenilirdir. geerlingguy.* rolleri bu açıdan endüstri standardı sayılır.
Son güncelleme tarihi: 2-3 yıldır güncellenmemiş bir rol, desteklemediğiniz eski bir dağıtım için yazılmış olabilir.
GitHub Issues: Açık kritik bug’lar var mı? Yeni dağıtım versiyonlarıyla uyumluluk sorunları bildiriliyor mu?
Lisans: MIT veya Apache 2.0 olan rolleri tercih edin.
# Bir rolün meta bilgilerini gör
ansible-galaxy info geerlingguy.nginx
# Rolün kaynak kodunu direkt incele
ls -la roles/geerlingguy.nginx/
cat roles/geerlingguy.nginx/tasks/main.yml
cat roles/geerlingguy.nginx/defaults/main.yml
cat roles/geerlingguy.nginx/meta/main.yml
meta/main.yml dosyası özellikle önemli çünkü rolün bağımlılıklarını (dependencies) gösteriyor. Bir rol başka rollere bağımlıysa, Galaxy onları otomatik indirebilir.
Galaxy Koleksiyonları
Galaxy sadece rol dağıtmıyor artık, koleksiyonlar da var. Koleksiyonlar daha kapsamlı paketler: roller, modüller, plugin’ler ve filtreler bir arada geliyor.
# Koleksiyon ara
ansible-galaxy collection search community.general
# Koleksiyon indir
ansible-galaxy collection install community.general
# Belirli versiyon
ansible-galaxy collection install community.general:7.0.0
# Koleksiyonları listele
ansible-galaxy collection list
Koleksiyonları playbook’ta kullanmak biraz farklı:
# Koleksiyon modülü kullanımı - FQCN (Fully Qualified Collection Name) ile
---
- name: Koleksiyon modülü örneği
hosts: webservers
become: yes
collections:
- community.general
- ansible.posix
tasks:
- name: UFW firewall kuralı ekle
community.general.ufw:
rule: allow
port: "80"
proto: tcp
- name: Sysctl ayarı
ansible.posix.sysctl:
name: net.core.somaxconn
value: "65535"
state: present
reload: yes
- name: Timezone ayarla
community.general.timezone:
name: Europe/Istanbul
Kendi Rolünüzü Galaxy’ye Yüklemek
Yazdığınız ve başkalarıyla paylaşmak istediğiniz bir rolünüz varsa süreci şöyle:
# Ansible Galaxy namespace oluşturun (galaxy.ansible.com'da)
# GitHub hesabınızla bağlantı kurun
# Rol için iskelet oluştur
ansible-galaxy role init benim_nginx_rolum
# Oluşturulan yapı:
# benim_nginx_rolum/
# ├── defaults/main.yml
# ├── files/
# ├── handlers/main.yml
# ├── meta/main.yml
# ├── README.md
# ├── tasks/main.yml
# ├── templates/
# ├── tests/
# │ ├── inventory
# │ └── test.yml
# └── vars/main.yml
# meta/main.yml'yi doldurun
# GitHub'a push edin
# galaxy.ansible.com'da import edin
ansible-galaxy role import github_kullanici_adi benim_nginx_rolum
CI/CD Pipeline’ında Galaxy Kullanımı
GitLab CI veya GitHub Actions kullanıyorsanız, pipeline’ınızda Galaxy rollerini nasıl yöneteceğinizi bilmek lazım:
# .gitlab-ci.yml örneği
---
stages:
- lint
- test
- deploy
variables:
ANSIBLE_FORCE_COLOR: "true"
PY_COLORS: "1"
.ansible_base:
image: cytopia/ansible:latest
before_script:
- ansible --version
- ansible-galaxy install -r requirements.yml -p ./roles
- ansible-galaxy collection install -r requirements.yml
lint:
extends: .ansible_base
stage: lint
script:
- ansible-lint site.yml
- yamllint .
test:
extends: .ansible_base
stage: test
script:
- ansible-playbook site.yml --syntax-check -i inventory/
- |
ansible-playbook site.yml
--check
--diff
-i inventory/staging/
--vault-password-file .vault_pass
deploy_staging:
extends: .ansible_base
stage: deploy
environment: staging
script:
- |
ansible-playbook site.yml
-i inventory/staging/
--vault-password-file .vault_pass
only:
- develop
deploy_production:
extends: .ansible_base
stage: deploy
environment: production
script:
- |
ansible-playbook site.yml
-i inventory/production/
--vault-password-file .vault_pass
only:
- main
when: manual
Bu pipeline’da dikkat edilmesi gereken nokta: requirements.yml commit’leniyor ama roles/ dizini .gitignore‘a ekleniyor. Pipeline her çalıştığında rolleri taze indiriyor. Bu yaklaşım, role versiyonlarını requirements.yml‘de kilitlediğiniz sürece çok güvenli.
# .gitignore
roles/
collections/
*.retry
.vault_pass
Sık Karşılaşılan Sorunlar ve Çözümleri
Rol bulunamıyor hatası:
# Galaxy ulaşılamıyor olabilir, cache'e alınmış versiyonu kullan
ansible-galaxy install -r requirements.yml --no-deps
# Proxy arkasındaysanız
export https_proxy=http://proxy.sirket.com:8080
ansible-galaxy install -r requirements.yml
Bağımlılık çakışması:
Bir rol belirli bir versiyonunu isterken başka bir rol farklı versiyon istiyorsa sorun çıkıyor. meta/main.yml dosyalarını inceleyip çakışan bağımlılıkları manuel çözmeniz gerekiyor.
“Role not found in configured paths” hatası:
# ansible.cfg'deki roles_path doğru mu kontrol et
ansible-config dump | grep ROLES_PATH
# Rolün gerçekten indirildiğini doğrula
ansible-galaxy list | grep geerlingguy
Eski rol versiyonunu güncelleme:
# Force install ile üstüne yaz
ansible-galaxy install -r requirements.yml -p ./roles --force
# Ya da sadece belirli rolü güncelle
ansible-galaxy install geerlingguy.nginx --force
Rol Testleri: Molecule ile Entegrasyon
Ciddiye aldığınız projelerde Galaxy rollerini veya kendi rollerinizi Molecule ile test etmek çok değerli:
# Molecule kur
pip install molecule molecule-docker
# Mevcut bir role Molecule ekle
cd roles/benim_nginx_rolum
molecule init scenario default --driver-name docker
# Test çalıştır
molecule test
# Sadece belirli aşama
molecule converge
molecule verify
molecule destroy
Molecule, Docker container başlatıyor, rolünüzü içine uygulayıp sonucu doğruluyor. CI/CD pipeline’ına entegre ettiğinizde production’a gitmeden önce rolün çalışıp çalışmadığını anlıyorsunuz.
Sonuç
Galaxy, Ansible ekosisteminin belki de en güçlü yanlarından biri. Yüzlerce satır yazmak yerine topluluktan olgunlaşmış, test edilmiş rolleri alıp kendi ortamınıza uyarlayabiliyorsunuz. Bu hem zaman kazandırıyor hem de genellikle kendi sıfırdan yazdığınızdan daha kaliteli sonuç veriyor.
Ama körü körüne güvenmek de doğru değil. Üretim ortamına geçmeden önce rolün kaynak koduna bakın, değişkenlerini anlayın, staging ortamında test edin. requirements.yml‘de versiyonları kilitleyin, yoksa bir gün beklenmedik bir güncelleme sizi şaşırtabilir.
Pratik önerim: Başlangıç için geerlingguy.* rollerini referans alın. Jeff Geerling’in rolleri hem kaliteli hem de Ansible’ı öğrenmek için mükemmel örnekler. Zamanla hangi rollerin işe yaradığını, hangilerinin kendi ihtiyaçlarınız için yetersiz kaldığını görecek ve kendi rollerinizi geliştirmeye başlayacaksınız. Galaxy, bu öğrenme sürecini önemli ölçüde hızlandırıyor.