PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Ansible Loves PostgreSQL

Ansible benar-benar hebat dan PostgreSQL benar-benar luar biasa, mari kita lihat bagaimana mereka bekerja bersama dengan luar biasa!

====================Pengumuman prime time! ====================

PGConf Europe 2015 akan diadakan pada 27-30 Oktober di Wina tahun ini.

Saya berasumsi Anda mungkin tertarik dengan manajemen konfigurasi, orkestrasi server, penerapan otomatis (itulah sebabnya Anda membaca posting blog ini, bukan?) dan Anda suka bekerja dengan PostgreSQL (pasti) di AWS (opsional), maka Anda mungkin ingin bergabung dengan ceramah saya “Mengelola PostgreSQL dengan Ansible” pada 28 Oktober, 15-15:50.

Silakan periksa jadwal yang luar biasa dan jangan lewatkan kesempatan untuk menghadiri acara PostgreSQL terbesar di Eropa!

Sampai jumpa di sana, ya, saya suka minum kopi setelah mengobrol

====================Pengumuman prime time! ====================

Apa itu Ansible dan bagaimana cara kerjanya?

Moto Ansible adalah “sotomatisasi TI open source yang sederhana, tanpa agen, dan kuat ” dengan mengutip dari Ansible docs.

Seperti yang dapat dilihat dari gambar di bawah, beranda Ansible menyatakan bahwa area penggunaan utama Ansible sebagai:penyediaan, manajemen konfigurasi, penerapan aplikasi, pengiriman berkelanjutan, keamanan dan kepatuhan, orkestrasi. Menu ikhtisar juga menunjukkan pada platform mana kami dapat mengintegrasikan Ansible yaitu AWS, Docker, OpenStack, Red Hat, Windows.

Mari kita periksa kasus penggunaan utama Ansible untuk memahami cara kerjanya dan seberapa bermanfaatnya untuk lingkungan TI.

Penyediaan

Ansible adalah teman setia Anda ketika Anda ingin mengotomatiskan semua yang ada di sistem Anda. Ini tanpa agen dan Anda dapat dengan mudah mengelola barang-barang Anda (yaitu server, penyeimbang beban, sakelar, firewall) melalui SSH. Apakah sistem Anda berjalan di server bare-metal atau cloud Ansible akan ada di sana dan membantu Anda menyediakan instans Anda. Karakteristik idempotennya memastikan bahwa Anda akan selalu berada dalam kondisi yang Anda inginkan (dan harapkan).

Manajemen Konfigurasi

Salah satu hal tersulit adalah tidak mengulangi tugas operasional yang berulang dan di sini Ansible muncul di benak Anda lagi sebagai penyelamat. Di masa lalu yang indah ketika masa-masa sulit, sysadmin menulis banyak skrip dan menghubungkan ke banyak server untuk menerapkannya dan itu jelas bukan hal terbaik dalam hidup mereka. Seperti yang kita semua tahu, tugas manual rentan terhadap kesalahan dan mengarah ke lingkungan yang heterogen bukannya homogen dan lebih mudah dikelola, dan tentunya membuat hidup kita lebih stres.

Dengan Ansible Anda dapat menulis buku pedoman sederhana (dengan bantuan dokumentasi yang sangat informatif dan dukungan dari komunitasnya yang besar) dan setelah Anda menulis tugas Anda, Anda dapat memanggil berbagai modul (yaitu AWS, Nagios, PostgreSQL, SSH, APT, File modul). Hasilnya, Anda dapat fokus pada lebih banyak aktivitas kreatif daripada mengelola konfigurasi secara manual.

Penerapan Aplikasi

Setelah artefak siap, sangat mudah untuk menyebarkannya ke sejumlah server. Karena Ansible berkomunikasi melalui SSH, tidak perlu menarik dari repositori di setiap server atau repot dengan metode kuno seperti menyalin file melalui FTP. Ansible dapat menyinkronkan artefak dan memastikan bahwa hanya file baru atau yang diperbarui yang ditransfer dan file usang yang dihapus. Ini juga mempercepat transfer file dan menghemat banyak bandwidth.

Selain mentransfer file, Ansible juga membantu membuat server siap untuk penggunaan produksi. Sebelum mentransfer, ia dapat menjeda pemantauan, menghapus server dari penyeimbang beban, dan menghentikan layanan. Setelah penerapan, itu dapat memulai layanan, menambahkan server untuk memuat penyeimbang, dan melanjutkan pemantauan.

Semua ini tidak harus terjadi sekaligus untuk semua server. Ansible dapat bekerja pada subset server sekaligus untuk menyediakan penerapan tanpa waktu henti. Misalnya pada satu waktu dapat menyebarkan 5 server sekaligus, dan kemudian dapat menyebarkan ke 5 server berikutnya ketika mereka selesai.

Setelah menerapkan skenario ini, itu dapat dieksekusi di mana saja. Pengembang atau anggota tim QA dapat membuat penerapan di mesin mereka sendiri untuk tujuan pengujian. Selain itu, untuk mengembalikan penerapan karena alasan apa pun, semua kebutuhan Ansible adalah lokasi artefak kerja yang terakhir diketahui. Kemudian dapat dengan mudah digunakan kembali di server produksi untuk mengembalikan sistem ke status stabil.

Pengiriman Berkelanjutan

Pengiriman berkelanjutan berarti mengadopsi pendekatan yang cepat dan sederhana untuk rilis. Untuk mencapai tujuan itu, sangat penting untuk menggunakan alat terbaik yang memungkinkan rilis sering tanpa downtime dan memerlukan intervensi manusia sesedikit mungkin. Karena kita telah mempelajari tentang kemampuan penerapan aplikasi Ansible di atas, cukup mudah untuk melakukan penerapan dengan waktu henti nol. Persyaratan lain untuk pengiriman berkelanjutan adalah proses manual yang lebih sedikit dan itu berarti otomatisasi. Ansible dapat mengotomatiskan tugas apa pun mulai dari menyediakan server hingga mengonfigurasi layanan agar siap produksi. Setelah membuat dan menguji skenario di Ansible, menjadi sepele untuk menempatkannya di depan sistem integrasi berkelanjutan dan membiarkan Ansible melakukan tugasnya.

Keamanan dan Kepatuhan

Keamanan selalu dianggap sebagai hal yang paling penting tetapi menjaga sistem tetap aman adalah salah satu hal yang paling sulit untuk dicapai. Anda harus yakin tentang keamanan data Anda serta keamanan data pelanggan Anda. Untuk memastikan keamanan sistem Anda,  mendefinisikan keamanan saja tidak cukup, Anda harus dapat menerapkan keamanan tersebut dan terus memantau sistem Anda untuk memastikan mereka tetap mematuhi keamanan tersebut.

Ansible mudah digunakan baik itu tentang menyiapkan aturan firewall, mengunci pengguna dan grup, atau menerapkan kebijakan keamanan khusus. Sifatnya aman karena Anda dapat berulang kali menerapkan konfigurasi yang sama, dan itu hanya akan membuat perubahan yang diperlukan untuk mengembalikan sistem ke kepatuhan.

Orkestrasi

Ansible memastikan bahwa semua tugas yang diberikan berada dalam urutan yang tepat dan membangun keselarasan antara semua sumber daya yang dikelolanya. Mengatur penerapan multi-tingkat yang kompleks menjadi lebih mudah dengan manajemen konfigurasi dan kemampuan penerapan Ansible. Misalnya, dengan mempertimbangkan penyebaran tumpukan perangkat lunak, masalah seperti memastikan bahwa semua server basis data sudah siap sebelum mengaktifkan server aplikasi atau mengonfigurasi jaringan sebelum menambahkan server ke penyeimbang beban bukanlah masalah yang rumit lagi.

Ansible juga membantu orkestrasi alat orkestrasi lain seperti Amazon CloudFormation, OpenStack's Heat, Docker's Swarm, dll. Dengan cara ini, alih-alih mempelajari platform, bahasa, dan aturan yang berbeda; pengguna hanya dapat berkonsentrasi pada sintaks YAML Ansible dan modul yang kuat.

Apa itu Modul yang Mungkin?

Modul atau pustaka modul menyediakan cara yang memungkinkan untuk mengontrol atau mengelola sumber daya di server lokal atau jauh. Mereka melakukan berbagai fungsi. Misalnya, sebuah modul mungkin bertanggung jawab untuk me-reboot mesin atau hanya menampilkan pesan di layar.

Ansible memungkinkan pengguna untuk menulis modul mereka sendiri dan juga menyediakan modul inti atau tambahan yang siap pakai.

Bagaimana dengan playbook Ansible?

Ansible memungkinkan kita untuk mengatur pekerjaan kita dengan berbagai cara. Dalam bentuknya yang paling langsung, kita dapat bekerja dengan modul Ansible menggunakan "ansible ” alat baris perintah dan file inventaris.

Inventaris

Salah satu konsep yang paling penting adalah inventaris . Kami memerlukan file inventaris agar Ansible mengetahui server mana yang perlu disambungkan menggunakan SSH, informasi koneksi apa yang diperlukan, dan secara opsional variabel mana yang terkait dengan server tersebut.

File inventaris dalam format seperti INI. Dalam file inventaris, kita dapat menentukan lebih dari satu host dan mengelompokkannya dalam lebih dari satu grup host.

Contoh file inventori kita hosts.ini seperti berikut ini:

[dbservers]
db.example.com

Di sini kita memiliki satu host yang disebut "db.example.com" dalam grup host yang disebut "dbservers". Dalam file inventaris, kami juga dapat menyertakan port SSH khusus, nama pengguna SSH, kunci SSH, informasi proxy, variabel, dll.

Karena kami memiliki file inventaris yang siap, untuk melihat waktu aktif server basis data kami, kami dapat memanggil “perintah Ansible ” dan jalankan “waktu aktif ” perintah pada server tersebut:

ansible dbservers -i hosts.ini -m command -a "uptime"

Di sini kami menginstruksikan Ansible untuk membaca host dari file hosts.ini, menghubungkannya menggunakan SSH, menjalankan “uptime ” pada masing-masing dari mereka, dan kemudian mencetak hasilnya ke layar. Jenis eksekusi modul ini disebut perintah ad-hoc .

Output dari perintah akan seperti:

[email protected] ~/blog/ansible-loves-postgresql # ansible dbservers -i hosts.ini -m command -a "uptime"
db.example.com | success | rc=0 >>
21:16:24 up 93 days,  9:17,  4 users,  load average: 0.08, 0.03, 0.05

Namun, jika solusi kami berisi lebih dari satu langkah, menjadi sulit untuk mengelolanya hanya dengan menggunakan perintah ad-hoc.

Inilah buku pedoman Ansible. Ini memungkinkan kami untuk mengatur solusi kami dalam file buku pedoman dengan mengintegrasikan semua langkah melalui tugas, variabel, peran, templat, penangan, dan inventaris.

Mari kita lihat sekilas beberapa istilah ini untuk memahami bagaimana istilah tersebut dapat membantu kita.

Tugas

Konsep penting lainnya adalah tugas. Setiap tugas Ansible berisi nama, modul yang akan dipanggil, parameter modul, dan pra/pasca-kondisi opsional. Mereka memungkinkan kita untuk memanggil modul Ansible dan meneruskan informasi ke tugas yang berurutan.

Variabel

Ada juga variabel. Mereka sangat berguna untuk menggunakan kembali informasi yang kami berikan atau kumpulkan. Kami dapat mendefinisikannya di inventaris, di file YAML eksternal, atau di playbook.

Playbook

Playbook yang memungkinkan ditulis menggunakan sintaks YAML. Ini mungkin berisi lebih dari satu drama. Setiap permainan berisi nama grup tuan rumah untuk dihubungkan dan tugas yang harus dilakukan. Ini juga dapat berisi variabel/peran/penangan, jika ditentukan.

Sekarang kita dapat melihat buku pedoman yang sangat sederhana untuk melihat bagaimana strukturnya:

---

- hosts: dbservers
  gather_facts: no

  vars:
    who: World

  tasks:
  - name: say hello
    debug: msg="Hello {{ who }}"

  - name: retrieve the uptime
    command: uptime

Dalam pedoman yang sangat sederhana ini, kami memberi tahu Ansible bahwa itu harus beroperasi pada server yang ditentukan dalam grup host "dbservers". Kami membuat variabel yang disebut "siapa" dan kemudian kami mendefinisikan tugas kami. Perhatikan bahwa dalam tugas pertama di mana kita mencetak pesan debug, kita menggunakan variabel “who” dan menyebabkan Ansible untuk mencetak “Hello World” ke layar. Di tugas kedua, kami memberi tahu Ansible untuk terhubung ke setiap host dan kemudian menjalankan perintah “uptime” di sana.

Modul PostgreSQL yang Memungkinkan

Ansible menyediakan sejumlah modul untuk PostgreSQL. Beberapa di antaranya terletak di bawah modul inti sementara yang lain dapat ditemukan di bawah modul tambahan.

Semua modul PostgreSQL memerlukan paket Python psycopg2 untuk diinstal pada mesin yang sama dengan server PostgreSQL. Psycopg2 adalah adaptor database PostgreSQL dalam bahasa pemrograman Python.

Pada sistem Debian/Ubuntu, paket psycopg2 dapat diinstal menggunakan perintah berikut:

apt-get install python-psycopg2

Sekarang kita akan memeriksa modul-modul ini secara rinci. Sebagai contoh, kita akan bekerja pada server PostgreSQL di host db.example.com pada port 5432 dengan postgres pengguna dan kata sandi kosong.

postgresql_db

Modul inti ini membuat atau menghapus database PostgreSQL yang diberikan. Dalam terminologi Ansible, ini memastikan bahwa database PostgreSQL yang diberikan ada atau tidak ada.

Opsi yang paling penting adalah parameter yang diperlukan “nama ”. Ini mewakili nama database di server PostgreSQL. Parameter penting lainnya adalah “status ”. Ini membutuhkan salah satu dari dua nilai:present atau absen . Hal ini memungkinkan kita untuk membuat atau menghapus database yang diidentifikasi dengan nilai yang diberikan dalam nama parameter.

Beberapa alur kerja mungkin juga memerlukan spesifikasi parameter koneksi seperti login_host , pelabuhan , pengguna_login , dan login_password .

Mari buat database bernama “module_test ” di server PostgreSQL kami dengan menambahkan baris di bawah ini ke file buku pedoman kami:

- postgresql_db: name=module_test
                 state=present
                 login_host=db.example.com
                 port=5432
                 login_user=postgres

Di sini, kami terhubung ke server database pengujian kami di db.example.com dengan pengguna; postgres . Namun, itu tidak harus postgres user sebagai username bisa apa saja.

Menghapus database semudah membuatnya:

- postgresql_db: name=module_test
                 state=absent
                 login_host=db.example.com
                 port=5432
                 login_user=postgres

Catat nilai "absen" di parameter "status".

postgresql_ext

PostgreSQL dikenal memiliki ekstensi yang sangat berguna dan kuat. Misalnya, ekstensi terbaru adalah tsm_system_rows yang membantu mengambil jumlah baris yang tepat dalam pengambilan sampel tabel. (Untuk informasi lebih lanjut Anda dapat memeriksa posting saya sebelumnya tentang metode tablesampling.)

Modul ekstra ini menambah atau menghapus ekstensi PostgreSQL dari database. Ini membutuhkan dua parameter wajib:db dan nama . db parameter mengacu pada nama database dan nama parameter mengacu pada nama ekstensi. Kami juga memiliki negara bagian parameter yang perlu hadir atau absen nilai, dan parameter koneksi yang sama seperti pada modul postgresql_db.

Mari kita mulai dengan membuat ekstensi yang kita bicarakan:

- postgresql_ext: db=module_test
                  name=tsm_system_rows
                  state=present
                  login_host=db.example.com
                  port=5432
                  login_user=postgres

postgresql_user

Modul inti ini memungkinkan penambahan atau penghapusan pengguna dan peran dari database PostgreSQL.

Ini adalah modul yang sangat kuat karena sambil memastikan pengguna ada di database, itu juga memungkinkan modifikasi hak istimewa atau peran pada saat yang sama.

Mari kita mulai dengan melihat parameternya. Parameter wajib tunggal di sini adalah “nama ”, yang merujuk pada pengguna atau nama peran. Juga, seperti pada kebanyakan modul Ansible, "status ” parameter itu penting. Itu dapat memiliki salah satu dari hadiah atau absen nilai dan nilai defaultnya adalah sekarang .

Selain parameter koneksi seperti pada modul sebelumnya, beberapa parameter opsional penting lainnya adalah:

  • db :Nama database tempat izin akan diberikan
  • sandi :Kata sandi pengguna
  • pribadi :Hak istimewa dalam “priv1/priv2” atau hak istimewa tabel dalam format “tabel:priv1,priv2,…”
  • peran_attr_flags :Atribut peran. Nilai yang mungkin adalah:
    • [TIDAK] PENGGUNA SUPER
    • [TIDAK]KREATOR
    • [TIDAK]CREATEUSER
    • [TIDAK]DIBUAT
    • [TIDAK]WERIT
    • [TIDAK]MASUK
    • [TIDAK]REPLIKASI

Untuk membuat pengguna baru bernama ada dengan kata sandi lovelace dan hak istimewa koneksi ke database module_test , kami dapat menambahkan yang berikut ini ke buku pedoman kami:

- postgresql_user: db=module_test
                   name=ada
                   password=lovelace
                   state=present
                   priv=CONNECT
                   login_host=db.example.com
                   port=5432
                   login_user=postgres

Sekarang setelah pengguna siap, kami dapat menetapkan beberapa peran untuknya. Untuk mengizinkan “ada” masuk dan membuat database:

- postgresql_user: name=ada
                   role_attr_flags=LOGIN,CREATEDB
                   login_host=db.example.com
                   port=5432
                   login_user=postgres

Kami juga dapat memberikan hak istimewa berbasis tabel atau global seperti “INSERT ”, “PERBARUI ”, “PILIH ”, dan “HAPUS ” menggunakan priv parameter. Satu hal penting yang perlu dipertimbangkan adalah bahwa pengguna tidak dapat dihapus sampai semua hak istimewa yang diberikan dicabut terlebih dahulu.

postgresql_privs

Modul inti ini memberikan atau mencabut hak istimewa pada objek database PostgreSQL. Objek yang didukung adalah:tabel , urutan , fungsi , basis data , skema , bahasa , ruang tabel , dan grup .

Parameter yang diperlukan adalah “database”; nama database untuk memberikan/mencabut hak istimewa, dan “peran”; daftar nama peran yang dipisahkan koma.

Parameter opsional yang paling penting adalah:

  • ketik :Jenis objek untuk mengatur hak istimewa. Dapat berupa salah satu dari:tabel, urutan, fungsi, database, skema, bahasa, tablespace, grup . Nilai default adalah tabel .
  • objs :Objek database untuk mengatur hak istimewa. Dapat memiliki banyak nilai. Dalam hal ini, objek dipisahkan menggunakan koma.
  • pribadi :Daftar hak istimewa yang dipisahkan koma untuk diberikan atau dicabut. Nilai yang mungkin termasuk:SEMUA , PILIH , PERBARUI , MASUKKAN .

Mari kita lihat cara kerjanya dengan memberikan semua hak istimewa di “publik ” skema ke “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

Salah satu fitur yang sangat kuat dari PostgreSQL adalah dukungannya untuk hampir semua bahasa yang akan digunakan sebagai bahasa prosedural. Modul ekstra ini menambah, menghapus, atau mengubah bahasa prosedural dengan database PostgreSQL.

Parameter wajib tunggal adalah “lang ”; nama bahasa prosedur untuk menambah atau menghapus. Pilihan penting lainnya adalah “db ”; nama database tempat bahasa ditambahkan atau dihapus, dan “kepercayaan ”; pilihan untuk membuat bahasa dipercaya atau tidak dipercaya untuk database yang dipilih.

Mari aktifkan bahasa PL/Python untuk database kita:

- postgresql_lang: db=module_test
                   lang=plpython2u
                   state=present
                   login_host=db.example.com
                   port=5432
                   login_user=postgres

Menggabungkan Semuanya

Sekarang setelah kita mengetahui bagaimana buku pedoman Ansible disusun dan modul PostgreSQL mana yang tersedia untuk kita gunakan, sekarang kita dapat menggabungkan pengetahuan kita dalam buku pedoman Ansible.

Bentuk akhir dari playbook main.yml kami adalah seperti berikut:

---

- 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 }}

Sekarang kita dapat menjalankan playbook kita menggunakan perintah “ansible-playbook”:

[email protected] ~/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

Anda dapat menemukan inventaris dan file playbook di repositori GitHub saya yang dibuat untuk entri blog ini. Ada juga buku pedoman lain yang disebut “remove.yml” yang membatalkan semua yang kita lakukan di buku pedoman utama.

Untuk informasi lebih lanjut tentang Ansible:

  • Lihat dokumen mereka yang ditulis dengan baik.
  • Tonton video memulai cepat yang memungkinkan yang merupakan tutorial yang sangat membantu.
  • Ikuti jadwal webinar mereka, ada beberapa webinar keren yang akan datang dalam daftar.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Mengekstrak Nomor Minggu dari Tanggal di PostgreSQL

  2. Bagaimana cara membandingkan baris saat ini dengan baris berikutnya dan sebelumnya di PostgreSQL?

  3. Aplikasi Boot Musim Semi macet di Hikari-Pool-1 - Memulai...

  4. Berikan hak istimewa untuk database tertentu di PostgreSQL

  5. Cara Mengubah Lokal Saat Memformat Angka di PostgreSQL