Ansible Galaxy ile Hazır Role İndirme ve Kullanımı

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.

Yorum yapın