Ansible adalah salah satu alat otomatisasi TI yang paling terkenal dan banyak digunakan, ini membantu kami dalam mengotomatisasi tugas-tugas operasional TI seperti...
- Meng-bootstrap host (VM atau mesin bare-metal) dari awal
- Mengonfigurasi host dan layanan
- Mengelola penerapan dan peningkatan perangkat lunak
- Ansible juga memiliki dukungan untuk mengatur infrastruktur cloud seperti membuat sekumpulan instans EC2 dan RDS untuk aplikasi Anda di cloud publik (AWS, GCP, Azure). Selengkapnya tentang penyediaan cloud dapat ditemukan di sini
Karena blog ini sebagian besar tentang mengelola PostgreSQL menggunakan Ansible, kami tidak akan membahas detail penggunaan Ansible, namun, kami akan membahas beberapa dasar Ansible. Saya sarankan untuk membuka tautan dokumen Ansible jika Anda ingin mempelajarinya lebih lanjut.
Dasar-Dasar yang Memungkinkan
Ansible adalah proyek sumber terbuka yang ditulis dengan python yang kode sumbernya tersedia di GitHub. Karena ini adalah paket python, kami dapat dengan mudah menginstal Ansible menggunakan pip.
Ansible perlu diinstal hanya pada satu host tempat kami akan mengatur tugas operasional kami menggunakan perintah Ansible (Ansible, Ansible-playbook). Kami menyebut host orkestrasi ini sebagai Control Node.
Perintah yang dimungkinkan menggunakan pustaka OpenSSH untuk masuk ke host target untuk menjalankan tugas operasional, kami menyebut host target ini Managed Node.js. Nama host atau IP Managed Node disebutkan dalam file yang disebut Inventory, nama file inventaris ini kemudian ditentukan sebagai input ke perintah Ansible.
Dalam file inventaris, kami dapat membuat daftar beberapa host di bawah satu grup, ini akan menghindari pengulangan tugas yang sama beberapa kali untuk host yang berbeda. Detail lebih lanjut tentang penggunaan file inventaris dapat ditemukan di sini.
Karena perintah Ansible menggunakan SSH untuk login, tidak perlu menginstal Ansible di semua host, hanya perlu diinstal di Control Node. Namun, semua Control Node dan Managed Node harus memiliki python dan semua pustaka python yang diperlukan. Lebih lanjut tentang instalasi Ansible dapat ditemukan di sini.
Untuk demo, saya akan menggunakan laptop sebagai node kontrol dan guest CentOS-7 VM sebagai node yang dikelola. CentOS-7 VM disediakan menggunakan Vagrant pada penyedia VirtualBox.
Menginstal Ansible pada Control Node
Kami akan menginstal Ansible menggunakan pip seperti yang dirujuk di halaman dokumen Ansible. Perintah berikut dijalankan sebagai pengguna “Ansible”.
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ python get-pip.py --user
Menggunakan opsi --user, membuat perintah pip dan Ansible untuk diinstal di bawah direktori HOME dan kita perlu menambahkan jalur bin ke variabel lingkungan PATH kita.
$ echo 'export PATH=$HOME/Library/Python/2.7/bin:$PATH' >> ~/.bash_profile
$ source ~/.bash_profile
Perintah pip berikut telah menginstal Ansible versi 2.8.0 (yang merupakan versi stabil terbaru pada saat penulisan blog ini.)
$ pip install --user ansible
$ which ansible
/Users/Ansible/Library/Python/2.7/bin/Ansible
$ ansible --version
Ansible 2.8.0
...
...
Kontrol Node dan Precheck Node Terkelola
Pastikan Anda memiliki koneksi jaringan yang tepat antara node kontrol dan node terkelola.
Periksa Firewall Anda untuk mengetahui aturan apa pun yang dapat memblokir koneksi masuk dan keluar pada port SSH, jika demikian, buka port SSH untuk memberikan akses pada node kontrol dan terkelola.
Pertama, coba sambungkan melalui SSH ke node yang dikelola. Anda seharusnya dapat masuk ke node terkelola dari node kontrol.
Anda dapat mengatur akses SSH tanpa kata sandi ke node yang dikelola sesuai dengan kebijakan keamanan organisasi Anda. Untuk demo ini, saya memiliki konfigurasi tanpa kata sandi untuk SSH ke node terkelola saya "pg01" (CentOS-7) untuk pengguna "gelandangan". Hal ini membuat node yang dikelola memiliki kekuatan sudo, sebagian besar tugas penginstalan dan konfigurasi host akan dijalankan sebagai pengguna “gelandangan” dengan “sudo”.
Pada node kontrol, kami memiliki file konfigurasi ansible.cfg yang akan digunakan oleh perintah Ansible. Di bawah ini adalah beberapa opsi konfigurasi yang ditentukan dalam file konfigurasi. Untuk mempelajari lebih lanjut tentang opsi konfigurasi lain yang tersedia, lihat contoh file konfigurasi.
- remote_port - Jika server SSH pada node yang dikelola berjalan pada port lain selain port default 22, kita dapat mengubahnya
- remote_user - Nama pengguna login yang akan digunakan oleh Ansible untuk menghubungkan node yang dikelola, untuk menjalankan tugas
- private_key_file - kunci pribadi SSH yang akan digunakan untuk Memungkinkan untuk masuk
Karena konfigurasi tersebut di atas berlaku secara global untuk semua node yang dikelola, jika kita ingin memiliki konfigurasi yang berbeda untuk host atau grup host tertentu, kita dapat menentukannya di file inventaris. Anda dapat melihat contohnya di bawah ini di file inventaris “development.yaml”.
Melakukan Lari Kering yang Memungkinkan
Buat file inventaris “development.yaml” seperti yang ditunjukkan di bawah ini.
$ pwd
/Users/Ansible/postgres-setup
$ cat development.yaml
all:
hosts:
children:
postgres_clusters:
hosts:
pg01:
vars:
ansible_port: 22
ansible_user: "vagrant"
ansible_private_key_file: "/Users/Ansible/postgres-setup/private_key"
Dalam file inventaris di atas Host pg01 adalah salah satu anggota grup host postgres_clusters. Variabel ansible_port, ansible_user, dan ansible_private_key_file hanya berlaku untuk host di bawah grup postgres_clusters.
Kami sekarang akan memeriksa untuk melihat apakah Ansible dapat menjalankan tugas pada node yang dikelola. Pada contoh di bawah, perintah ansible mengeksekusi ping modul pada node terkelola pg01, jika Ansible dapat menjalankan ping modul maka Anda akan melihat SUCCESS sebagai responsnya.
$ ansible -i development.yaml -m ping pg01
pg01 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
Saat menjalankan Ansible pada node yang dikelola sebagai tugas pertama, ia mengumpulkan info seperti nama host, alamat IP, memori dari node yang dikelola. Untuk memeriksa ini, kita dapat memanggil pengaturan modul yang akan mengembalikan JSON besar. Kami dapat menggunakan salah satu dari ini di buku pedoman Ansible kami.
$ ansible -i development.yaml -m setup pg01
pg01 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.100.4",
"10.0.2.15"
],
"ansible_all_ipv6_addresses": [
"fe80::a00:27ff:fe29:ac89",
"fe80::5054:ff:fe26:1060"
],
Peran yang Mungkin
Ansible Role adalah cara menggabungkan serangkaian tugas terkait dan pengaturan konfigurasi ke dalam satu unit hanya dengan menetapkan peran ke host atau grup host tertentu. Ansible akan menerapkan semua konfigurasi dan tugas terkait. Ini menghindari pengulangan tugas beberapa kali untuk setiap host atau grup host yang berbeda.
Setiap peran direpresentasikan sebagai direktori dan di dalam direktori peran akan ada subdirektori seperti file default, penangan, meta, tugas, templat, tes, vars. Tujuan direktori ini dapat ditemukan di sini.
Perintah yang memungkinkan, secara default, mencari direktori peran di bawah jalur yang disebutkan di DEFAULT_ROLES_PATH.
$ ansible-config list | grep -A2 '^DEFAULT_ROLES_PATH'
DEFAULT_ROLES_PATH:
default: ~/.Ansible/roles:/usr/share/Ansible/roles:/etc/Ansible/roles
description: Colon separated paths in which Ansible will search for Roles.
Galaksi Kemungkinan
Ansible Galaxy adalah portal tempat komunitas berbagi repositori GitHub dari Ansible Roles mereka. Kami dapat menelusuri portal galaksi untuk peran Ansible yang diperlukan. Menggunakan perintah ansible-galaxy, kita dapat mengunduh dan menggunakan kembali peran tersebut. Sebelum menggunakan peran, baca secara detail semua file YAML yang Dimungkinkan di bawah direktori default, vars, tugas, templat, penangan, dan perhatikan cara kerja peran.
Untuk penerapan PostgreSQL, kami akan menggunakan peran “postgresql” yang dikembangkan oleh penulis ANXS dan repo GitHub.
Menginstal peran Ansible “anxs.postgresql”
$ ansible-galaxy install anxs.postgresql
- downloading role 'postgresql', owned by anxs
- downloading role from https://github.com/ANXS/postgresql/archive/v1.10.1.tar.gz
- extracting anxs.postgresql to /Users/ansible/.Ansible/roles/anxs.postgresql
- anxs.postgresql (v1.10.1) was installed successfully
Perintah di atas menginstal direktori peran ”anxs.postgresql” di bawah direktori “/Users/ansible/.Ansible/roles,” ini adalah salah satu direktori di DEFAULT_ROLES_PATH dan perintah ansible akan mencari direktori ini untuk peran apa pun.
Playbook yang Memungkinkan
Ansible Playbook adalah file YAML di mana kami akan mencantumkan tugas atau peran yang harus dijalankan pada host atau grup host tertentu. Anda dapat membaca lebih lanjut tentang mengembangkan buku pedoman serta mempelajari definisi tag seperti host, tugas, peran, vars di sini.
Secara default, semua tugas dijalankan sebagai pengguna yang memungkinkan yang telah masuk. Untuk menjalankan tugas tertentu dengan pengguna yang berbeda (atau dengan hak 'root'), kita dapat menggunakan menjadi. Cara menggunakan perintah ini dapat ditemukan di sini.
Dalam buku pedoman di bawah ini (postgres-play.yaml), saya telah mendaftarkan peran "anxs.postgresql" di bawah grup host "postgres_clusters", jadi semua tugas dalam peran anxs.postgresql akan dieksekusi untuk semua host di bawah grup “postgres_clusters”.
$ cat postgres-play.yaml
---
- hosts: postgres_clusters
become: yes
roles:
- role: anxs.postgresql
menjadi:ya dalam YAML mendefinisikan bahwa peran ini akan dieksekusi dengan hak istimewa yang lebih tinggi dengan menggunakan DEFAULT_BECOME_METHOD “sudo”
$ ansible-config list | grep -A2 '^DEFAULT_BECOME_METHOD'
DEFAULT_BECOME_METHOD:
default: sudo
description: Privilege escalation method to use when `become` is enabled.
Kami akan menjalankan buku pedoman ini sebagai pengguna "gelandangan" dan pengguna sudah disediakan dengan sudo power.
[[email protected] ~]$ sudo cat /etc/sudoers.d/vagrant
%vagrant ALL=(ALL) NOPASSWD: ALL
Panduan Manynines DevOps untuk Manajemen DatabasePelajari tentang apa yang perlu Anda ketahui untuk mengotomatisasi dan mengelola database open source AndaUnduh Gratis Menyebarkan PostgreSQL Menggunakan Ansible
Kami sekarang akan menjalankan playbook 'postgres-play.yaml' yang akan menginstal semua paket terkait PostgreSQL dan mengonfigurasinya menggunakan pengaturan default.
Untuk contoh ini, Ansible akan menginstal PostgreSQL 9.6 pada port 5432, dengan postgres max_connections diatur ke 100. Semua pengaturan default dapat ditemukan di file /Users/ansible/.Ansible/roles/anxs.postgresql/defaults/main.yml .
$ grep -E '^postgresql_(version|port|max_connections):' ~/.Ansible/roles/anxs.postgresql/defaults/main.yml
postgresql_version: 9.6
postgresql_port: 5432
postgresql_max_connections: 100
Menjalankan buku pedoman
$ ansible-playbook -i development.yaml postgres-play.yaml
PLAY [postgres_clusters] ***************************************************************************************************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************************************************************************************************
ok: [pg01]
...
...
PLAY RECAP *****************************************************************************************************************************************************************************************************
pg01 : ok=21 changed=14 unreachable=0 failed=0 skipped=32 rescued=0 ignored=0
Setelah Ansible menjalankan semua tugas, ringkasan eksekusi tugas akan ditampilkan di bawah PLAY RECAP.
- ok=21, 21 tugas dijalankan tanpa perubahan.
- berubah=14, 14 tugas telah membuat perubahan pada host, seperti menginstal postgres, membuat direktori, file, memulai postgres.
- dilewati=32, 32 tugas telah dilewati, mungkin karena beberapa fitur tidak diaktifkan. Karena kami menginstal di entOS, tugas terkait Ubuntu dilewati.
Periksa status dan konfigurasi layanan PostgreSQL.
[[email protected] ~]$ systemctl status postgresql-9.6
● postgresql-9.6.service - PostgreSQL 9.6 database server
Loaded: loaded (/usr/lib/systemd/system/postgresql-9.6.service; enabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/postgresql-9.6.service.d
└─custom.conf
Active: active (running) since Wed 2019-05-29 07:15:25 UTC; 24min ago
Docs: https://www.postgresql.org/docs/9.6/static/
Process: 7559 ExecStartPre=/usr/pgsql-9.6/bin/postgresql96-check-db-dir /var/lib/pgsql/9.6/data (code=exited, status=0/SUCCESS)
Main PID: 7564 (postmaster)
CGroup: /system.slice/postgresql-9.6.service
├─7564 /usr/pgsql-9.6/bin/postmaster -D /etc/postgresql/9.6/data
├─7567 postgres: checkpointer process
├─7568 postgres: writer process
├─7569 postgres: wal writer process
├─7570 postgres: autovacuum launcher process
└─7571 postgres: stats collector process
[[email protected] ~]$ psql -U postgres
psql (9.6.13)
Type "help" for help.
postgres=# show max_connections ;
max_connections
-----------------
100
(1 row)
postgres=# show statement_timeout ;
statement_timeout
-------------------
(1 row)
postgres=# show log_min_duration_statement ;
log_min_duration_statement
----------------------------
-1
(1 row)
Kami sekarang telah menginstal PostgreSQL pada host terkelola “pg01” menggunakan konfigurasi default.
Mengubah Konfigurasi PostgreSQL
Sekarang kita akan mengkonfigurasi ulang instance PostgreSQL menggunakan pengaturan khusus kita.
Saya telah membuat file custom.yaml (seperti yang ditunjukkan di bawah) yang memiliki daftar variabel yang ditentukan untuk mengubah pengaturan PostgreSQL seperti listen_addresses, max_connections, wal_level, hot_standby, statement_timeout, log_checkpoint, log_lock_waits, log_destination, log_min_duration_statement.
$ pwd
/Users/ansible/postgres-setup
$ cat custom.yaml
postgresql_listen_addresses: "*"
postgresql_max_connections: 300
postgresql_wal_level: "hot_standby"
postgresql_hot_standby: "on"
postgresql_statement_timeout: 60000
postgresql_log_lock_waits: "on"
postgresql_log_destination: "csvlog"
postgresql_log_min_duration_statement: 0
Kami sekarang akan mengubah postgres-play.yaml playbook kami untuk menggunakan custom.yaml ini.
$ cat postgres-play.yaml
---
- hosts: postgres_clusters
become: yes
vars_files:
- ./custom.yaml
roles:
- role: anxs.postgresql
Menggunakan tag vars_files, saya telah menentukan file konfigurasi kustom custom.yaml, yang akan menimpa konfigurasi default yang ditentukan dalam peran anxs.postgresql. Detail lebih lanjut tentang prioritas variabel dapat ditemukan di sini.
Kita sekarang dapat menjalankan kembali perintah ansible-playbook yang sama yang telah kita jalankan sebelumnya, tetapi ini akan menjalankan semua tugas seperti menginstal PostgreSQL, mengonfigurasi, membuat pengguna dan database. Untuk ini, kita harus membatasi Ansible untuk hanya menjalankan tugas yang terkait dengan konfigurasi PostgreSQL dengan menggunakan opsi --tags
Untuk mengetahui daftar tag yang didukung, kita dapat menjalankan perintah dengan --list-tags.
$ ansible-playbook -i development.yaml postgres-play.yaml --list-tags
playbook: postgres-play.yaml
play #1 (postgres_clusters): postgres_clusters TAGS: []
TASK TAGS: [always, postgresql, postgresql-configure, postgresql-databases, postgresql-extensions, postgresql-install, postgresql-monit, postgresql-users]
Dari tag di atas, kami hanya akan menentukan tag postgresql-configure untuk mengubah pengaturan postgresql.
$ ansible-playbook -i development.yaml postgres-play.yaml --tags postgresql-configure
PLAY [postgres_clusters] ***************************************************************************************************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************************************************************************************************
ok: [pg01]
...
...
TASK [anxs.postgresql : PostgreSQL | Update configuration - pt. 2 (postgresql.conf)] ***************************************************************************************************************************
changed: [pg01]
...
...
TASK [anxs.postgresql : PostgreSQL | Reload all conf files] ****************************************************************************************************************************************************
changed: [pg01]
PLAY RECAP *****************************************************************************************************************************************************************************************************
pg01 : ok=13 changed=2 unreachable=0 failed=0 skipped=6 rescued=0 ignored=0
Seperti yang Anda lihat di PLAY RECAP, hanya 2 perubahan yang diterapkan ke node terkelola pg01. Yang pertama memperbarui konfigurasi dan yang kedua memuat ulang konfigurasi.
Verifikasi bahwa perubahan konfigurasi telah diterapkan pada node yang dikelola.
postgres=# show listen_addresses ;
listen_addresses
------------------
localhost
(1 row)
postgres=# show max_connections ;
max_connections
-----------------
100
(1 row)
postgres=# show wal_level ;
wal_level
-----------
minimal
(1 row)
postgres=# show hot_standby ;
hot_standby
-------------
off
(1 row)
postgres=# show statement_timeout;
statement_timeout
-------------------
1min
(1 row)
postgres=# show log_lock_waits ;
log_lock_waits
----------------
on
(1 row)
postgres=# show log_destination ;
log_destination
-----------------
csvlog
(1 row)
postgres=# show log_min_duration_statement;
log_min_duration_statement
----------------------------
(1 row)
Seperti yang Anda lihat, beberapa perubahan konfigurasi seperti listen_addresses, max_connections, wal_level, hot_standby belum diterapkan. Perubahan konfigurasi ini memerlukan restart PostgreSQL dan peran anxs.postgresql hanya memuat ulang layanan itu sendiri.
Untuk menghindari restart PostgreSQL secara tiba-tiba selama jam produksi, penulis asli mungkin tidak menambahkan tugas restart ke peran. Kami dapat memulai ulang layanan postgresql secara manual, selama waktu henti yang dijadwalkan.
[[email protected] ~]$ sudo systemctl restart postgresql-9.6
[[email protected] ~]$ psql -U postgres
psql (9.6.13)
postgres=# show listen_addresses ;
listen_addresses
------------------
(1 row)
postgres=# show max_connections ;
max_connections
-----------------
300
(1 row)
postgres=# show wal_level;
wal_level
-----------
replica
(1 row)
postgres=# show hot_standby;
hot_standby
-------------
on
(1 row)
Membuat Pengguna &Basis Data PostgreSQL
Kami sekarang akan membuat pengguna "app1" dan "app2" dan database "app1_db" dan "app2_db" yang dimiliki oleh pengguna "app1" dan "app2".
Saya telah menambahkan dua variabel baru, postgresql_users dan postgresql_database ke custom.yaml, yang memiliki daftar pengguna dan database yang perlu dibuat. Peran anxs.postgresql menggunakan modul Ansible postgresql_users dan postgresql_db untuk membuat pengguna dan database. Anda dapat merujuk ke dokumen ini untuk menambahkan variabel.
$ cat custom.yaml
...
...
postgresql_users:
- name: app1
pass: md5bb0592c05941d14c231da96950c71b60
encrypted: yes
- name: app2
pass: md5bbb1e4d09b64ca54a237727af46cba7c
encrypted: yes
postgresql_databases:
- name: app1_db
owner: app1
- name: app2_db
owner: app2
Sekarang kita hanya akan menjalankan tugas yang terkait dengan tag postgresql-users dan postgresql-databases.
$ ansible-playbook -i development.yaml postgres-play.yaml --tags postgresql-users,postgresql-databases
PLAY [postgres_clusters] ***************************************************************************************************************************************************************************************
...
...
TASK [anxs.postgresql : PostgreSQL | Make sure the PostgreSQL users are present] *******************************************************************************************************************************
changed: [pg01] => (item=None)
changed: [pg01] => (item=None)
changed: [pg01]
...
...
TASK [anxs.postgresql : PostgreSQL | Make sure the PostgreSQL databases are present] ***************************************************************************************************************************
changed: [pg01] => (item={u'owner': u'app1', u'name': u'app1_db'})
changed: [pg01] => (item={u'owner': u'app2', u'name': u'app2_db'})
...
...
PLAY RECAP *****************************************************************************************************************************************************************************************************
pg01 : ok=6 changed=2 unreachable=0 failed=0 skipped=9 rescued=0 ignored=0
Pastikan pengguna dan database dibuat di host yang dikelola.
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
app1 | | {}
app2 | | {}
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
app1_db | app1 | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
app2_db | app2 | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(5 rows)
Mengizinkan Host Eksternal Terhubung ke Server PostgreSQL
Sekarang kita akan mengizinkan host eksternal untuk menghubungkan layanan PostgreSQL dengan menambahkan variabel postgresql_pg_hba_custom ke custom.yaml
$ cat custom.yaml
...
...
postgresql_pg_hba_custom:
- {type: "host", database: "all", user: "all", address: "0.0.0.0/0", method: "md5" }
Menjalankan tugas yang ditandai dengan postgresql-configure, untuk menerapkan konfigurasi.
$ ansible-playbook -i development.yaml postgres-play.yaml --tags postgresql-configure
Memverifikasi apakah saya dapat terhubung ke server PostgreSQL dari node kontrol saya.
$ PGPASSWORD=password psql -h pg01 -U app1 -d app1_db -c 'Select true'
bool
------
(1 row)
Kesimpulan
Blog ini akan memberi Anda dasar-dasar yang perlu Anda ketahui untuk menggunakan Ansible untuk menerapkan dan mengelola PostgreSQL. Namun, kami hanya membahas beberapa tugas administrasi PostgreSQL. Bergantung pada infrastruktur organisasi Anda, Anda mungkin perlu mengganti beberapa konfigurasi default dan menambahkan lebih banyak tugas ke peran Ansible.