PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

पोस्टग्रेएसक्यूएल परिनियोजन और रखरखाव के साथ Ansible

Ansible सबसे प्रसिद्ध और व्यापक रूप से उपयोग किए जाने वाले IT ऑटोमेशन टूल में से एक है, यह हमें IT परिचालन कार्यों जैसे...

को स्वचालित करने में मदद करता है।
  • शुरुआत से होस्ट (VM या बेयर-मेटल मशीन) को बूटस्ट्रैप करना
  • होस्ट और सेवाओं को कॉन्फ़िगर करना
  • सॉफ़्टवेयर परिनियोजन और अपग्रेड प्रबंधित करना
  • Ansible के पास सार्वजनिक क्लाउड (AWS, GCP, Azure) पर आपके एप्लिकेशन के लिए EC2 और RDS इंस्टेंस का एक गुच्छा बनाने जैसे क्लाउड इन्फ्रास्ट्रक्चर को व्यवस्थित करने के लिए भी समर्थन है। क्लाउड प्रोविजनिंग के बारे में अधिक जानकारी यहां पाई जा सकती है

चूंकि यह ब्लॉग ज्यादातर Ansible का उपयोग करके PostgreSQL को प्रबंधित करने के बारे में है, हम Ansible उपयोगों के बारे में विस्तार से नहीं जाएंगे, हालाँकि, हम कुछ Ansible बेसिक्स से गुजरेंगे। यदि आप इसके बारे में अधिक जानना चाहते हैं, तो मेरा सुझाव है कि आप Ansible दस्तावेज़ लिंक देखें।

जिम्मेदार मूल बातें

Ansible एक ओपन-सोर्स प्रोजेक्ट है जो अजगर में लिखा गया है जिसका सोर्स कोड GitHub पर उपलब्ध है। चूंकि यह एक पायथन पैकेज है, इसलिए हम पाइप का उपयोग करके आसानी से Ansible इंस्टॉल कर सकते हैं।

Ansible को केवल एक होस्ट पर स्थापित करने की आवश्यकता है जिससे हम Ansible कमांड (Ansible, Ansible-playbook) का उपयोग करके अपने परिचालन कार्यों को व्यवस्थित करेंगे। हम इस ऑर्केस्ट्रेशन को कंट्रोल नोड होस्ट कहते हैं।

परिचालन कार्यों को निष्पादित करने के लिए लक्षित मेजबानों में लॉगिन करने के लिए उत्तरदायी कमांड ओपनएसएसएच पुस्तकालयों का उपयोग करता है, हम इन लक्ष्य मेजबानों को प्रबंधित नोड कहते हैं। प्रबंधित नोड के होस्टनाम या आईपी का उल्लेख एक फ़ाइल में किया जाता है जिसे इन्वेंटरी कहा जाता है, इस इन्वेंट्री फ़ाइल नाम को तब Ansible कमांड के इनपुट के रूप में निर्दिष्ट किया जाता है।

इन्वेंट्री फ़ाइल में, हम एक ही समूह के तहत कई होस्ट सूचीबद्ध कर सकते हैं, इससे अलग-अलग होस्ट के लिए एक ही कार्य को कई बार दोहराने से बचना होगा। इन्वेंट्री फ़ाइल के उपयोग के बारे में अधिक विवरण यहां पाया जा सकता है।

चूंकि Ansible कमांड लॉगिन करने के लिए SSH का उपयोग करता है, सभी होस्ट पर Ansible को स्थापित करने की कोई आवश्यकता नहीं है, इसे केवल कंट्रोल नोड पर स्थापित करने की आवश्यकता है। हालांकि, सभी कंट्रोल नोड और मैनेज्ड नोड में पाइथन और कोई भी आवश्यक पायथन लाइब्रेरी स्थापित होनी चाहिए। Ansible इंस्टालेशन के बारे में अधिक जानकारी यहाँ पाई जा सकती है।

डेमो के लिए, मैं एक लैपटॉप को कंट्रोल नोड के रूप में और अतिथि CentOS-7 VM को प्रबंधित नोड के रूप में उपयोग करूंगा। CentOS-7 VM को प्रदाता VirtualBox पर Vagrant का उपयोग करके प्रावधान किया गया था।

कंट्रोल नोड पर Ansible इंस्टाल करना

हम Ansible को pip का उपयोग करके स्थापित करेंगे जैसा कि Ansible दस्तावेज़ पृष्ठ में संदर्भित है। निम्नलिखित आदेशों को "Ansible" उपयोगकर्ता के रूप में निष्पादित किया गया था।

$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ python get-pip.py --user

--user विकल्प का उपयोग करते हुए, पाइप और Ansible कमांड को HOME निर्देशिका के तहत स्थापित करने के लिए बनाता है और हमें अपने PATH पर्यावरण चर में बिन पथ जोड़ने की आवश्यकता होती है।

$ echo 'export PATH=$HOME/Library/Python/2.7/bin:$PATH' >> ~/.bash_profile
$ source ~/.bash_profile

निम्न पाइप कमांड ने Ansible संस्करण 2.8.0 (जो इस ब्लॉग को लिखते समय नवीनतम स्थिर संस्करण है) स्थापित किया है।

$ pip install --user ansible 
$ which ansible
/Users/Ansible/Library/Python/2.7/bin/Ansible
$ ansible --version
Ansible 2.8.0
...
... 

नियंत्रण नोड और प्रबंधित नोड प्रीचेक

सुनिश्चित करें कि आपके पास नियंत्रण नोड और प्रबंधित नोड के बीच उचित नेटवर्क कनेक्शन है।

किसी भी नियम के लिए अपने फ़ायरवॉल की जाँच करें जो SSH पोर्ट पर इनबाउंड और आउटबाउंड कनेक्शन को ब्लॉक कर सकता है, यदि ऐसा है तो SSH पोर्ट को नियंत्रण और प्रबंधित नोड्स दोनों पर पहुँच प्रदान करने के लिए खोलें।

सबसे पहले, SSH के माध्यम से प्रबंधित नोड से कनेक्ट करने का प्रयास करें। आपको नियंत्रण नोड से प्रबंधित नोड में लॉगिन करने में सक्षम होना चाहिए।

आप अपने संगठन की सुरक्षा नीतियों के अनुसार प्रबंधित नोड्स में पासवर्ड रहित SSH एक्सेस सेट कर सकते हैं। इस डेमो के लिए, मेरे पास उपयोगकर्ता "योनि" के लिए मेरे प्रबंधित नोड "pg01" (CentOS-7) के लिए SSH के लिए पासवर्ड-कम कॉन्फ़िगर किया गया है। इससे प्रबंधित नोड में sudo शक्ति होती है, अधिकांश स्थापना और होस्ट कॉन्फ़िगरेशन कार्यों को "sudo" के साथ "आवारा" उपयोगकर्ता के रूप में निष्पादित किया जाएगा।

नियंत्रण नोड पर, हमारे पास कॉन्फ़िगरेशन फ़ाइल ansible.cfg है जिसका उपयोग Ansible कमांड द्वारा किया जाएगा। नीचे कुछ कॉन्फ़िगरेशन विकल्प दिए गए हैं जिन्हें कॉन्फ़िग फ़ाइल में परिभाषित किया गया है। उपलब्ध अन्य कॉन्फ़िगरेशन विकल्पों के बारे में अधिक जानने के लिए, नमूना कॉन्फ़िगरेशन फ़ाइल देखें।

  • remote_port - यदि प्रबंधित नोड पर SSH सर्वर डिफ़ॉल्ट पोर्ट 22 के अलावा किसी अन्य पोर्ट पर चलता है, तो हम इसे बदल सकते हैं
  • remote_user - लॉगिन उपयोगकर्ता नाम जिसका उपयोग Ansible द्वारा प्रबंधित नोड को जोड़ने के लिए, कार्यों को चलाने के लिए किया जाएगा
  • private_key_file - SSH निजी कुंजी जिसका उपयोग Ansible to login के लिए किया जाएगा

चूंकि उपर्युक्त कॉन्फ़िगरेशन सभी प्रबंधित नोड्स के लिए विश्व स्तर पर लागू होता है, यदि हम किसी विशिष्ट होस्ट या होस्ट समूह के लिए एक अलग कॉन्फ़िगरेशन चाहते हैं तो हम उन्हें इन्वेंट्री फ़ाइल में निर्दिष्ट कर सकते हैं। आप इसका एक उदाहरण नीचे “Development.yaml” इन्वेंट्री फ़ाइल में देख सकते हैं।

एक अनुत्तरदायी ड्राई रन करना

जैसा कि नीचे दिखाया गया है, एक इन्वेंट्री फ़ाइल "Development.yaml" बनाएं।

$ 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"

होस्ट pg01 के ऊपर इन्वेंट्री फ़ाइल में होस्ट समूह postgres_clusters के सदस्यों में से एक है। वेरिएबल ansible_port, ansible_user, और ansible_private_key_file केवल postgres_clusters समूह के अंतर्गत होस्ट पर लागू होते हैं।

अब हम यह देखने के लिए जांच करेंगे कि क्या Ansible प्रबंधित नोड पर कार्यों को चला सकता है। नीचे दिए गए उदाहरण में ansible कमांड प्रबंधित नोड pg01 पर मॉड्यूल पिंग को निष्पादित करता है, यदि Ansible मॉड्यूल पिंग को चलाने में सक्षम था तो आपको SUCCESS को प्रतिक्रिया के रूप में देखना चाहिए।

$ ansible -i development.yaml -m ping pg01
pg01 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

पहले कार्य के रूप में प्रबंधित नोड पर Ansible चलाते समय, यह होस्टनाम, आईपी पता, प्रबंधित नोड की मेमोरी जैसी जानकारी एकत्र करता है। इन्हें जांचने के लिए हम मॉड्यूल सेटअप को कॉल कर सकते हैं जो एक बड़ा JSON लौटाएगा। हम इनमें से किसी का भी अपनी Ansible playbook में उपयोग कर सकते हैं।

$ 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"
        ],

जिम्मेदार भूमिका

Ansible role संबंधित कार्यों और कॉन्फ़िगरेशन सेटिंग्स के एक निश्चित सेट को केवल एक विशेष होस्ट या होस्ट समूह को एक भूमिका सौंपकर एक एकल इकाई में बंडल करने का एक तरीका है। Ansible सभी संबंधित कॉन्फ़िगरेशन और कार्यों को लागू करेगा। यह प्रत्येक भिन्न होस्ट या होस्ट समूह के लिए कार्यों को कई बार दोहराने से बचता है।

प्रत्येक भूमिका को एक निर्देशिका के रूप में दर्शाया जाता है और भूमिका निर्देशिका के भीतर डिफ़ॉल्ट फ़ाइलें, हैंडलर, मेटा, कार्य, टेम्पलेट, परीक्षण, वर्र्स जैसी उपनिर्देशिकाएं होंगी। इन निर्देशिकाओं का उद्देश्य यहां पाया जा सकता है।

उत्तरदायी आदेश, डिफ़ॉल्ट रूप से, 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.

अंसिबल गैलेक्सी

Ansible Galaxy एक ऐसा पोर्टल है जहां समुदाय के लोग अपनी Ansible भूमिकाओं के GitHub रिपॉजिटरी को साझा करते हैं। हम आवश्यक उत्तरदायी भूमिकाओं के लिए आकाशगंगा पोर्टल के माध्यम से ब्राउज़ कर सकते हैं। ansible-galaxy कमांड का उपयोग करके, हम भूमिका को डाउनलोड और पुन:उपयोग कर सकते हैं। किसी भूमिका का उपयोग करने से पहले, निर्देशिका डिफॉल्ट्स, वर्र्स, टास्क, टेम्प्लेट, हैंडलर्स के अंतर्गत सभी Ansible YAML फाइलों को विस्तार से देखें और इस बात से अवगत रहें कि भूमिका कैसे काम करती है।

PostgreSQL के हमारे परिनियोजन के लिए, हम लेखक ANXS और GitHub रेपो द्वारा विकसित "postgresql" भूमिका का उपयोग करेंगे।

उत्तरदायी भूमिका "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

उपरोक्त आदेश निर्देशिका "/Users/ansible/.Ansible/roles" के तहत भूमिका निर्देशिका "anxs.postgresql" स्थापित करता है, यह DEFAULT_ROLES_PATH में निर्देशिकाओं में से एक है और ansible कमांड किसी भी भूमिका के लिए इस निर्देशिका को खोजेगा।

उत्तरदायी प्लेबुक

Ansible Playbook एक YAML फ़ाइल है जिसमें हम उन कार्यों या भूमिकाओं को सूचीबद्ध करेंगे जिन्हें किसी विशेष होस्ट या होस्ट समूह पर निष्पादित किया जाना है। आप प्लेबुक विकसित करने के बारे में अधिक पढ़ सकते हैं और साथ ही मेजबान, कार्य, भूमिकाएं, संस्करण जैसे टैग की परिभाषा यहां सीख सकते हैं।

डिफ़ॉल्ट रूप से, सभी कार्यों को उत्तरदायी उपयोगकर्ता के रूप में निष्पादित किया जाता है जिसने लॉग इन किया है। एक अलग उपयोगकर्ता (या 'रूट' विशेषाधिकार के साथ) विशेष कार्यों को निष्पादित करने के लिए हम बन का उपयोग कर सकते हैं। इस आदेश का उपयोग कैसे करें यहां पाया जा सकता है।

नीचे दी गई प्लेबुक (postgres-play.yaml) में, मैंने मेजबान समूह "postgres_clusters" के तहत "anxs.postgresql" की भूमिका सूचीबद्ध की है, इसलिए समूह के तहत सभी मेजबानों के लिए anxs.postgresql की भूमिका में सभी कार्यों को निष्पादित किया जाएगा। "postgres_clusters"।

$ cat postgres-play.yaml 
---
- hosts: postgres_clusters
  become: yes
  roles: 
    - role: anxs.postgresql

बनें:हाँ में YAML परिभाषित करता है कि इस भूमिका को 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.

हम इस प्लेबुक को "योनि" उपयोगकर्ता के रूप में चलाएंगे और उपयोगकर्ता को पहले से ही सुडो पावर के साथ प्रावधान किया गया था।

[[email protected] ~]$ sudo cat /etc/sudoers.d/vagrant
%vagrant ALL=(ALL) NOPASSWD: ALL
डेटाबेस प्रबंधन के लिए डिवाइप्स मार्गदर्शिका जानें कि आपको अपने ओपन सोर्स डेटाबेस को स्वचालित और प्रबंधित करने के लिए क्या जानना आवश्यक है मुफ्त में डाउनलोड करें

Ansible का उपयोग करके PostgreSQL परिनियोजित करना

अब हम प्लेबुक 'postgres-play.yaml' चलाएंगे जो सभी PostgreSQL संबंधित पैकेजों को स्थापित करेगा और इसे डिफ़ॉल्ट सेटिंग्स का उपयोग करके कॉन्फ़िगर करेगा।

इस उदाहरण के लिए, Ansible, पोर्ट 5432 पर PostgreSQL 9.6 स्थापित करेगा, पोस्टग्रेज max_connections को 100 पर सेट करेगा। सभी डिफ़ॉल्ट सेटिंग्स /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

प्लेबुक चलाना

$ 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 

एक बार जब Ansible ने सभी कार्यों को निष्पादित कर लिया है, तो PLAY RECAP के तहत कार्य निष्पादन का सारांश दिखाया जाएगा।

  • ठीक है=21, बिना किसी बदलाव के 21 कार्य निष्पादित किए गए।
  • बदला हुआ=14, 14 कार्यों ने मेजबान में परिवर्तन किए हैं, जैसे पोस्टग्रेज स्थापित करना, निर्देशिकाएं, फाइलें बनाना, पोस्टग्रेज शुरू करना।
  • छोड़ दिया गया =32, 32 कार्यों को छोड़ दिया गया है, हो सकता है कि कुछ सुविधा सक्षम न होने के कारण। चूंकि हम ENTOS पर इंस्टॉल कर रहे हैं, उबंटू से संबंधित कार्यों को छोड़ दिया गया था।

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)

हमने अब डिफ़ॉल्ट कॉन्फ़िगरेशन का उपयोग करके प्रबंधित होस्ट "pg01" पर PostgreSQL स्थापित किया है।

PostgreSQL कॉन्फ़िगरेशन बदलना

अब हम अपनी कस्टम सेटिंग्स का उपयोग करके PostgreSQL इंस्टेंस को फिर से कॉन्फ़िगर करेंगे।

मैंने custom.yaml फ़ाइल बनाई है (जैसा कि नीचे दिखाया गया है) जिसमें PostgreSQL सेटिंग्स को संशोधित करने के लिए परिभाषित चरों की सूची है जैसे सुनो_एड्रेस, मैक्स_कनेक्शन, वाल_लेवल, हॉट_स्टैंडबाय, स्टेटमेंट_टाइमआउट, लॉग_चेकपॉइंट, लॉग_लॉक_वेट्स, लॉग_डेस्टिनेशन, लॉग_मिन_ड्यूरेशन_स्टेटमेंट।

$ 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

इस custom.yaml का उपयोग करने के लिए अब हम अपनी playbook postgres-play.yaml को बदल देंगे।

$ cat postgres-play.yaml  
---
- hosts: postgres_clusters
  become: yes
  vars_files:
    - ./custom.yaml
  roles: 
    - role: anxs.postgresql

Vars_files टैग का उपयोग करते हुए, मैंने कस्टम कॉन्फ़िगरेशन फ़ाइल custom.yaml निर्दिष्ट किया है, जो anxs.postgresql भूमिका में निर्दिष्ट डिफ़ॉल्ट कॉन्फ़िगरेशन को ओवरराइड करेगा। परिवर्तनशील वरीयता पर अधिक विवरण यहां पाया जा सकता है।

अब हम उसी ansible-playbook कमांड को फिर से चला सकते हैं जिसे हमने पहले निष्पादित किया था, लेकिन यह PostgreSQL को स्थापित करने, कॉन्फ़िगर करने, उपयोगकर्ता और डेटाबेस बनाने जैसे सभी कार्यों को निष्पादित करेगा। इसके लिए हमें Ansible को केवल --tags विकल्प का उपयोग करके PostgreSQL कॉन्फ़िगरेशन से संबंधित कार्यों को निष्पादित करने के लिए प्रतिबंधित करना चाहिए।

समर्थित टैग की सूची जानने के लिए, हम --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]

उपरोक्त टैग से हम केवल postgresql-configure टैग निर्दिष्ट करेंगे ताकि 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

जैसा कि आप PLAY RECAP में देखते हैं, केवल 2 परिवर्तन प्रबंधित नोड pg01 में प्रचारित हुए हैं। पहला कॉन्फ़िगरेशन को अपडेट कर रहा है और दूसरा कॉन्फ़िगरेशन को पुनः लोड कर रहा है।

सत्यापित करें कि कॉन्फ़िगरेशन परिवर्तन प्रबंधित नोड पर प्रभावी हो गए हैं।

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)

जैसा कि आप देख सकते हैं, कुछ कॉन्फ़िगरेशन बदल जाते हैं जैसे सुनो_एड्रेस, मैक्स_कनेक्शन, वाल_लेवल, हॉट_स्टैंडबाय अभी तक प्रभावी नहीं हुए हैं। इन कॉन्फ़िगरेशन परिवर्तनों के लिए एक PostgreSQL पुनरारंभ की आवश्यकता होती है और भूमिका anxs.postgresql ने केवल सेवा को ही पुनः लोड किया है।

उत्पादन के घंटों के दौरान PostgreSQL के अचानक पुनरारंभ होने से बचने के लिए, मूल लेखक ने भूमिका में पुनरारंभ कार्य को नहीं जोड़ा हो सकता है। हम निर्धारित डाउनटाइम के दौरान, मैन्युअल रूप से postgresql सेवा को पुनरारंभ कर सकते हैं।

[[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)

PostgreSQL उपयोगकर्ता और डेटाबेस बनाना

अब हम उपयोगकर्ता "app1" और "app2" और डेटाबेस "app1_db" और "app2_db" क्रमशः "app1" और "app2" उपयोगकर्ताओं के स्वामित्व में बनाएंगे।

मैंने custom.yaml में दो नए चर, postgresql_users और postgresql_database जोड़े हैं, जिसमें उन उपयोगकर्ताओं और डेटाबेस की सूची है जिन्हें बनाने की आवश्यकता है। भूमिका anxs.postgresql उपयोगकर्ता और डेटाबेस बनाने के लिए Ansible मॉड्यूल postgresql_users और postgresql_db का उपयोग करता है। चर जोड़ने के लिए आप इन दस्तावेज़ों का संदर्भ ले सकते हैं।

$ 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 

अब हम केवल टैग पोस्टग्रेस्क्ल-यूज़र और पोस्टग्रेस्क्ल-डेटाबेस से जुड़े कार्यों को चलाएंगे।

$ 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

सत्यापित करें कि उपयोगकर्ता और डेटाबेस प्रबंधित होस्ट पर बनाए गए हैं।

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)

बाहरी होस्ट को PostgreSQL सर्वर से कनेक्ट करने की अनुमति देना

अब हम बाहरी होस्ट को postgresql_pg_hba_custom को custom.yaml में जोड़कर PostgreSQL सेवा को जोड़ने की अनुमति देंगे।

$ cat custom.yaml
...
...
postgresql_pg_hba_custom:
  - {type: "host", database: "all", user: "all", address: "0.0.0.0/0", method: "md5" }

कॉन्फ़िगरेशन लागू करने के लिए पोस्टग्रेस्क्ल-कॉन्फ़िगर के साथ टैग किए गए कार्यों को चलाना।

$ ansible-playbook -i development.yaml postgres-play.yaml --tags postgresql-configure

सत्यापित करना कि क्या मैं अपने नियंत्रण नोड से PostgreSQL सर्वर से कनेक्ट करने में सक्षम हूं।

$ PGPASSWORD=password psql -h pg01 -U app1 -d app1_db -c 'Select true'
 bool
------
 
(1 row)

निष्कर्ष

यह ब्लॉग आपको पोस्टग्रेएसक्यूएल के परिनियोजन और प्रबंधन के लिए Ansible का उपयोग करने के लिए आवश्यक मूलभूत जानकारी प्रदान करेगा। हालाँकि, हमने केवल कुछ PostgreSQL प्रशासन कार्यों को कवर किया है। आपके संगठन के बुनियादी ढांचे के आधार पर, आपको कई डिफ़ॉल्ट कॉन्फ़िगरेशन को ओवरराइड करने और Ansible भूमिका में और भी अधिक कार्य जोड़ने की आवश्यकता हो सकती है।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या अपडेट/डिलीट को अक्षम करने का कोई तरीका है लेकिन फिर भी ट्रिगर्स को उन्हें निष्पादित करने की अनुमति है?

  2. Postgresql में अंतर्राष्ट्रीयकृत नियमित अभिव्यक्ति

  3. क्या पोस्टग्रेज में डेटाबेस लेनदेन में संग्रहीत कार्यविधियाँ चलती हैं?

  4. किसी दिए गए स्कीमा में कोई तालिका मौजूद है या नहीं, इसकी जांच कैसे करें?

  5. मेरा पसंदीदा पोस्टग्रेएसक्यूएल एक्सटेंशन - भाग एक