DBAtlas · Veritabanı operasyon atlası

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_replica

2. 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.yml

MySQL

collections:
  - name: community.mysql

MongoDB

collections:
  - name: community.mongodb

3. 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-pass

4. 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.yml

5. 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: restarted

MySQL

- name: my.cnf şablonu
  ansible.builtin.template:
    src: my.cnf.j2
    dest: /etc/mysql/my.cnf
  notify: restart mysql

6. 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: present

MySQL

- name: uygulama kullanıcısı
  community.mysql.mysql_user:
    name: uygulama_user
    password: "{{ vault_app_password }}"
    priv: 'uygulama.*:ALL'
    state: present

7. 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"
DBAtlas'ta aç →