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 който е наистина полезен урок.
- Следвайте техния график за уебинари, в списъка има някои страхотни предстоящи уебинари.