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
Kontrolli, et struktuur on korrektne:
defaults/main.yml— muutujad, mida kasutaja saab muutavars/main.yml— süsteemispetsiifilised väärtusedtasks/main.yml— rolli põhiloogikatemplates/— konfiguratsioonifailid (postgresql.conf,pg_hba.conf)handlers/main.yml— teenuse restart/reloadmeta/main.yml— sõltuvused (vajadusel)
2. Põhilised Tasks’id (20 min)
Eesmärk
Luua Ansible roll, mis:
- Paigaldab PostgreSQL-i
- Käivitab ja lubab teenuse
- Loob andmebaasi ja kasutaja
- Rakendab konfiguratsiooni
1. PostgreSQL paigaldamine
- name: Install PostgreSQL
apt:
name:
- postgresql
- postgresql-contrib
- python3-psycopg2 # vajalik Ansible postgres moodulitele
state: present
2. Teenuse kontroll
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 muutavars/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:
Kontrolli idempotentsust:
7. Kontroll ja Testimine (15 min)
Serveris
PostgreSQL-is
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:
- Mis oli kõige raskem ja kuidas lahendasid?
- Milline kontseptsioon oli suurim “ahaa!” hetk?
- Kuidas kasutaksid PostgreSQL rolli tulevikus?
- Kuidas selgitaksid sõbrale, mis on Ansible rollid?
- 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.confmuudatused 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
commandjashellmooduleid
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! 🚀