PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Ansible обича PostgreSQL

Ansible е просто страхотен, а PostgreSQL със сигурност е страхотен, нека видим как работят невероятно заедно!

=====================Съобщение в праймтайм! =====================

PGConf Europe 2015 ще се проведе на 27-30 октомври във Виена тази година.

Предполагам, че вероятно се интересувате от управление на конфигурация, оркестрация на сървъри, автоматично внедряване (затова четете тази публикация в блога, нали?) и обичате да работите с PostgreSQL (със сигурност) на AWS (по избор), тогава може да искате да се присъедините към моята беседа „Управление на PostgreSQL с Ansible“ на 28 октомври, 15-15:50.

Моля, проверете невероятния график и не пропускайте шанса да присъствате на най-голямото PostgreSQL събитие в Европа!

Надявам се да се видим там, да, обичам да пия кафе след разговори 🙂

=====================Съобщение в праймтайм! =====================

Какво е Ansible и как работи?

Мотото на Ansible е „спроста, безагентна и мощна ИТ автоматизация с отворен код ” чрез цитат от Ansible docs.

Както може да се види от фигурата по-долу, началната страница на Ansible посочва, че основните области на използване на Ansible са:осигуряване, управление на конфигурацията, внедряване на приложения, непрекъсната доставка, сигурност и съответствие, оркестрация. Обзорното меню също така показва на кои платформи можем да интегрираме Ansible, т.е. AWS, Docker, OpenStack, Red Hat, Windows.

Нека проверим основните случаи на използване на Ansible, за да разберем как работи и колко е полезен за ИТ среди.

Осигуряване

Ansible е вашият верен приятел, когато искате да автоматизирате всичко във вашата система. Той е без агент и можете просто да управлявате вашите неща (т.е. сървъри, балансьори на натоварване, комутатори, защитни стени) чрез SSH. Независимо дали вашите системи, работещи на голи или облачни сървъри, Ansible ще бъде там и ще ви помогне да осигурите вашите инстанции. Неговите идемпотентни характеристики гарантират, че винаги ще бъдете в състоянието, което желаете (и очаквате).

Управление на конфигурацията

Едно от най-трудните неща е да не се повтаряте в повтарящи се оперативни задачи и тук Ansible отново идва на ум като спасител. В добрите стари времена, когато времената бяха лоши, системните администратори пишеха много много скриптове и се свързваха с много много сървъри, за да ги прилагат и очевидно това не беше най-доброто нещо в живота им. Както всички знаем, ръчните задачи са податливи на грешки и водят до хетерогенна среда вместо хомогенна и по-управляема и определено правят живота ни по-стресиращ.

С Ansible можете да пишете прости учебници (с помощта на много информативна документация и подкрепата на неговата огромна общност) и след като напишете задачите си, можете да извикате широк набор от модули (т.е. AWS, Nagios, PostgreSQL, SSH, APT, File модули). В резултат на това можете да се съсредоточите върху повече творчески дейности, отколкото да управлявате конфигурации ръчно.

Внедряване на приложение

След като артефактите са готови, е супер лесно да ги разположите на редица сървъри. Тъй като Ansible комуникира през SSH, няма нужда да изтегляте от хранилище на всеки сървър или да се занимавате с древни методи като копиране на файлове през FTP. Ansible може да синхронизира артефакти и да гарантира, че се прехвърлят само нови или актуализирани файлове и се премахват остарели файлове. Това също така ускорява прехвърлянето на файлове и спестява много честотна лента.

Освен прехвърляне на файлове, Ansible помага и за подготовката на сървърите за производствена употреба. Преди прехвърляне може да постави на пауза наблюдението, да премахне сървърите от балансиращите устройства и да спре услугите. След внедряването може да стартира услуги, да добавя сървъри към балансиращите устройства и да възобнови наблюдението.

Всичко това не трябва да се случва наведнъж за всички сървъри. Ansible може да работи върху подмножество от сървъри в даден момент, за да осигури внедряване с нулев престой. Например наведнъж може да разположи 5 сървъра наведнъж и след това може да се разположи на следващите 5 сървъра, когато приключат.

След прилагането на този сценарий, той може да бъде изпълнен навсякъде. Разработчиците или членовете на QA екипа могат да извършват внедряване на собствените си машини с цел тестване. Освен това, за да се върне обратно разгръщане по някаква причина, всички нужди на Ansible са местоположението на последните известни работещи артефакти. След това може лесно да ги преразположи на производствени сървъри, за да върне системата в стабилно състояние.

Непрекъсната доставка

Непрекъснатото доставяне означава възприемане на бърз и прост подход за издания. За постигането на тази цел е от решаващо значение да се използват най-добрите инструменти, които позволяват чести пускания без прекъсвания и изискват възможно най-малко човешка намеса. Тъй като научихме за възможностите за внедряване на приложения на Ansible по-горе, е доста лесно да се извършват внедрявания с нулев престой. Другото изискване за непрекъсната доставка е по-малко ръчни процеси и това означава автоматизация. Ansible може да автоматизира всяка задача от осигуряване на сървъри до конфигуриране на услуги, за да станат готови за производство. След създаване и тестване на сценарии в Ansible, става тривиално да ги поставите пред непрекъсната система за интеграция и да оставите Ansible да си свърши работата.

Сигурност и съответствие

Сигурността винаги се смята за най-важното нещо, но поддържането на сигурността на системите е едно от най-трудните неща за постигане. Трябва да сте сигурни в сигурността на вашите данни, както и в сигурността на данните на вашите клиенти. За да сте сигурни в сигурността на системите си, дефинирането на сигурност не е достатъчно, трябва да можете да прилагате тази защита и постоянно да наблюдавате системите си, за да гарантирате, че остават съвместими с тази сигурност.

Ansible е лесен за използване, независимо дали става въпрос за настройка на правила за защитна стена, заключване на потребители и групи или прилагане на персонализирани политики за сигурност. Безопасно е по своето естество, тъй като можете да прилагате многократно една и съща конфигурация и ще направи само необходимите промени, за да върне системата обратно в съответствие.

Оркестрация

Ansible гарантира, че всички дадени задачи са в правилния ред и установява хармония между всички ресурси, които управлява. Оркестрирането на сложни многостепенни разгръщания е по-лесно с възможностите за управление на конфигурацията и внедряване на Ansible. Например, като се има предвид внедряването на софтуерен стек, опасенията като това да се уверите, че всички сървъри на база данни са готови, преди да активирате сървърите на приложения или да конфигурирате мрежата, преди да добавите сървъри към балансиращото натоварване, вече не са сложни проблеми.

Ansible също така помага за оркестрирането на други инструменти за оркестрация като Amazon's CloudFormation, OpenStack's Heat, Docker's Swarm и т.н. По този начин, вместо да изучавате различни платформи, езици и правила; потребителите могат да се концентрират само върху YAML синтаксиса на Ansible и мощните модули.

Какво е Ansible модул?

Модулите или библиотеките на модули предоставят средства на Ansible за контрол или управление на ресурси на локални или отдалечени сървъри. Те изпълняват различни функции. Например модул може да е отговорен за рестартирането на машина или може просто да изведе съобщение на екрана.

Ansible позволява на потребителите да пишат свои собствени модули и също така предоставя готови основни или допълнителни модули.

Какво ще кажете за Ansible playbooks?

Ansible ни позволява да организираме работата си по различни начини. В най-директната му форма можем да работим с модулите Ansible, използвайки „ansible ” инструмент за команден ред и инвентарния файл.

Рекламни наличности

Една от най-важните концепции е инвентара . Нуждаем се от файл с инвентаризация, за да позволи на Ansible да знае кои сървъри трябва да се свърже чрез SSH, каква информация за връзка изисква и по избор кои променливи са свързани с тези сървъри.

Инвентарният файл е във формат, подобен на INI. Във файла с инвентара можем да посочим повече от един хостове и да ги групираме в повече от една хост групи.

Нашият примерен файл за инвентаризация hosts.ini е като следния:

[dbservers]
db.example.com

Тук имаме един хост, наречен “db.example.com” в хост група, наречена “dbservers”. Във файла с инвентара можем също да включим персонализирани SSH портове, SSH потребителски имена, SSH ключове, прокси информация, променливи и т.н.

Тъй като имаме готов файл за инвентаризация, за да видим времето за работа на нашите сървъри на база данни, можем да извикаме „командата на Ansible ” модул и изпълнете „време на работа ” на тези сървъри:

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

Тук инструктирахме Ansible да чете хостове от файла hosts.ini, да ги свърже чрез SSH, да изпълни „uptime ” за всеки от тях и след това отпечатайте изхода им на екрана. Този тип изпълнение на модула се нарича ad-hoc команда .

Изходът на командата ще бъде като:

[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

Въпреки това, ако нашето решение съдържа повече от една стъпка, става трудно да ги управлявате само чрез използване на ad-hoc команди.

Тук идват Ansible playbooks. Позволява ни да организираме нашето решение във файл с книга с игри, като интегрираме всички стъпки чрез задачи, променливи, роли, шаблони, манипулатори и инвентар.

Нека да разгледаме накратко някои от тези термини, за да разберем как могат да ни помогнат.

Задачи

Друго важно понятие са задачите. Всяка задача Ansible съдържа име, модул, който трябва да бъде извикан, параметри на модула и по избор пред/след условия. Те ни позволяват да извикваме Ansible модули и да предаваме информация на последователни задачи.

Променливи

Има и променливи. Те са много полезни за повторно използване на информация, която предоставихме или събрахме. Можем да ги дефинираме в инвентара, във външни YAML файлове или в учебници.

Наръчник

Ansible playbooks са написани с помощта на синтаксиса на YAML. Може да съдържа повече от една пиеса. Всяка игра съдържа имена на хост групи, към които да се свържете, и задачи, които трябва да изпълни. Може също да съдържа променливи/роли/обработващи, ако е дефинирано.

Сега можем да разгледаме една много проста игра, за да видим как може да бъде структурирана:

---

- hosts: dbservers
  gather_facts: no

  vars:
    who: World

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

  - name: retrieve the uptime
    command: uptime

В тази много проста игра ние казахме на Ansible, че трябва да работи на сървъри, дефинирани в хост групата „dbservers“. Създадохме променлива, наречена „кой“ и след това дефинирахме нашите задачи. Забележете, че в първата задача, при която разпечатваме съобщение за отстраняване на грешки, използвахме променливата „who“ и накарахме Ansible да отпечата „Hello World“ на екрана. Във втората задача казахме на Ansible да се свърже с всеки хост и след това да изпълни командата „uptime“ там.

Ansible PostgreSQL модули

Ansible предоставя редица модули за PostgreSQL. Някои от тях се намират под основни модули, докато други могат да бъдат намерени под допълнителни модули.

Всички модули на PostgreSQL изискват пакетът Python psycopg2 да бъде инсталиран на една и съща машина с PostgreSQL сървър. Psycopg2 е адаптер на база данни PostgreSQL на език за програмиране Python.

В системите Debian/Ubuntu пакетът psycopg2 може да бъде инсталиран с помощта на следната команда:

apt-get install python-psycopg2

Сега ще разгледаме подробно тези модули. Например за целите, ние ще работим върху PostgreSQL сървър на хост db.example.com на порт 5432 с postgres потребител и празна парола.

postgresql_db

Този основен модул създава или премахва дадена PostgreSQL база данни. В терминологията на Ansible, той гарантира, че дадена PostgreSQL база данни присъства или отсъства.

Най-важната опция е задължителният параметър „name “. Представлява името на базата данни в PostgreSQL сървър. Друг важен параметър е „state “. Изисква една от двете стойности:prisent или отсъства . Това ни позволява да създадем или премахнем база данни, която се идентифицира чрез стойността, дадена в name параметър.

Някои работни потоци може също да изискват спецификация на параметри на връзката като login_host , порт , login_user и парола_за вход .

Нека създадем база данни, наречена „module_test ” на нашия PostgreSQL сървър, като добавите по-долу редове към нашия файл с плейбук:

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

Тук се свързахме с нашия тестов сървър на база данни на db.example.com с потребителя; постгрес . Не е задължително обаче това да е postgres потребител като потребителското име може да бъде всичко.

Премахването на базата данни е толкова лесно, колкото създаването й:

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

Обърнете внимание на стойността „отсъства“ в параметъра „състояние“.

postgresql_ext

Известно е, че PostgreSQL има много полезни и мощни разширения. Например, скорошно разширение е tsm_system_rows което помага за извличане на точния брой редове при таблично извадка. (За повече информация можете да проверите предишната ми публикация относно методите за вземане на проби от таблици.)

Този модул за екстри добавя или премахва разширения на PostgreSQL от база данни. Изисква два задължителни параметъра:db и име . db параметърът се отнася до името на базата данни и име параметър се отнася до името на разширението. Имаме и държава параметър, който трябва присъства или отсъства стойности и същите параметри на връзката като в модула postgresql_db.

Нека започнем със създаването на разширението, за което говорихме:

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

postgresql_user

Този основен модул позволява добавяне или премахване на потребители и роли от PostgreSQL база данни.

Това е много мощен модул, защото, като гарантира присъствието на потребител в базата данни, той също така позволява едновременно промяна на привилегии или роли.

Нека започнем с разглеждане на параметрите. Единственият задължителен параметър тук е „name “, което се отнася до потребител или име на роля. Също така, както в повечето модули на Ansible, „state ” параметърът е важен. Може да има едно от настоящите или отсъства стойности и неговата стойност по подразбиране е присъства .

В допълнение към параметрите за свързване, както в предишните модули, някои от други важни допълнителни параметри са:

  • db :Име на базата данни, където ще бъдат предоставени разрешения
  • парола :Парола на потребителя
  • priv :Привилегии в „priv1/priv2“ или привилегии на таблица във формат „table:priv1,priv2,…“
  • role_attr_flags :Ролеви атрибути. Възможните стойности са:
    • [НЕ]СУПЕРПОЛЗВАТЕЛ
    • [НЕ]CREATEROLE
    • [НЕ]CREATEUSER
    • [НЕ]CREATEDB
    • [НЕ]НАСЛЕДЯВАНЕ
    • [НЕ]ВХОД
    • [НЕ]РЕПЛИКАЦИЯ

За да създадете нов потребител, наречен ada с парола lovelace и привилегия за свързване към базата данни module_test , можем да добавим следното към нашата книга:

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

Сега, когато имаме готов потребител, можем да й възложим някои роли. За да позволите на „ada“ да влиза и да създава бази данни:

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

Можем също да предоставим глобални или базирани на таблица привилегии като „INSERT “, „АКТУАЛИЗИРАНЕ “, „ИЗБЕРЕТЕ “, и „ИЗТРИВАНЕ ” с помощта на priv параметър. Един важен момент, който трябва да се има предвид, е, че потребителят не може да бъде премахнат, докато първо не бъдат отменени всички предоставени привилегии.

postgresql_privs

Този основен модул предоставя или отменя привилегии върху обекти на база данни PostgreSQL. Поддържаните обекти са:таблица , последователност , функция , база данни , схема , език , пространство за таблици , и група .

Задължителните параметри са “база данни”; име на базата данни за предоставяне/отмяна на привилегии и “роли”; разделен със запетая списък с имена на роли.

Най-важните незадължителни параметри са:

  • тип :Тип на обекта за задаване на привилегии. Може да бъде едно от:таблица, последователност, функция, база данни, схема, език, пространство за таблици, група . Стойността по подразбиране е таблица .
  • objs :Обекти в базата данни за задаване на привилегии. Може да има множество стойности. В този случай обектите се разделят със запетая.
  • privs :разделен със запетая списък с привилегии за предоставяне или отмяна. Възможните стойности включват:ВСИЧКИ , ИЗБЕРЕТЕ , АКТУАЛИЗИРАНЕ , INSERT .

Нека видим как работи това, като предоставим всички привилегии на „public ” схема към „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

Една от много мощните характеристики на PostgreSQL е неговата поддръжка за практически всеки език, който да се използва като процедурен език. Този модул за екстри добавя, премахва или променя процедурни езици с база данни PostgreSQL.

Единственият задължителен параметър е „lang ”; име на процедурния език за добавяне или премахване. Други важни опции са „db ”; име на базата данни, към която езикът се добавя или премахва, и „доверие ”; опция, за да направите езика доверен или ненадежден за избраната база данни.

Нека активираме езика PL/Python за нашата база данни:

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

Обединяване на всичко

Сега, когато знаем как е структурирана Ansible playbook и кои PostgreSQL модули са налични за използване, сега можем да комбинираме знанията си в Ansible playbook.

Окончателната форма на нашия playbook main.yml е следната:

---

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

Сега можем да стартираме нашата игра с помощта на командата “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

Можете да намерите инвентара и файла с плейбук в моето хранилище на GitHub, създадено за тази публикация в блога. Има и друга игра, наречена „remove.yml“, която отменя всичко, което направихме в основната книга.

За повече информация относно Ansible:

  • Разгледайте техните добре написани документи.
  • Гледайте видеоклип за бърз старт на 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. Как да конфигурирате AppArmor за PostgreSQL и TimescaleDB

  2. PostgreSQL изтрива цялото съдържание

  3. django test app error - Получих грешка при създаването на тестовата база данни:разрешението е отказано за създаване на база данни

  4. Създайте база данни на Postgres с помощта на python

  5. Има ли начин да деактивирате претоварването на функциите в Postgres