Ansible ile veritabanı otomasyonu
Belirti
Amaç: Veritabanı kurulum, yapılandırma, kullanıcı ve yedek işlerini Ansible ile tekrarlanabilir ve idempotent (aynı playbook'u tekrar çalıştırınca sistemi bozmayan) hale getir.
1. Envanteri ve grupları tanımla
Hangi sunucuların hangi veritabanı rolünde olduğunu envanterde grupla; primary, replika ve yedek sunucularını ayrı gruplara koy. Statik INI/YAML envanteri veya bulut için dinamik envanter (aws_ec2, gcp_compute) kullan. Grup değişkenlerini group_vars/ altına, sunucuya özel olanları host_vars/ altına yaz.
PostgreSQL
[pg_primary]
db1.ornek.local
[pg_replica]
db2.ornek.local
[postgres:children]
pg_primary
pg_replica2. Doğru koleksiyonu kur (community.postgresql / community.mysql / community.mongodb)
Ansible çekirdeği veritabanı modüllerini artık ayrı koleksiyonlarda tutar; kullandığın motora göre koleksiyonu requirements.yml ile kur. PostgreSQL için community.postgresql (postgresql_db, postgresql_user, postgresql_privs), MySQL/MariaDB için community.mysql (mysql_db, mysql_user), MongoDB için community.mongodb koleksiyonunu kullan. Hedef sunucuda ilgili Python istemcisi (psycopg2, PyMySQL, pymongo) kurulu olmalı.
PostgreSQL
# requirements.yml
collections:
- name: community.postgresql
# kur:
ansible-galaxy collection install -r requirements.ymlMySQL
collections:
- name: community.mysqlMongoDB
collections:
- name: community.mongodb3. Sırları Ansible Vault ile şifrele
Veritabanı parolalarını, replikasyon sırlarını ve süper kullanıcı bilgilerini düz metin bırakma; ansible-vault ile şifreli bir değişken dosyasında tut. Çalıştırırken --ask-vault-pass veya --vault-password-file ile aç. Böylece sırlar Git'te güvenle saklanır ve playbook idempotent kalır.
PostgreSQL
ansible-vault create group_vars/postgres/vault.yml
# içine:
vault_pg_admin_password: "S3cret!"
# çalıştır:
ansible-playbook site.yml --ask-vault-pass4. Rol yapısını kur (roles/postgres, roles/mysql)
Her motor için bir rol oluştur ve mantığı tasks/, defaults/, templates/, handlers/ alt klasörlerine böl. Bu yapı yeniden kullanılabilirliği artırır: defaults/main.yml varsayılan değerler, templates/ ile jinja2 yapılandırma şablonları, handlers/ ile 'yalnızca değişiklik olursa yeniden başlat' mantığı. Rolü ansible-galaxy init roles/postgres ile iskeletleyebilirsin.
PostgreSQL
ansible-galaxy init roles/postgres
# roles/postgres/
# defaults/main.yml
# tasks/main.yml
# templates/postgresql.conf.j2
# handlers/main.yml5. Kurulum ve yapılandırma görevlerini idempotent yaz
Paketi kur, veri dizinini başlat ve postgresql.conf/my.cnf'i şablondan üret; yapılandırma değişince handler ile servisi yeniden başlat. Modüller idempotenttir: paket zaten kuruluysa tekrar kurmaz, dosya değişmediyse handler tetiklenmez. Yapılandırma şablonunu template modülüyle bas ve 'notify' ile handler'a bağla.
PostgreSQL
- name: postgresql.conf şablonu
ansible.builtin.template:
src: postgresql.conf.j2
dest: /etc/postgresql/16/main/postgresql.conf
notify: restart postgresql
# handlers/main.yml
- name: restart postgresql
ansible.builtin.service:
name: postgresql
state: restartedMySQL
- name: my.cnf şablonu
ansible.builtin.template:
src: my.cnf.j2
dest: /etc/mysql/my.cnf
notify: restart mysql6. Veritabanı ve kullanıcı görevlerini tanımla
Veritabanını, kullanıcıları ve yetkileri modüllerle oluştur; parolayı Vault değişkeninden al. community.postgresql modülleri idempotenttir: kullanıcı/DB varsa yeniden oluşturmaz, yalnızca farkı uygular. Yetkileri postgresql_privs ile ayrı ver; MySQL'de mysql_user içindeki priv alanı kullanılır.
PostgreSQL
- name: uygulama veritabanı
community.postgresql.postgresql_db:
name: uygulama
state: present
- name: uygulama kullanıcısı
community.postgresql.postgresql_user:
name: uygulama_user
password: "{{ vault_app_password }}"
db: uygulama
state: presentMySQL
- name: uygulama kullanıcısı
community.mysql.mysql_user:
name: uygulama_user
password: "{{ vault_app_password }}"
priv: 'uygulama.*:ALL'
state: present7. Yedek görevini ve zamanlamayı ekle
Yedek betiğini şablonla yerleştir ve ansible.builtin.cron ile zamanla; böylece yedek işi de kod olarak (as code) yönetilir. Yedek dosyalarının hedef dizinini, saklama süresini ve zamanlamayı değişken yap. Cron modülü idempotenttir ve girdiyi 'name' ile tanır, tekrar çalıştırınca kopyalamaz.
PostgreSQL
- name: gece yedeği (cron)
ansible.builtin.cron:
name: "pg dump gece"
minute: "0"
hour: "2"
job: "pg_dump -Fc uygulama > /yedek/uygulama_$(date +\\%F).dump"