Ở bài viết trước mình đã hướng dẫn Tự động hóa tác vụ Kubernetes bằng Ansible module và hôm nay mình sẽ nói về PostgreSQL.
Ansible là công cụ tuyệt vời tự động hóa triển khai, cài đặt. PostgreSQL là cơ sở dữ liệu mã nguồn mở được ưa chuộng. Bài viết này sẽ hướng dẫn cách triển khai tự động Postgresql bằng Ansible.
Ansible là cái gì và nó làm việc như thế nào?
Tiêu chí của Ansible là “Công cụ tự động hóa triển khai, mã nguồn mở, cấu hình đơn giản, không cần agent (phần mềm đại lý) và mạnh mẽ” trích từ Tài liệu của Ansible.
Ansible có những tính năng cơ bản sau:
- Dự phòng tài nguyên (provisioning)
- Quản lý cấu hình (configuration management)
- Triển khai ứng dụng (app deployment)
- Giao hàng liên tục (continous delivery)
- Bảo mật và tuân thủ (security and compliance)
- Điều phối (orchestration).
Xem thêm: [Ansible] Xử lý ngoại lệ trong Ansible Playbooks với block và rescue
Các module PostgreSQL của Ansible
Ansible cung cấp một số các module cho PostgreSQL. Một số là các module core một số khác là các module bổ sung.
Tất cả các module PostgreSQL của Ansible yêu cầu gói psycopg2 của Python phải được cài đặt trên cùng một máy với server của PostgreSQL. Psycopg2 là một bộ chuyển đổi cơ sở dữ liệu trong ngôn ngữ lập trình Python.
Trên các hệ thống Debian/ Ubuntu, gói psycopg2 có thể được cài đặt sử dụng lệnh sau:
apt-get install python-psycopg2
Bây giờ chúng ta sẽ xem xét các module này một cách chi tiết. Với mục đích ví dụ, chúng ta sẽ làm việc trên server PostgreSQL tại máy chủ db.example.com trên cổng 5432 với user postgres và một password trống.
postgresql_db
Module core này sẽ tạo hoặc loại bỏ một cơ sở dữ liệu PostgreSQL. Trong thuật ngữ của Ansible, nó đảm bảo cung cấp một cơ sơ dữ liệu PostgreSQL với trạng thái là present hoặc absent.
Tùy chọn quan trọng nhất là yêu cầu tham số “name”. Nó là tên của cơ sở dữ liệu trong một server PostgreSQL. Một tham số quan trọng khác là “state”. Nó yêu cầu một trong 2 giá trị: present hoặc absent. Điều này cho phép chúng ta tạo hoặc loại bỏ một cơ sở dữ liệu cái được xác định bởi giá trị cung cấp cho tham số “name”.
Một số quy trình có thể yêu cầu các tham số kết nối chẳng hạn như: login_host, port, login_user, và login_password.
Hãy tạo một cơ sở dữ liệu gọi là “module_test” trên server PostgreSQL bằng cách thêm các dòng dưới đây tới file playbook của chúng ta:
- postgresql_db: name=module_test
state=present
login_host=db.example.com
port=5432
login_user=postgres
Ở đây, chúng ta kết nối tới server cơ sở dữ liệu để test tại db.example.com với user: postgres. Tuy nhiên, không nhất thiết user phải là postgres có thể sử dụng các tên khác.
Loại bỏ một database dễ dàng như khi chúng ta tạo ra nó:
- postgresql_db: name=module_test
state=absent
login_host=db.example.com
port=5432
login_user=postgres
Chú ý giá trị “absent” trong tham số state.
postgresql_ext
PostgreSQL được biết là có các extension rất hữu ích và mạnh mẽ. Ví dụ, một extension gần đây là tsm_system_rows cái giúp lấy chính xác số lượng các dòng trong tablesampling. (Để biết thêm thông tin bạn có thể đọc bài viết previous post về các phương thức tablesampling).
Module bổ sung này thêm hoặc loại bỏ các extention từ một cơ sở dữ liệu. Nó yêu cầu 2 tham số chính là: db và name. Tham số db đề cập tới tên cơ sở dữ liệu và tham số name đề cập tới tên extension. Chúng ta cũng có tham số state cái cần một trong 2 giá trị present hoặc absent, và các tham số kết nối như trong module postgresql_db.
Xem thêm: [Ansible] Ansible Role
Hãy bắt đầu bằng cách tạo extension mà chúng ta vừa nói đến:
- postgresql_ext: db=module_test
name=tsm_system_rows
state=present
login_host=db.example.com
port=5432
login_user=postgres
postgresql_user
Module core này cho phép thêm hoặc xóa các user, role từ một cơ sở dữ liệu.
Nó là một module mạnh mẽ bởi vì trong khi đảm bảo rằng một người dùng hiện diện trên cơ sở dữ liệu, nó cũng cho phép chỉnh sửa các đặc quyền (privilege) hoặc các role cùng lúc.
Hãy bắt đầu bằng cách xem xét các tham số. Tham số bắt buộc duy nhất ở đây là “name”, cái đề cập tới một user hoặc tên một role. Ngoài ra, như trong hầu hết các module của Ansible, tham số “state” cũng quan trọng. Nó có thể có một trong 2 giá trị present hoặc absent và giá trị mặc định là present.
Ngoài các tham số kết nối như trong các moduel trước, một vài tham số tùy chọn quan trọng khác là:
- db: Tên của cơ sở dữ liệu nơi các quyền sẽ được cấp
- password: password của use
- priv: các đặc quyền trong (privileges) “priv1/priv2” hoặc các bảng đặc quyền (table privileges) trong định dạng “table:priv1,priv2,…” .
- role_attr_flags: các thuộc tính của Role. Các gía trị có thể là:
- [NO]SUPERUSER
- [NO]CREATEROLE
- [NO]CREATEUSER
- [NO]CREATEDB
- [NO]INHERIT
- [NO]LOGIN
- [NO]REPLICATION
Trong thứ tự để tạo một user mới gọi là ada với password là lovelace và một kết nối đặc quyền (privilege) tới cơ sở dữ liệu module_test, chúng ta có thể thêm các dòng sau:
- postgresql_user: db=module_test
name=ada
password=lovelace
state=present
priv=CONNECT
login_host=db.example.com
port=5432
login_user=postgres
Bây giờ chứng có một user đã sẵn sàng, chúng ta có thể gán cho cô ấy một vài role. Để cho phép “ada” login và tạo các cơ sở dữ liệu:
- postgresql_user: name=ada
role_attr_flags=LOGIN,CREATEDB
login_host=db.example.com
port=5432
login_user=postgres
Chúng ta cũng có thể cấp các đặc quyền dựa trên global hoặc table chẳng hạn như “INSERT”, “UPDATE”, “SELECT”, và “DELETE” sử dụng tham số priv. Một trong những điểm quan trọng cần xem xét là một user không thể loại bỏ cho đến khi tất cả các đặc quyền (privilleges) đã được cấp bị thu hồi.
postgresql_privs
Module core này cấp hoặc thu hồi các đặc quyền trên các đối tượng cơ sở dữ liệu PostgreSQL. Các đối tượng được hỗ trợ là: table, sequence, function, database, schema, language, tablespace, và group.
Các tham số yêu cầu là “database”; tên của cơ sở dữ liệu để cấp/ thu hồi các đặc quyền, và “roles”; một danh sách tên các role được ngăn cách bằng dấu phẩy;
Các tham số tùy chọn quan trọng nhất là:
- type: Kiểu đối tượng để thiết lập đặc quyền. Có thể là một trong các kiểu: table, sequence, function, database, schema, language, tablespace, group. Giá trị mặc định là table.
- obj: các đối tượng cơ sở dữ liệu để thiết lập đặc quyền. Có thể có nhiều giá trị. Trong trường hợp đó, các đối tượng sẽ được ngăn cách bằng dầu phẩy.
- privs: Một danh sách các đặc quyền được ngăn cách bằng dấu phẩy để gọi hoặc thu hồi. Các giá trị có thể bao gồm: ALL, SELECT, UPDATE, INSERT.
Hãy xem điều này làm việc như thế nào bằng cách cấp tất cả các đặc quyền trên schema “public” tới user “ada”:
- postgresql_privs: db=module_test
privs=ALL
type=schema
objs=public
role=ada
login_host=db.example.com
port=5432
login_user=postgres
postgresql_lang
Một trong các tính năng rất mạnh mẽ của PostgreSQL là hỗ trợ nhiều ngôn ngữ lập trình để sử dụng như một ngôn ngữ thủ tục. Module bổ sung này thêm, loại bỏ, hoặc thay đổi các ngôn ngữ thủ tục với một cơ sở dữ liệu PostgreSQL.
Tham số bắt buộc duy nhất là “lang”; tên của ngôn ngữ thủ tục để thêm hoặc loại bỏ. Các tùy chọn quan trọng khác là “db”; tên cơ sở dữ liệu nơi ngôn ngữ được thêm hoặc loại bỏ, tiếp theo là “trust”; tùy chọn làm cho ngôn ngữ tin cậy hoặc không tin cậy cho cơ sở dữ liệu đã chọn.
Hãy cho phép ngôn ngữ PL/Python trên cơ sở dữ liệu của chúng ta:
- postgresql_lang: db=module_test
lang=plpython2u
state=present
login_host=db.example.com
port=5432
login_user=postgres
Kết hợp lại
Bây giờ, chúng ta đã biết một playbook của Ansible được cấu trúc như thế nào và các module PostgreSQL có sẵn cho chúng ta sử dụng, chúng ta có thể kết hợp các hiểu biết của mình trong một playbook của Ansible.
Mẫu playbook hoàn chỉnh của chúng ta trong file main.yml giống như sau:
---
- hosts: dbservers
sudo: yes
sudo_user: postgres
gather_facts: yes
vars:
dbname: module_test
dbuser: postgres
tasks:
- name: ensure the database is present
postgresql_db: >
state=present
db={{ dbname }}
login_user={{ dbuser }}
- name: ensure the tsm_system_rows extension is present
postgresql_ext: >
name=tsm_system_rows
state=present
db={{ dbname }}
login_user={{ dbuser }}
- name: ensure the user has access to database
postgresql_user: >
name=ada
password=lovelace
state=present
priv=CONNECT
db={{ dbname }}
login_user={{ dbuser }}
- name: ensure the user has necessary privileges
postgresql_user: >
name=ada
role_attr_flags=LOGIN,CREATEDB
login_user={{ dbuser }}
- name: ensure the user has schema privileges
postgresql_privs: >
privs=ALL
type=schema
objs=public
role=ada
db={{ dbname }}
login_user={{ dbuser }}
- name: ensure the postgresql-plpython-9.4 package is installed
apt: name=postgresql-plpython-9.4 state=latest
sudo_user: root
- name: ensure the PL/Python language is available
postgresql_lang: >
lang=plpython2u
state=present
db={{ dbname }}
login_user={{ dbuser }}
Bây giờ chúng ta có thể chạy playbook của mình với lệnh “ansible-playbook”:
gulcin@apatheticmagpie ~/blog/ansible-loves-postgresql # ansible-playbook -i hosts.ini main.yml
PLAY [dbservers] **************************************************************
GATHERING FACTS ***************************************************************
ok: [db.example.com]
TASK: [ensure the database is present] ****************************************
changed: [db.example.com]
TASK: [ensure the tsm_system_rows extension is present] ***********************
changed: [db.example.com]
TASK: [ensure the user has access to database] ********************************
changed: [db.example.com]
TASK: [ensure the user has necessary privileges] ******************************
changed: [db.example.com]
TASK: [ensure the user has schema privileges] *********************************
changed: [db.example.com]
TASK: [ensure the postgresql-plpython-9.4 package is installed] ***************
changed: [db.example.com]
TASK: [ensure the PL/Python language is available] ****************************
changed: [db.example.com]
PLAY RECAP ********************************************************************
db.example.com : ok=8 changed=7 unreachable=0 failed=0
Lời kết
Vậy là kết thúc bài viết hướng dẫn Tự động hóa PostgreSQL với Ansible. Điều này giúp việc quản lý và cấu hình các server được thuận tiện hơn rất nhiều. Hy vọng những thông tin này sẽ hữu ích với bạn và có thể giúp bạn áp dụng vào công việc của mình. Cảm ơn các bạn đã theo dõi.
Một số bài viết liên quan có thể bạn quan tâm:
- Tự xây dựng hệ thống CI/CD cùng Ansible, Docker và Drone
- Build Container Image Sử dụng Ansible-Bender
- Sử dụng Ansible để cài đặt và thiết lập Docker trên Ubuntu 18.04
- Sử dụng Ansible để cài đặt và thiết lập Docker trên Ubuntu 20.04
- Top 10 tips khi sử dụng Ansible
- Hướng dẫn cài đặt Kubernetes trên CentOS 7 tự động hoá với Ansible
Mọi thắc mắc xin hãy liên hệ
Email: [email protected]
(Nguồn: tranvanbinh.vn)