From 08cc9fc069f83acda6e1349fce061c96147dd2fa Mon Sep 17 00:00:00 2001 From: dima Date: Sun, 8 Dec 2024 22:11:48 +0300 Subject: [PATCH] ver 5 --- Jenkinsfile | 35 +++++- README.md | 103 ++++++++++-------- ansible.cfg | 2 + inventory.yml | 8 +- roles/postgresql/handlers/main.yml | 2 +- roles/postgresql/tasks/backup.yml | 14 +-- roles/postgresql/tasks/configure.yml | 8 +- roles/postgresql/tasks/databases.yml | 13 ++- roles/postgresql/tasks/initialize.yml | 6 +- roles/postgresql/tasks/insert_data.yml | 11 ++ roles/postgresql/tasks/main.yml | 26 ++++- roles/postgresql/tasks/open_firewall.yml | 10 +- roles/postgresql/tasks/setup.yml | 4 - roles/postgresql/tasks/users.yml | 4 +- roles/postgresql/templates/postgresql.conf.j2 | 19 ++-- roles/postgresql/vars/main.yml | 13 ++- 16 files changed, 166 insertions(+), 112 deletions(-) create mode 100644 roles/postgresql/tasks/insert_data.yml diff --git a/Jenkinsfile b/Jenkinsfile index eb554fd..92d25da 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,20 +1,32 @@ pipeline { agent any + options { + ansiColor('xterm') + } tools { ansible 'Ansible' } environment { - PSQL_PASSWORD = credentials('PSQL_pass') + PSQL_PASSWORD = "${params.DB_PASSWORD}" VAULT_PASSWORD = credentials('ansible_vault_password') } parameters { string(name: 'DB_USER', defaultValue: 'postgres', description: 'Имя пользователя базы данных') + password(name: 'DB_PASSWORD', defaultValue: '', description: 'Пароль для базы данных') string(name: 'DB_NAME', defaultValue: 'mydb', 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 { - stage('Clone repository') { + stage('Clone Repository') { steps { 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 { 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( playbook: 'playbooks/install_postgresql.yml', inventory: "inventory.yml", extraVars: [ postgres_user: params.DB_USER, - postgres_password: PSQL_PASSWORD, + postgres_password: env.PSQL_PASSWORD, postgres_db: params.DB_NAME, backup_dir: params.BACKUP_DIR, ansible_ssh_private_key_file: env.DECRYPTED_KEY_FILE diff --git a/README.md b/README.md index 5a756cd..facef0c 100644 --- a/README.md +++ b/README.md @@ -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. -- **DB_NAME** — название базы данных. -- **BACKUP_DIR** — директория для хранения резервных копий. -- **TASKS** — список задач для выполнения, указанный через запятую (например, `setup,backup`). +- **`setup.yml`** — начальная установка и настройка PostgreSQL. +- **`initialize.yml`** — инициализация PostgreSQL (создание каталогов и базовая настройка). +- **`configure.yml`** — настройки PostgreSQL, такие как лимиты на подключение и параметры памяти. +- **`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` — установка необходимых пакетов. -2. `firewall` — настройка брандмауэра. -3. `init` — инициализация базы данных. -4. `configure` — конфигурация базы данных. -5. `database` — создание базы данных. -6. `user` — управление пользователями. -7. `backup` — резервное копирование данных. +### Переменные (`vars`) -При указании параметра `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`). \ No newline at end of file diff --git a/ansible.cfg b/ansible.cfg index 6db58e7..ea0bfe0 100644 --- a/ansible.cfg +++ b/ansible.cfg @@ -1,3 +1,5 @@ [defaults] inventory = inventory.yml roles_path = ./roles +force_color = true +interpreter_python = /usr/bin/python3 diff --git a/inventory.yml b/inventory.yml index 215250f..590be8f 100644 --- a/inventory.yml +++ b/inventory.yml @@ -1,6 +1,4 @@ all: - children: - postgres_servers: - hosts: - 192.168.0.71: - ansible_user: ansible \ No newline at end of file + hosts: + 192.168.0.71: + ansible_user: ansible \ No newline at end of file diff --git a/roles/postgresql/handlers/main.yml b/roles/postgresql/handlers/main.yml index ef04727..79cf716 100644 --- a/roles/postgresql/handlers/main.yml +++ b/roles/postgresql/handlers/main.yml @@ -1,4 +1,4 @@ - name: Restart PostgreSQL service: name: postgresql - state: restarted + state: restarted \ No newline at end of file diff --git a/roles/postgresql/tasks/backup.yml b/roles/postgresql/tasks/backup.yml index 84a6fc6..f85bba0 100644 --- a/roles/postgresql/tasks/backup.yml +++ b/roles/postgresql/tasks/backup.yml @@ -5,8 +5,6 @@ owner: postgres group: postgres mode: '0755' - tags: - - backup - name: Perform database backup command: > @@ -14,28 +12,22 @@ become_user: postgres environment: PGPASSWORD: '{{ postgres_password }}' - tags: - - backup - name: Daily cron full backup cron: - name: 'PostgreSQL daily full backup' + name: 'PostgreSQL daily full backup {{ postgres_user }}' user: postgres minute: '0' hour: '1' job: "pg_dump -U {{ postgres_user }} -F c {{ postgres_db }} > {{ backup_dir }}/full_db_backup_{{ postgres_db }}_$(date +\\%F-\\%H-%M).sql" environment: PGPASSWORD: '{{ postgres_password }}' - tags: - - backup - name: Hourly cron incremental backup cron: - name: 'PostgreSQL hourly incremental backup' + name: 'PostgreSQL hourly incremental backup {{ postgres_user }}' user: postgres 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 }}" environment: - PGPASSWORD: '{{ postgres_password }}' - tags: - - backup \ No newline at end of file + PGPASSWORD: '{{ postgres_password }}' \ No newline at end of file diff --git a/roles/postgresql/tasks/configure.yml b/roles/postgresql/tasks/configure.yml index 8cc7565..9cd61ac 100644 --- a/roles/postgresql/tasks/configure.yml +++ b/roles/postgresql/tasks/configure.yml @@ -1,4 +1,4 @@ -- name: Configure postgresql.conf with template +- name: Configure postgresql.conf template: src: postgresql.conf.j2 dest: /var/lib/pgsql/data/postgresql.conf @@ -6,10 +6,8 @@ group: postgres mode: '0644' notify: Restart PostgreSQL - tags: - - configure -- name: Configure pg_hba.conf with template +- name: Configure pg_hba.conf template: src: pg_hba.conf.j2 dest: /var/lib/pgsql/data/pg_hba.conf @@ -17,5 +15,3 @@ group: postgres mode: '0644' notify: Restart PostgreSQL - tags: - - configure diff --git a/roles/postgresql/tasks/databases.yml b/roles/postgresql/tasks/databases.yml index 999b203..7f78807 100644 --- a/roles/postgresql/tasks/databases.yml +++ b/roles/postgresql/tasks/databases.yml @@ -4,14 +4,15 @@ owner: '{{ postgres_user }}' encoding: UTF8 state: present - tags: - - database -- name: Create contacts table in PostgreSQL +- name: Create contacts table community.postgresql.postgresql_query: 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_password: '{{ postgres_password }}' - tags: - - database diff --git a/roles/postgresql/tasks/initialize.yml b/roles/postgresql/tasks/initialize.yml index c9de0f8..8d5b1be 100644 --- a/roles/postgresql/tasks/initialize.yml +++ b/roles/postgresql/tasks/initialize.yml @@ -2,13 +2,9 @@ command: sudo -u postgres initdb -D /var/lib/pgsql/data args: creates: /var/lib/pgsql/data/PG_VERSION - tags: - - init - + - name: Systemctl start and enable PostgreSQL service: name: postgresql state: started enabled: true - tags: - - init diff --git a/roles/postgresql/tasks/insert_data.yml b/roles/postgresql/tasks/insert_data.yml new file mode 100644 index 0000000..4f7dcd5 --- /dev/null +++ b/roles/postgresql/tasks/insert_data.yml @@ -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 }}' diff --git a/roles/postgresql/tasks/main.yml b/roles/postgresql/tasks/main.yml index ee7f31a..204231a 100644 --- a/roles/postgresql/tasks/main.yml +++ b/roles/postgresql/tasks/main.yml @@ -1,7 +1,31 @@ - import_tasks: setup.yml + tags: + - setup + - import_tasks: initialize.yml + tags: + - init + - import_tasks: configure.yml + tags: + - configure + - import_tasks: users.yml + tags: + - users + - import_tasks: databases.yml + tags: + - database + +- import_tasks: insert_data.yml + tags: + - insert + - import_tasks: open_firewall.yml -- import_tasks: backup.yml \ No newline at end of file + tags: + - firewall + +- import_tasks: backup.yml + tags: + - backup diff --git a/roles/postgresql/tasks/open_firewall.yml b/roles/postgresql/tasks/open_firewall.yml index 1d984a2..2c084af 100644 --- a/roles/postgresql/tasks/open_firewall.yml +++ b/roles/postgresql/tasks/open_firewall.yml @@ -4,11 +4,9 @@ permanent: true state: enabled become: true - tags: - - firewall -- name: Reload firewall using command - command: firewall-cmd --reload +- name: Reload firewalld + systemd: + name: firewalld + state: reloaded become: true - tags: - - firewall diff --git a/roles/postgresql/tasks/setup.yml b/roles/postgresql/tasks/setup.yml index 1a378e6..0271a1b 100644 --- a/roles/postgresql/tasks/setup.yml +++ b/roles/postgresql/tasks/setup.yml @@ -4,12 +4,8 @@ - postgresql-server - postgresql-contrib state: present - tags: - - setup - name: Install python3-psycopg2 zypper: name: python3-psycopg2 state: present - tags: - - setup diff --git a/roles/postgresql/tasks/users.yml b/roles/postgresql/tasks/users.yml index efa300d..22aa2c1 100644 --- a/roles/postgresql/tasks/users.yml +++ b/roles/postgresql/tasks/users.yml @@ -2,6 +2,4 @@ community.postgresql.postgresql_user: name: '{{ postgres_user }}' password: '{{ postgres_password }}' - state: present - tags: - - users + state: present \ No newline at end of file diff --git a/roles/postgresql/templates/postgresql.conf.j2 b/roles/postgresql/templates/postgresql.conf.j2 index 7013fde..7bff891 100644 --- a/roles/postgresql/templates/postgresql.conf.j2 +++ b/roles/postgresql/templates/postgresql.conf.j2 @@ -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 | default(100) }} -shared_buffers = {{ postgres_shared_buffers | default("128MB") }} -effective_cache_size = {{ postgres_effective_cache_size | default("4GB") }} -maintenance_work_mem = {{ postgres_maintenance_work_mem | default("64MB") }} -checkpoint_completion_target = {{ postgres_checkpoint_completion_target | default(0.7) }} -wal_buffers = {{ postgres_wal_buffers | default("16MB") }} -default_statistics_target = {{ postgres_default_statistics_target | default(100) }} \ No newline at end of file +max_connections = {{ postgres_max_connections }} +shared_buffers = {{ postgres_shared_buffers }} +effective_cache_size = {{ postgres_effective_cache_size }} +maintenance_work_mem = {{ postgres_maintenance_work_mem }} +checkpoint_completion_target = {{ postgres_checkpoint_completion_target }} +wal_buffers = {{ postgres_wal_buffers }} +default_statistics_target = {{ postgres_default_statistics_target }} diff --git a/roles/postgresql/vars/main.yml b/roles/postgresql/vars/main.yml index d86ab40..c76a487 100644 --- a/roles/postgresql/vars/main.yml +++ b/roles/postgresql/vars/main.yml @@ -5,7 +5,14 @@ postgres_hba_entries: - { type: 'host', database: 'all', user: 'all', address: '0.0.0.0/0', method: 'md5' } - { type: 'local', database: 'all', user: 'all', address: '', method: 'trust' } -backup_dir: "/var/lib/pgsql/backups" +backup_dir: "/var/backups/postgresql" postgres_user: "postgres" -postgres_password: "your_password" -postgres_db: "your_database" +postgres_db: "mydb" + +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 \ No newline at end of file