IaC

Tự động hóa PostgreSQL với Ansible

Ở 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.

Xem thêm: [Ansible] Thuộc tính selectattr trong playbook

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:

Mọi thắc mắc xin hãy liên hệ
Email: [email protected]

(Nguồn: tranvanbinh.vn)

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button