This commit is contained in:
dima 2024-12-08 22:11:48 +03:00
parent 66471a8a89
commit 08cc9fc069
16 changed files with 166 additions and 112 deletions

35
Jenkinsfile vendored
View File

@ -1,20 +1,32 @@
pipeline { pipeline {
agent any agent any
options {
ansiColor('xterm')
}
tools { tools {
ansible 'Ansible' ansible 'Ansible'
} }
environment { environment {
PSQL_PASSWORD = credentials('PSQL_pass') PSQL_PASSWORD = "${params.DB_PASSWORD}"
VAULT_PASSWORD = credentials('ansible_vault_password') VAULT_PASSWORD = credentials('ansible_vault_password')
} }
parameters { parameters {
string(name: 'DB_USER', defaultValue: 'postgres', description: 'Имя пользователя базы данных') string(name: 'DB_USER', defaultValue: 'postgres', description: 'Имя пользователя базы данных')
password(name: 'DB_PASSWORD', defaultValue: '', description: 'Пароль для базы данных')
string(name: 'DB_NAME', defaultValue: 'mydb', description: 'Имя базы данных') string(name: 'DB_NAME', defaultValue: 'mydb', description: 'Имя базы данных')
string(name: 'BACKUP_DIR', defaultValue: '/var/backups/postgresql', description: 'Директория для бэкапа') string(name: 'BACKUP_DIR', defaultValue: '/var/backups/postgresql', description: 'Директория для бэкапа')
string(name: 'TASKS', defaultValue: '', description: 'Список тегов задач для выполнения (setup,firewall,init,configure,database,user,backup)')
booleanParam(name: 'TASK_SETUP', defaultValue: false, description: 'Setup')
booleanParam(name: 'TASK_INIT', defaultValue: false, description: 'Init')
booleanParam(name: 'TASK_CONFIGURE', defaultValue: false, description: 'Configure')
booleanParam(name: 'TASK_USERS', defaultValue: false, description: 'Users')
booleanParam(name: 'TASK_DATABASE', defaultValue: false, description: 'Database')
booleanParam(name: 'TASK_INSERT', defaultValue: false, description: 'Insert')
booleanParam(name: 'TASK_FIREWALL', defaultValue: false, description: 'Firewall')
booleanParam(name: 'TASK_BACKUP', defaultValue: false, description: 'Backup')
} }
stages { stages {
stage('Clone repository') { stage('Clone Repository') {
steps { steps {
git branch: 'dev', url: 'http://192.168.0.70:3000/coursework/courseworkrep.git' git branch: 'dev', url: 'http://192.168.0.70:3000/coursework/courseworkrep.git'
} }
@ -38,17 +50,28 @@ pipeline {
} }
} }
} }
stage('Run PostgreSQL Playbook') { stage('Run Ansible Playbook') {
steps { steps {
script { script {
def tagsString = params.TASKS ? params.TASKS.split(',').join(',') : '' def selectedTags = []
if (params.TASK_SETUP) selectedTags << 'setup'
if (params.TASK_INIT) selectedTags << 'init'
if (params.TASK_CONFIGURE) selectedTags << 'configure'
if (params.TASK_USERS) selectedTags << 'users'
if (params.TASK_DATABASE) selectedTags << 'database'
if (params.TASK_INSERT) selectedTags << 'insert'
if (params.TASK_FIREWALL) selectedTags << 'firewall'
if (params.TASK_BACKUP) selectedTags << 'backup'
def tagsString = selectedTags.join(',')
ansiblePlaybook( ansiblePlaybook(
playbook: 'playbooks/install_postgresql.yml', playbook: 'playbooks/install_postgresql.yml',
inventory: "inventory.yml", inventory: "inventory.yml",
extraVars: [ extraVars: [
postgres_user: params.DB_USER, postgres_user: params.DB_USER,
postgres_password: PSQL_PASSWORD, postgres_password: env.PSQL_PASSWORD,
postgres_db: params.DB_NAME, postgres_db: params.DB_NAME,
backup_dir: params.BACKUP_DIR, backup_dir: params.BACKUP_DIR,
ansible_ssh_private_key_file: env.DECRYPTED_KEY_FILE ansible_ssh_private_key_file: env.DECRYPTED_KEY_FILE

103
README.md
View File

@ -1,61 +1,74 @@
# Проект по автоматизации настройки PostgreSQL # Проект по Автоматизации Настройки PostgreSQL
Этот проект предназначен для автоматизации установки, настройки и управления базой данных PostgreSQL с использованием **Ansible** и **Jenkins**. Он включает пайплайн Jenkins и Ansible плейбук с ролью для управления PostgreSQL. Этот проект представляет собой систему для автоматизированной установки, настройки и управления базой данных PostgreSQL с использованием **Ansible** и **Jenkins**. Включает в себя Ansible playbook, роли для управления конфигурацией PostgreSQL и Jenkins pipeline.
## Структура проекта ---
- **Jenkinsfile** — скрипт для автоматизации пайплайна Jenkins, который позволяет клонировать репозиторий, расшифровывать SSH-ключи, запускать Ansible плейбук и выполнять определенные задачи роли PostgreSQL. ## Описание Функционала
- **ansible.cfg** — конфигурационный файл Ansible, где указаны настройки по умолчанию для выполнения плейбуков.
- **inventory.yml** — файл инвентаря Ansible, который определяет хосты, на которых будут выполняться плейбуки.
- **playbooks/install_postgresql.yml** — основной Ansible плейбук для установки и настройки PostgreSQL.
- **roles/postgresql** — Ansible роль для управления PostgreSQL, которая содержит:
- **tasks/** — каталог с задачами:
- `setup.yml` — установка необходимых пакетов PostgreSQL.
- `open_firewall.yml` — настройка правил брандмауэра для доступа к базе данных.
- `initialize.yml` — инициализация новой базы данных.
- `configure.yml` — настройка параметров конфигурации PostgreSQL.
- `databases.yml` — создание и управление базами данных.
- `users.yml` — создание и управление пользователями базы данных.
- `backup.yml` — резервное копирование базы данных.
- **templates/** — шаблоны конфигурационных файлов для PostgreSQL:
- `pg_hba.conf.j2` — шаблон файла для управления доступом к базе данных.
- `postgresql.conf.j2` — шаблон основного конфигурационного файла PostgreSQL.
- **vars/** — переменные, используемые в роли PostgreSQL.
## Запуск проекта Проект использует:
### Предварительные требования - **Jenkins** — для запуска CI/CD pipeline, обеспечивая контроль версий, автоматизацию тестов и упрощение процесса деплоя.
- **Роли и Playbook Ansible** — для настройки и поддержания PostgreSQL, включая управление пользователями, доступом, резервным копированием и настройками безопасности.
- **Jenkins** с установленным Ansible плагином ---
- Доступ к хостам, указанным в `inventory.yml`
### Пайплайн Jenkins ## Структура Проекта
Файл **Jenkinsfile** определяет этапы пайплайна для автоматизированного развертывания PostgreSQL: - **`Jenkinsfile`** — Определяет pipeline для Jenkins. Этот файл задает шаги для клонирования репозитория, расшифровки SSH-ключей, выполнения Ansible playbook и запуска задач по настройке и тестированию PostgreSQL.
- **`ansible.cfg`** — Конфигурационный файл Ansible, определяющий параметры по умолчанию для выполнения плейбуков.
- **`inventory.yml`** — Указывает IP-адреса или доменные имена серверов, на которых будет развернут PostgreSQL.
- **`playbooks/install_postgresql.yml`** — Ansible playbook для установки и начальной настройки PostgreSQL.
- **`roles/postgresql/`** — Роль Ansible с задачами, обработчиками, переменными и шаблонами для управления PostgreSQL.
1. **Клонирование репозитория** — загрузка кода проекта. ---
2. **Расшифровка SSH-ключа** — декодирование зашифрованного ключа с использованием Ansible Vault.
3. **Запуск плейбука PostgreSQL** — выполнение Ansible плейбука для развертывания и настройки PostgreSQL на целевых хостах.
### Параметры запуска ## Детали Роли PostgreSQL
Пайплайн поддерживает следующие параметры: ### Файлы Задач (`tasks`)
- **DB_USER** — имя пользователя PostgreSQL. - **`setup.yml`** — начальная установка и настройка PostgreSQL.
- **DB_NAME** — название базы данных. - **`initialize.yml`** — инициализация PostgreSQL (создание каталогов и базовая настройка).
- **BACKUP_DIR** — директория для хранения резервных копий. - **`configure.yml`** — настройки PostgreSQL, такие как лимиты на подключение и параметры памяти.
- **TASKS** — список задач для выполнения, указанный через запятую (например, `setup,backup`). - **`users.yml`** — управление пользователями и привилегиями.
- **`databases.yml`** — создание и настройка баз данных.
- **`insert_data.yml`** — заполнение базы начальными данными.
- **`open_firewall.yml`** — настройка брандмауэра для PostgreSQL.
- **`backup.yml`** — настройка и выполнение резервного копирования базы данных.
### Порядок задач ### Шаблоны (`templates`)
По умолчанию задачи выполняются в следующем порядке: - **`pg_hba.conf.j2`** и **`postgresql.conf.j2`** — Jinja2-шаблоны конфигурационных файлов PostgreSQL. Позволяют динамически генерировать конфигурацию на основе параметров безопасности и производительности.
1. `setup` — установка необходимых пакетов. ### Переменные (`vars`)
2. `firewall` — настройка брандмауэра.
3. `init` — инициализация базы данных.
4. `configure` — конфигурация базы данных.
5. `database` — создание базы данных.
6. `user` — управление пользователями.
7. `backup` — резервное копирование данных.
При указании параметра `TASKS`, можно выбрать конкретные задачи, и они будут выполнены в этом порядке. - **`vars/main.yml`** — определяет переменные PostgreSQL, включая порты, параметры подключения и пути для резервного копирования.
---
## Использование Проекта
### Предварительные Требования
1. **Jenkins**: Jenkins настроен с установленным плагином для Ansible и доступом к репозиторию проекта.
2. **SSH ключи**: Приватный SSH-ключ (`id_ed25519_vault`) загружен в Jenkins для доступа к целевым серверам.
### Настройка
1. Склонируйте репозиторий и откройте **inventory.yml** для указания IP-адресов серверов.
2. Настройте переменные в `vars/main.yml` в соответствии с вашими требованиями (например, `postgres_port`, `postgres_db` и т.д.).
### Запуск
1. Запустите pipeline в Jenkins, указав необходимые параметры (`DB_USER`, `DB_NAME`, `BACKUP_DIR`).
2. Jenkins выполнит следующие шаги:
- Инициализация и подготовка сервера.
- Настройка безопасности и конфигурации PostgreSQL.
- Создание и настройка пользователей, баз данных и резервного копирования.
---
## Управление и Поддержка
- **Рестарт PostgreSQL**: При изменении конфигурации роль включает обработчик `Restart PostgreSQL`, который перезапускает базу данных для применения изменений.
- **Резервное Копирование**: Задача `backup.yml` автоматически выполняет резервное копирование базы данных в указанный каталог (`backup_dir`).

View File

@ -1,3 +1,5 @@
[defaults] [defaults]
inventory = inventory.yml inventory = inventory.yml
roles_path = ./roles roles_path = ./roles
force_color = true
interpreter_python = /usr/bin/python3

View File

@ -1,6 +1,4 @@
all: all:
children:
postgres_servers:
hosts: hosts:
192.168.0.71: 192.168.0.71:
ansible_user: ansible ansible_user: ansible

View File

@ -5,8 +5,6 @@
owner: postgres owner: postgres
group: postgres group: postgres
mode: '0755' mode: '0755'
tags:
- backup
- name: Perform database backup - name: Perform database backup
command: > command: >
@ -14,28 +12,22 @@
become_user: postgres become_user: postgres
environment: environment:
PGPASSWORD: '{{ postgres_password }}' PGPASSWORD: '{{ postgres_password }}'
tags:
- backup
- name: Daily cron full backup - name: Daily cron full backup
cron: cron:
name: 'PostgreSQL daily full backup' name: 'PostgreSQL daily full backup {{ postgres_user }}'
user: postgres user: postgres
minute: '0' minute: '0'
hour: '1' hour: '1'
job: "pg_dump -U {{ postgres_user }} -F c {{ postgres_db }} > {{ backup_dir }}/full_db_backup_{{ postgres_db }}_$(date +\\%F-\\%H-%M).sql" job: "pg_dump -U {{ postgres_user }} -F c {{ postgres_db }} > {{ backup_dir }}/full_db_backup_{{ postgres_db }}_$(date +\\%F-\\%H-%M).sql"
environment: environment:
PGPASSWORD: '{{ postgres_password }}' PGPASSWORD: '{{ postgres_password }}'
tags:
- backup
- name: Hourly cron incremental backup - name: Hourly cron incremental backup
cron: cron:
name: 'PostgreSQL hourly incremental backup' name: 'PostgreSQL hourly incremental backup {{ postgres_user }}'
user: postgres user: postgres
minute: '0' minute: '0'
job: "pg_dump -U {{ postgres_user }} -F c --data-only --file=\"{{ backup_dir }}/incremental_db_backup_{{ postgres_db }}_$(date +\\%F-\\%H-%M).sql\" {{ postgres_db }}" job: "pg_dump -U {{ postgres_user }} -F c --data-only --file=\"{{ backup_dir }}/incremental_db_backup_{{ postgres_db }}_$(date +\\%F-\\%H-%M).sql\" {{ postgres_db }}"
environment: environment:
PGPASSWORD: '{{ postgres_password }}' PGPASSWORD: '{{ postgres_password }}'
tags:
- backup

View File

@ -1,4 +1,4 @@
- name: Configure postgresql.conf with template - name: Configure postgresql.conf
template: template:
src: postgresql.conf.j2 src: postgresql.conf.j2
dest: /var/lib/pgsql/data/postgresql.conf dest: /var/lib/pgsql/data/postgresql.conf
@ -6,10 +6,8 @@
group: postgres group: postgres
mode: '0644' mode: '0644'
notify: Restart PostgreSQL notify: Restart PostgreSQL
tags:
- configure
- name: Configure pg_hba.conf with template - name: Configure pg_hba.conf
template: template:
src: pg_hba.conf.j2 src: pg_hba.conf.j2
dest: /var/lib/pgsql/data/pg_hba.conf dest: /var/lib/pgsql/data/pg_hba.conf
@ -17,5 +15,3 @@
group: postgres group: postgres
mode: '0644' mode: '0644'
notify: Restart PostgreSQL notify: Restart PostgreSQL
tags:
- configure

View File

@ -4,14 +4,15 @@
owner: '{{ postgres_user }}' owner: '{{ postgres_user }}'
encoding: UTF8 encoding: UTF8
state: present state: present
tags:
- database
- name: Create contacts table in PostgreSQL - name: Create contacts table
community.postgresql.postgresql_query: community.postgresql.postgresql_query:
db: '{{ postgres_db }}' db: '{{ postgres_db }}'
query: 'CREATE TABLE IF NOT EXISTS contacts (id SERIAL PRIMARY KEY, name VARCHAR(100), phone_number VARCHAR(15));' query: |
CREATE TABLE IF NOT EXISTS contacts (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
phone_number VARCHAR(15) UNIQUE
);
login_user: '{{ postgres_user }}' login_user: '{{ postgres_user }}'
login_password: '{{ postgres_password }}' login_password: '{{ postgres_password }}'
tags:
- database

View File

@ -2,13 +2,9 @@
command: sudo -u postgres initdb -D /var/lib/pgsql/data command: sudo -u postgres initdb -D /var/lib/pgsql/data
args: args:
creates: /var/lib/pgsql/data/PG_VERSION creates: /var/lib/pgsql/data/PG_VERSION
tags:
- init
- name: Systemctl start and enable PostgreSQL - name: Systemctl start and enable PostgreSQL
service: service:
name: postgresql name: postgresql
state: started state: started
enabled: true enabled: true
tags:
- init

View File

@ -0,0 +1,11 @@
- name: Insert data into PostgreSQL database
community.postgresql.postgresql_query:
db: '{{ postgres_db }}'
query: |
INSERT INTO contacts (name, phone_number) VALUES
('dima', '123123123'),
('vlad', '8800525252'),
('denis', '77777777')
ON CONFLICT (phone_number) DO NOTHING;
login_user: '{{ postgres_user }}'
login_password: '{{ postgres_password }}'

View File

@ -1,7 +1,31 @@
- import_tasks: setup.yml - import_tasks: setup.yml
tags:
- setup
- import_tasks: initialize.yml - import_tasks: initialize.yml
tags:
- init
- import_tasks: configure.yml - import_tasks: configure.yml
tags:
- configure
- import_tasks: users.yml - import_tasks: users.yml
tags:
- users
- import_tasks: databases.yml - import_tasks: databases.yml
tags:
- database
- import_tasks: insert_data.yml
tags:
- insert
- import_tasks: open_firewall.yml - import_tasks: open_firewall.yml
tags:
- firewall
- import_tasks: backup.yml - import_tasks: backup.yml
tags:
- backup

View File

@ -4,11 +4,9 @@
permanent: true permanent: true
state: enabled state: enabled
become: true become: true
tags:
- firewall
- name: Reload firewall using command - name: Reload firewalld
command: firewall-cmd --reload systemd:
name: firewalld
state: reloaded
become: true become: true
tags:
- firewall

View File

@ -4,12 +4,8 @@
- postgresql-server - postgresql-server
- postgresql-contrib - postgresql-contrib
state: present state: present
tags:
- setup
- name: Install python3-psycopg2 - name: Install python3-psycopg2
zypper: zypper:
name: python3-psycopg2 name: python3-psycopg2
state: present state: present
tags:
- setup

View File

@ -3,5 +3,3 @@
name: '{{ postgres_user }}' name: '{{ postgres_user }}'
password: '{{ postgres_password }}' password: '{{ postgres_password }}'
state: present state: present
tags:
- users

View File

@ -1,12 +1,11 @@
listen_addresses = '{{ postgres_listen_addresses | default("*") }}' listen_addresses = '{{ postgres_listen_addresses }}'
port = {{ postgres_port | default(5432) }} port = {{ postgres_port }}
max_connections = {{ postgres_max_connections }}
max_connections = {{ postgres_max_connections | default(100) }} shared_buffers = {{ postgres_shared_buffers }}
shared_buffers = {{ postgres_shared_buffers | default("128MB") }} effective_cache_size = {{ postgres_effective_cache_size }}
effective_cache_size = {{ postgres_effective_cache_size | default("4GB") }} maintenance_work_mem = {{ postgres_maintenance_work_mem }}
maintenance_work_mem = {{ postgres_maintenance_work_mem | default("64MB") }} checkpoint_completion_target = {{ postgres_checkpoint_completion_target }}
checkpoint_completion_target = {{ postgres_checkpoint_completion_target | default(0.7) }} wal_buffers = {{ postgres_wal_buffers }}
wal_buffers = {{ postgres_wal_buffers | default("16MB") }} default_statistics_target = {{ postgres_default_statistics_target }}
default_statistics_target = {{ postgres_default_statistics_target | default(100) }}

View File

@ -5,7 +5,14 @@ postgres_hba_entries:
- { type: 'host', database: 'all', user: 'all', address: '0.0.0.0/0', method: 'md5' } - { type: 'host', database: 'all', user: 'all', address: '0.0.0.0/0', method: 'md5' }
- { type: 'local', database: 'all', user: 'all', address: '', method: 'trust' } - { type: 'local', database: 'all', user: 'all', address: '', method: 'trust' }
backup_dir: "/var/lib/pgsql/backups" backup_dir: "/var/backups/postgresql"
postgres_user: "postgres" postgres_user: "postgres"
postgres_password: "your_password" postgres_db: "mydb"
postgres_db: "your_database"
postgres_max_connections: 100
postgres_shared_buffers: '128MB'
postgres_effective_cache_size: '4GB'
postgres_maintenance_work_mem: '64MB'
postgres_checkpoint_completion_target: 0.7
postgres_wal_buffers: '16MB'
postgres_default_statistics_target: 100