ver 3
This commit is contained in:
parent
66471a8a89
commit
293bf6d004
5
Jenkinsfile
vendored
5
Jenkinsfile
vendored
@ -1,5 +1,8 @@
|
|||||||
pipeline {
|
pipeline {
|
||||||
agent any
|
agent any
|
||||||
|
options {
|
||||||
|
ansiColor('xterm')
|
||||||
|
}
|
||||||
tools {
|
tools {
|
||||||
ansible 'Ansible'
|
ansible 'Ansible'
|
||||||
}
|
}
|
||||||
@ -11,7 +14,7 @@ pipeline {
|
|||||||
string(name: 'DB_USER', defaultValue: 'postgres', description: 'Имя пользователя базы данных')
|
string(name: 'DB_USER', defaultValue: 'postgres', 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)')
|
string(name: 'TASKS', defaultValue: '', description: 'Список тегов задач для выполнения (setup,firewall,init,configure,database,insert,user,backup)')
|
||||||
}
|
}
|
||||||
stages {
|
stages {
|
||||||
stage('Clone repository') {
|
stage('Clone repository') {
|
||||||
|
103
README.md
103
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.
|
- **`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`).
|
@ -1,3 +1,4 @@
|
|||||||
[defaults]
|
[defaults]
|
||||||
inventory = inventory.yml
|
inventory = inventory.yml
|
||||||
roles_path = ./roles
|
roles_path = ./roles
|
||||||
|
force_color = true
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
- name: Restart PostgreSQL
|
- name: Restart PostgreSQL
|
||||||
service:
|
service:
|
||||||
name: postgresql
|
name: postgresql
|
||||||
state: restarted
|
state: restarted
|
@ -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
|
|
@ -6,8 +6,6 @@
|
|||||||
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 with template
|
||||||
template:
|
template:
|
||||||
@ -17,5 +15,3 @@
|
|||||||
group: postgres
|
group: postgres
|
||||||
mode: '0644'
|
mode: '0644'
|
||||||
notify: Restart PostgreSQL
|
notify: Restart PostgreSQL
|
||||||
tags:
|
|
||||||
- configure
|
|
||||||
|
@ -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 in PostgreSQL
|
||||||
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
|
|
@ -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
|
|
||||||
|
11
roles/postgresql/tasks/insert_data.yml
Normal file
11
roles/postgresql/tasks/insert_data.yml
Normal file
@ -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 }}'
|
@ -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
|
||||||
- import_tasks: backup.yml
|
tags:
|
||||||
|
- firewall
|
||||||
|
|
||||||
|
- import_tasks: backup.yml
|
||||||
|
tags:
|
||||||
|
- backup
|
||||||
|
@ -4,11 +4,7 @@
|
|||||||
permanent: true
|
permanent: true
|
||||||
state: enabled
|
state: enabled
|
||||||
become: true
|
become: true
|
||||||
tags:
|
|
||||||
- firewall
|
|
||||||
|
|
||||||
- name: Reload firewall using command
|
- name: Reload firewall using command
|
||||||
command: firewall-cmd --reload
|
command: firewall-cmd --reload
|
||||||
become: true
|
become: true
|
||||||
tags:
|
|
||||||
- firewall
|
|
||||||
|
@ -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
|
|
||||||
|
@ -2,6 +2,4 @@
|
|||||||
community.postgresql.postgresql_user:
|
community.postgresql.postgresql_user:
|
||||||
name: '{{ postgres_user }}'
|
name: '{{ postgres_user }}'
|
||||||
password: '{{ postgres_password }}'
|
password: '{{ postgres_password }}'
|
||||||
state: present
|
state: present
|
||||||
tags:
|
|
||||||
- users
|
|
@ -5,7 +5,6 @@ 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"
|
|
||||||
|
Loading…
Reference in New Issue
Block a user