Keri sisuni

Ansible Rollid Kodutöö: PostgreSQL Andmebaasi Roll

Üldinfo

Eeldused: Labor läbitud, Ansible rollide põhimõtted selged
Ajakulu: ~1.5 tundi
Esitamine: GitHub repository URL + refleksioon
Tähtaeg: 1 nädal pärast laborit


Ülesande Kirjeldus

Laboris lõid Nginx veebiserveri rolli.
Nüüd tuleb rakendada samu põhimõtteid uue tehnoloogiaga – PostgreSQL andmebaasiga.

Miks PostgreSQL? - Teine tehnoloogia (andmebaas, mitte veebiserver) - Sama loogika (install, configure, templates) - Reaalne olukord: iga rakendus vajab andmebaasi - Harjutad rollide mõistet sügavamalt

Warning

PostgreSQL roll ei tohi olla lihtsalt koopia Nginx rollist!
Kasuta sarnast struktuuri, aga uue tehnoloogia jaoks sobivaid tasks’e ja template’e.


1. Rolli Struktuur (15 min)

Loo roll

cd ~/ansible-roles-lab/roles
ansible-galaxy init postgresql
cd postgresql

Kontrolli, et struktuur on korrektne:

  • defaults/main.yml — muutujad, mida kasutaja saab muuta
  • vars/main.yml — süsteemispetsiifilised väärtused
  • tasks/main.yml — rolli põhiloogika
  • templates/ — konfiguratsioonifailid (postgresql.conf, pg_hba.conf)
  • handlers/main.yml — teenuse restart/reload
  • meta/main.yml — sõltuvused (vajadusel)

2. Põhilised Tasks’id (20 min)

Eesmärk

Luua Ansible roll, mis:

  1. Paigaldab PostgreSQL-i
  2. Käivitab ja lubab teenuse
  3. Loob andmebaasi ja kasutaja
  4. Rakendab konfiguratsiooni

1. PostgreSQL paigaldamine

- name: Install PostgreSQL
  apt:
    name:
      - postgresql
      - postgresql-contrib
      - python3-psycopg2  # vajalik Ansible postgres moodulitele
    state: present

2. Teenuse kontroll

- name: Ensure PostgreSQL is started
  service:
    name: postgresql
    state: started
    enabled: yes

3. Andmebaasi loomine

- name: Create application database
  postgresql_db:
    name: "{{ postgres_db_name }}"
    state: present
  become: yes
  become_user: postgres

4. Kasutaja loomine

- name: Create database user
  postgresql_user:
    name: "{{ postgres_user }}"
    password: "{{ postgres_password }}"
    db: "{{ postgres_db_name }}"
    priv: "ALL"
    state: present
  become: yes
  become_user: postgres

Tip

PostgreSQL käsud peavad jooksma postgres kasutajana, mitte root’ina.


3. Muutujad (10 min)

Roll peab kasutama hästi struktureeritud muutujaid:

  • defaults/main.yml – vaikeseaded, mida kasutaja saab muuta
  • vars/main.yml – süsteemispetsiifilised väärtused, mida tavaliselt ei muudeta

defaults/main.yml

---
postgres_version: 14
postgres_port: 5432

postgres_db_name: myapp_db
postgres_user: myapp_user
postgres_password: "changeme"  # soovita muuta!

postgres_max_connections: 100
postgres_shared_buffers: "128MB"
postgres_work_mem: "4MB"

postgres_log_destination: stderr
postgres_logging_collector: on

vars/main.yml

---
_postgres_packages:
  Debian:
    - postgresql-{{ postgres_version }}
    - postgresql-contrib-{{ postgres_version }}
    - python3-psycopg2
  RedHat:
    - postgresql{{ postgres_version }}-server
    - postgresql{{ postgres_version }}-contrib
    - python3-psycopg2

postgres_config_dir: "/etc/postgresql/{{ postgres_version }}/main"
postgres_data_dir: "/var/lib/postgresql/{{ postgres_version }}/main"
postgres_service_name: "postgresql"

Selgitus:

  • defaults – annab paindlikkuse (kasutaja saab muuta)
  • vars – fikseeritud süsteemiseaded

4. Template’id (25 min)

1. PostgreSQL konfiguratsioon

Loo fail templates/postgresql.conf.j2:

# PostgreSQL Configuration (Generated by Ansible)

listen_addresses = '{{ postgres_listen_addresses | default("localhost") }}'
port = {{ postgres_port }}
max_connections = {{ postgres_max_connections }}

shared_buffers = {{ postgres_shared_buffers }}
work_mem = {{ postgres_work_mem }}

logging_collector = {{ postgres_logging_collector }}
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'

2. Autentimise fail

Loo fail templates/pg_hba.conf.j2:

# PostgreSQL Client Authentication (Generated by Ansible)

local   all   all                 peer
host    all   all   127.0.0.1/32  md5
host    all   all   ::1/128       md5

{% if postgres_allow_remote | default(false) %}
host    {{ postgres_db_name }}  {{ postgres_user }}  {{ postgres_remote_subnet | default('0.0.0.0/0') }}  md5
{% endif %}

3. Lisa template’ide rakendamine tasks’i lõppu

- name: Configure PostgreSQL
  template:
    src: postgresql.conf.j2
    dest: "{{ postgres_config_dir }}/postgresql.conf"
    owner: postgres
    group: postgres
    mode: '0644'
  notify: restart postgresql

- name: Configure client authentication
  template:
    src: pg_hba.conf.j2
    dest: "{{ postgres_config_dir }}/pg_hba.conf"
    owner: postgres
    group: postgres
    mode: '0640'
  notify: restart postgresql

5. Handlers (10 min)

Loo handlers/main.yml:

---
- name: restart postgresql
  service:
    name: "{{ postgres_service_name }}"
    state: restarted

- name: reload postgresql
  service:
    name: "{{ postgres_service_name }}"
    state: reloaded

Question

Kas oled kasutanud notify: restart postgresql kõikides tasks’ides, mis muudavad konfiguratsiooni?


6. Test Playbook (5 min)

Loo fail test-postgresql.yml:

---
- name: Test PostgreSQL Role
  hosts: webservers
  become: yes
  roles:
    - role: postgresql
      vars:
        postgres_db_name: testapp_db
        postgres_user: testapp_user
        postgres_password: "SecurePass123"
        postgres_max_connections: 150

Käivita:

ansible-playbook -i inventory test-postgresql.yml

Kontrolli idempotentsust:

ansible-playbook -i inventory test-postgresql.yml
# PEAB OLEMA: changed=0

7. Kontroll ja Testimine (15 min)

Serveris

vagrant ssh
sudo systemctl status postgresql
sudo -u postgres psql

PostgreSQL-is

\l            -- list databases
\du           -- list users
\c testapp_db -- connect to database
\q

Ansible test

Lisa tasks/main.yml lõppu:

- name: Test database connection
  postgresql_query:
    db: "{{ postgres_db_name }}"
    login_user: "{{ postgres_user }}"
    login_password: "{{ postgres_password }}"
    query: "SELECT version();"
  become: yes
  become_user: postgres
  register: db_version

- name: Show database version
  debug:
    var: db_version.query_result

8. Esitamine

Struktuur peab olema:

ansible-role-postgresql/
├── defaults/
├── vars/
├── tasks/
├── templates/
├── handlers/
├── meta/
└── README.md

README.md peab sisaldama:

  • Rolli kirjeldust
  • Nõudeid
  • Muutujaid (default & internal)
  • Näidist playbook’i
  • Testimisjuhendit
  • Litsentsi ja autorit

Refleksioon

Lisa README.md lõppu või eraldi faili REFLECTION.md:

  1. Mis oli kõige raskem ja kuidas lahendasid?
  2. Milline kontseptsioon oli suurim “ahaa!” hetk?
  3. Kuidas kasutaksid PostgreSQL rolli tulevikus?
  4. Kuidas selgitaksid sõbrale, mis on Ansible rollid?
  5. Mis oli sarnane ja mis erinev Nginx rolliga?

Hindamiskriteeriumid

Kriteerium Punktid Kirjeldus
Struktuur 15 Galaxy standard
Tasks 20 Paigaldamine, DB ja kasutaja loomine
Idempotentsus 15 changed=0 teisel käivitamisel
Muutujad 10 defaults vs vars õigesti kasutatud
Template’id 15 postgresql.conf + pg_hba.conf töötavad
Handlers 10 Restart/reload korrektsed
README 10 Täielik dokumentatsioon
Refleksioon 5 Kõik 5 küsimust vastatud
Kokku 100

Boonus (+10 punkti)

  • Multi-OS tugi
  • Backup cron job
  • Replication setup

Kasulikud Ressursid

Tip

  • Kui pg_hba.conf muudatused ei mõju → tee restart, mitte reload
  • Kui “permission denied” → kasuta become_user: postgres
  • Kui template muutujad puuduvad → lisa need defaults/main.yml
  • Kui idempotentsus ei tööta → väldi command ja shell mooduleid

Esitamine

Kuhu: GitHub public repository (nt https://github.com/SINU-USERNAME/ansible-role-postgresql) Millal: 1 nädal pärast laborit Formaat: Public repo + README või REFLECTION.md


Edu! 🚀