Ansible ile Sunucu Otomasyonu: Başlangıç Rehberi
zafer ak
Yazar
Ansible, agentless çalışan bir IT otomasyon aracıdır. Sunucu yapılandırması, uygulama deployment ve orchestration için kullanılır.
Ansible Neden Kullanılır?
- Agentless: Hedef sunuculara agent kurulumu gerekmez
- YAML tabanlı: Okunabilir ve anlaşılır yapılandırma
- Idempotent: Aynı işlemi tekrar çalıştırmak güvenli
- Modüler: Binlerce hazır modül
- SSH bazlı: Standart SSH bağlantısı kullanır
Kurulum
# Ubuntu/Debian
sudo apt update
sudo apt install ansible
# pip ile
pip install ansible
# macOS
brew install ansible
# Versiyon kontrolü
ansible --version
Inventory (Envanter)
# /etc/ansible/hosts veya inventory.ini
[webservers]
web1.example.com
web2.example.com
[dbservers]
db1.example.com ansible_host=192.168.1.100
[all:vars]
ansible_user=deploy
ansible_ssh_private_key_file=~/.ssh/deploy_key
[webservers:vars]
http_port=80
max_clients=200
Ad-hoc Komutlar
# Ping testi
ansible all -m ping
# Komut çalıştırma
ansible webservers -m shell -a "uptime"
# Paket kurulumu
ansible webservers -m apt -a "name=nginx state=present" --become
# Dosya kopyalama
ansible webservers -m copy -a "src=./app.conf dest=/etc/app.conf"
# Servis yönetimi
ansible webservers -m service -a "name=nginx state=restarted" --become
Playbook Yazımı
# site.yml
---
- name: Web Server Kurulumu
hosts: webservers
become: yes
vars:
http_port: 80
domain: example.com
tasks:
- name: Nginx kurulumu
apt:
name: nginx
state: present
update_cache: yes
- name: Nginx yapılandırması
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/sites-available/default
notify: Restart Nginx
- name: Nginx başlatma
service:
name: nginx
state: started
enabled: yes
handlers:
- name: Restart Nginx
service:
name: nginx
state: restarted
Playbook Çalıştırma
# Çalıştır
ansible-playbook site.yml
# Belirli host'lar için
ansible-playbook site.yml --limit webservers
# Dry-run
ansible-playbook site.yml --check
# Verbose output
ansible-playbook site.yml -vvv
Jinja2 Template
# templates/nginx.conf.j2
server {
listen {{ http_port }};
server_name {{ domain }};
root /var/www/{{ domain }};
index index.html;
location / {
try_files $uri $uri/ =404;
}
{% if enable_ssl %}
listen 443 ssl;
ssl_certificate /etc/ssl/{{ domain }}.crt;
ssl_certificate_key /etc/ssl/{{ domain }}.key;
{% endif %}
}
Roles
Role yapısı oluşturma:
# Role oluştur
ansible-galaxy init roles/nginx
# Yapı
roles/nginx/
├── defaults/
│ └── main.yml # Varsayılan değişkenler
├── files/ # Statik dosyalar
├── handlers/
│ └── main.yml # Handler tanımları
├── meta/
│ └── main.yml # Role metadata
├── tasks/
│ └── main.yml # Ana görevler
├── templates/ # Jinja2 templates
└── vars/
└── main.yml # Değişkenler
Role Kullanımı
# site.yml
---
- hosts: webservers
become: yes
roles:
- common
- nginx
- php
- role: mysql
vars:
mysql_root_password: "secure_password"
Conditionals ve Loops
tasks:
# Conditional
- name: Install Apache (Debian)
apt:
name: apache2
state: present
when: ansible_os_family == "Debian"
- name: Install Apache (RedHat)
yum:
name: httpd
state: present
when: ansible_os_family == "RedHat"
# Loop
- name: Create users
user:
name: "{{ item.name }}"
groups: "{{ item.groups }}"
state: present
loop:
- { name: 'alice', groups: 'admin' }
- { name: 'bob', groups: 'developers' }
- { name: 'charlie', groups: 'developers' }
Ansible Vault
# Şifreli dosya oluştur
ansible-vault create secrets.yml
# Düzenle
ansible-vault edit secrets.yml
# Playbook çalıştır
ansible-playbook site.yml --ask-vault-pass
# Vault password file ile
ansible-playbook site.yml --vault-password-file .vault_pass
Sonuç
Ansible, sunucu yönetimini ve deployment süreçlerini otomatikleştirmek için güçlü bir araçtır. YAML tabanlı yapısı sayesinde öğrenmesi kolaydır ve hızla produktif olabilirsiniz.