diff --git a/Jenkinsfile b/Jenkinsfile index eb554fd..9844218 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,5 +1,8 @@ pipeline { agent any + options { + ansiColor('xterm') + } tools { ansible 'Ansible' } @@ -11,7 +14,7 @@ pipeline { string(name: 'DB_USER', defaultValue: 'postgres', 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)') + string(name: 'TASKS', defaultValue: '', description: 'Список тегов задач для выполнения (setup,firewall,init,configure,database,insert,user,backup)') } stages { stage('Clone repository') { 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..4ae0c8c 100644 --- a/ansible.cfg +++ b/ansible.cfg @@ -1,3 +1,4 @@ [defaults] inventory = inventory.yml roles_path = ./roles +force_color = true 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..c015e8d 100644 --- a/roles/postgresql/tasks/configure.yml +++ b/roles/postgresql/tasks/configure.yml @@ -6,8 +6,6 @@ group: postgres mode: '0644' notify: Restart PostgreSQL - tags: - - configure - name: Configure pg_hba.conf with template template: @@ -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..66dabdd 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 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 + login_password: '{{ postgres_password }}' \ No newline at end of file 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..151f687 --- /dev/null +++ b/roles/postgresql/tasks/insert_data.yml @@ -0,0 +1,11 @@ +- name: Insert data into PostgreSQL database idempotently + 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..99ff9ed 100644 --- a/roles/postgresql/tasks/open_firewall.yml +++ b/roles/postgresql/tasks/open_firewall.yml @@ -4,11 +4,7 @@ permanent: true state: enabled become: true - tags: - - firewall - + - name: Reload firewall using command command: firewall-cmd --reload 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/vars/main.yml b/roles/postgresql/vars/main.yml index d86ab40..2dd04d2 100644 --- a/roles/postgresql/vars/main.yml +++ b/roles/postgresql/vars/main.yml @@ -5,7 +5,6 @@ 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"