Ansible je prostě skvělý a PostgreSQL je určitě úžasný, pojďme se podívat, jak úžasně spolupracují!
====================Oznámení v hlavním vysílacím čase! =====================
PGConf Europe 2015 se letos bude konat 27. až 30. října ve Vídni.
Předpokládám, že se možná zajímáte o správu konfigurace, orchestraci serveru, automatizované nasazení (proto čtete tento příspěvek na blogu, že?) a rádi pracujete s PostgreSQL (určitě) na AWS (volitelně), pak se možná budete chtít připojit k mé přednášce „Správa PostgreSQL pomocí Ansible“ 28. října, 15-15:50.
Podívejte se prosím na úžasný rozvrh a nenechte si ujít šanci zúčastnit se největší evropské události PostgreSQL!
Doufám, že se tam uvidíme, ano, rád piju kávu po rozhovorech 🙂
====================Oznámení v hlavním vysílacím čase! =====================
Co je Ansible a jak funguje?
Motto Ansible je „Jednoduchá, bez agenta a výkonná automatizace IT s otevřeným zdrojovým kódem ” citací z Ansible docs.
Jak je vidět z obrázku níže, domovská stránka Ansible uvádí, že hlavní oblasti použití Ansible jsou:poskytování, správa konfigurace, nasazení aplikací, nepřetržité doručování, zabezpečení a dodržování předpisů, orchestrace. Nabídka přehledu také ukazuje, na které platformy můžeme Ansible integrovat, tj. AWS, Docker, OpenStack, Red Hat, Windows.
Pojďme se podívat na hlavní případy použití Ansible, abychom pochopili, jak funguje a jak je užitečný pro IT prostředí.
Zajišťování
Ansible je váš věrný přítel, když chcete automatizovat vše ve vašem systému. Je to bez agenta a můžete jednoduše spravovat své věci (tj. servery, load balancery, přepínače, firewally) přes SSH. Ať už vaše systémy běžící na bare-metalových nebo cloudových serverech Ansible tu bude a pomůže vám zřídit vaše instance. Jeho idempotentní vlastnosti zajišťují, že budete vždy ve stavu, jaký jste si přáli (a očekávali).
Správa konfigurace
Jednou z nejtěžších věcí je neopakovat se v opakujících se operačních úkolech a zde opět přichází na mysl Ansible jako spasitel. Za starých dobrých časů, kdy byly časy špatné, sysadminové psali mnoho skriptů a připojovali se k mnoha mnoha serverům, aby je použili, a evidentně to nebylo to nejlepší v jejich životě. Jak všichni víme, manuální úkoly jsou náchylné k chybám a vedou k heterogennímu prostředí namísto homogenního a lépe ovladatelného, což rozhodně činí náš život více stresujícím.
S Ansible můžete psát jednoduché playbooky (s pomocí velmi informativní dokumentace a podpory její obrovské komunity) a jakmile napíšete své úkoly, můžete volat širokou škálu modulů (např. AWS, Nagios, PostgreSQL, SSH, APT, File moduly). Výsledkem je, že se můžete soustředit na kreativnější činnosti než na ruční správu konfigurací.
Nasazení aplikace
Když jsou artefakty připraveny, je velmi snadné je nasadit na řadu serverů. Vzhledem k tomu, že Ansible komunikuje přes SSH, není třeba stahovat z úložiště na každém serveru nebo se trápit starodávnými metodami, jako je kopírování souborů přes FTP. Ansible může synchronizovat artefakty a zajistit, aby byly přenášeny pouze nové nebo aktualizované soubory a odstraněny zastaralé soubory. To také urychluje přenos souborů a šetří velkou šířku pásma.
Kromě přenosu souborů pomáhá Ansible také připravit servery na produkční použití. Před přenosem může pozastavit sledování, odebrat servery z nástrojů pro vyrovnávání zatížení a zastavit služby. Po nasazení může spouštět služby, přidávat servery pro vyrovnávání zatížení a obnovovat monitorování.
To vše se nemusí dít na všech serverech najednou. Ansible může pracovat na podmnožině serverů najednou a zajistit nasazení bez výpadků. Například může najednou nasadit 5 serverů najednou a po dokončení je může nasadit na dalších 5 serverů.
Po implementaci tohoto scénáře jej lze spustit kdekoli. Vývojáři nebo členové týmu QA mohou za účelem testování provádět nasazení na svých vlastních počítačích. Aby bylo možné z jakéhokoli důvodu rozmístění vrátit zpět, vše, co Ansible potřebuje, je umístění posledních známých funkčních artefaktů. Poté je může snadno znovu nasadit na produkční servery a uvést systém zpět do stabilního stavu.
Nepřetržité doručování
Nepřetržité dodávání znamená přijetí rychlého a jednoduchého přístupu k vydání. K dosažení tohoto cíle je zásadní používat ty nejlepší nástroje, které umožňují časté uvolňování bez prostojů a vyžadují co nejmenší lidský zásah. Vzhledem k tomu, že jsme se dozvěděli o možnostech nasazení aplikací Ansible výše, je docela snadné provádět nasazení s nulovými prostoji. Dalším požadavkem na nepřetržité dodávky je méně manuálních procesů, což znamená automatizaci. Ansible může automatizovat jakýkoli úkol od poskytování serverů až po konfiguraci služeb, aby byly připraveny na produkci. Po vytvoření a otestování scénářů v Ansible se stává triviálním postavit je před kontinuální integrační systém a nechat Ansible dělat svou práci.
Zabezpečení a dodržování předpisů
Zabezpečení je vždy považováno za nejdůležitější věc, ale zajištění bezpečnosti systémů je jednou z nejtěžších věcí, kterou lze dosáhnout. Musíte si být jisti bezpečností vašich dat i bezpečností dat vašich zákazníků. Abyste si byli jisti zabezpečením svých systémů, definování zabezpečení nestačí, musíte být schopni toto zabezpečení použít a neustále monitorovat své systémy, abyste zajistili, že budou s tímto zabezpečením nadále v souladu.
Ansible se snadno používá, ať už jde o nastavení pravidel brány firewall, zamykání uživatelů a skupin nebo použití vlastních zásad zabezpečení. Svou podstatou je bezpečný, protože můžete opakovaně používat stejnou konfiguraci a provede pouze změny nezbytné k tomu, aby byl systém opět v souladu.
Orchestrování
Ansible zajišťuje, že všechny zadané úkoly jsou ve správném pořadí a vytváří soulad mezi všemi zdroji, které spravuje. Organizace komplexních vícevrstvých nasazení je snazší díky možnosti správy konfigurace a nasazení Ansible. Například, vezmeme-li v úvahu nasazení softwarového balíku, obavy, jako je zajištění připravenosti všech databázových serverů před aktivací aplikačních serverů nebo konfigurace sítě před přidáním serverů do nástroje pro vyrovnávání zatížení, již nejsou komplikovaným problémem.
Ansible také pomáhá orchestraci dalších nástrojů pro orchestraci, jako je Amazon’s CloudFormation, OpenStack’s Heat, Docker’s Swarm atd. Tímto způsobem, místo abyste se učili různé platformy, jazyky a pravidla; uživatelé se mohou soustředit pouze na syntaxi Ansible YAML a výkonné moduly.
Co je modul Ansible?
Moduly nebo knihovny modulů poskytují Ansible prostředky pro řízení nebo správu zdrojů na místních nebo vzdálených serverech. Plní různé funkce. Modul může být například zodpovědný za restartování počítače nebo může jednoduše zobrazit zprávu na obrazovce.
Ansible umožňuje uživatelům psát své vlastní moduly a také poskytuje základní nebo extra moduly připravené k použití.
A co příručky Ansible?
Ansible nám umožňuje organizovat naši práci různými způsoby. V jeho nejpřímější podobě můžeme pracovat s moduly Ansible pomocí „ansible ” nástroj příkazového řádku a soubor inventáře.
Inventář
Jedním z nejdůležitějších konceptů je inventář . Potřebujeme soubor inventáře, abychom Ansible věděli, ke kterým serverům se potřebuje připojit pomocí SSH, jaké informace o připojení vyžaduje a volitelně, které proměnné jsou k těmto serverům přidruženy.
Soubor inventáře je ve formátu podobném INI. V souboru inventáře můžeme určit více než jednoho hostitele a seskupit je do více než jedné skupiny hostitelů.
Náš vzorový soubor inventáře hosts.ini je podobný následujícímu:
[dbservers]
db.example.com
Zde máme jednoho hostitele s názvem „db.example.com“ ve skupině hostitelů s názvem „dbservers“. V souboru inventáře můžeme také zahrnout vlastní porty SSH, uživatelská jména SSH, klíče SSH, informace o proxy, proměnné atd.
Protože máme připravený soubor inventáře, abychom viděli doby provozu našich databázových serverů, můžeme vyvolat Ansibleův „příkaz “ a spusťte „uptime ” na těchto serverech:
ansible dbservers -i hosts.ini -m command -a "uptime"
Zde jsme dali Ansible pokyn, aby načetl hostitele ze souboru hosts.ini, připojil je pomocí SSH, provedl „uptime ” na každém z nich a poté vytiskněte jejich výstup na obrazovku. Tento typ spouštění modulu se nazývá příkaz ad-hoc .
Výstup příkazu bude vypadat takto:
[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
Pokud však naše řešení obsahuje více než jeden krok, je obtížné je spravovat pouze pomocí ad-hoc příkazů.
Zde jsou knihy Ansible. Umožňuje nám to uspořádat naše řešení do souboru playbooku integrací všech kroků pomocí úkolů, proměnných, rolí, šablon, obslužných programů a inventáře.
Pojďme se krátce podívat na některé z těchto termínů, abychom pochopili, jak nám mohou pomoci.
Úkoly
Dalším důležitým pojmem jsou úkoly. Každá úloha Ansible obsahuje název, modul, který má být volán, parametry modulu a volitelně předběžné/následné podmínky. Umožňují nám volat moduly Ansible a předávat informace po sobě jdoucím úkolům.
Proměnné
Existují také proměnné. Jsou velmi užitečné pro opětovné použití informací, které jsme poskytli nebo shromáždili. Můžeme je definovat buď v inventáři, v externích souborech YAML nebo v playbookech.
Příručka
Ansible playbooky jsou napsány pomocí syntaxe YAML. Může obsahovat více než jednu hru. Každá hra obsahuje název hostitelských skupin, ke kterým se lze připojit, a úkoly, které musí provést. Může také obsahovat proměnné/role/handlery, pokud jsou definovány.
Nyní se můžeme podívat na velmi jednoduchou příručku, abychom viděli, jak ji lze strukturovat:
---
- hosts: dbservers
gather_facts: no
vars:
who: World
tasks:
- name: say hello
debug: msg="Hello {{ who }}"
- name: retrieve the uptime
command: uptime
V této velmi jednoduché příručce jsme Ansible řekli, že by měla fungovat na serverech definovaných v hostitelské skupině „dbservers“. Vytvořili jsme proměnnou nazvanou „kdo“ a poté jsme definovali naše úkoly. Všimněte si, že v první úloze, kde jsme vytiskli ladicí zprávu, jsme použili proměnnou „who“ a způsobili, že Ansible vytiskl na obrazovku „Hello World“. Ve druhém úkolu jsme řekli Ansible, aby se připojil ke každému hostiteli a poté tam provedl příkaz „uptime“.
Moduly Ansible PostgreSQL
Ansible poskytuje řadu modulů pro PostgreSQL. Některé z nich jsou umístěny pod základními moduly, zatímco jiné lze nalézt pod doplňkovými moduly.
Všechny moduly PostgreSQL vyžadují, aby byl balíček Python psycopg2 nainstalován na stejném počítači se serverem PostgreSQL. Psycopg2 je databázový adaptér PostgreSQL v programovacím jazyce Python.
Na systémech Debian/Ubuntu lze balíček psycopg2 nainstalovat pomocí následujícího příkazu:
apt-get install python-psycopg2
Nyní tyto moduly podrobně prozkoumáme. Například pro účely budeme pracovat na serveru PostgreSQL na hostiteli db.example.com na portu 5432 s postgres uživatele a prázdné heslo.
postgresql_db
Tento základní modul vytváří nebo odstraňuje danou databázi PostgreSQL. V terminologii Ansible zajišťuje přítomnost nebo nepřítomnost dané PostgreSQL databáze.
Nejdůležitější možností je požadovaný parametr „name “. Představuje název databáze na serveru PostgreSQL. Dalším významným parametrem je „stav “. Vyžaduje jednu ze dvou hodnot:přítomný nebo nepřítomný . To nám umožňuje vytvořit nebo odebrat databázi, která je identifikována hodnotou uvedenou v jménu parametr.
Některé pracovní postupy mohou také vyžadovat specifikaci parametrů připojení, jako je login_host , port , login_user a přihlašovací_heslo .
Vytvořme databázi s názvem „module_test ” na našem serveru PostgreSQL přidáním následujících řádků do našeho souboru playbooku:
- postgresql_db: name=module_test
state=present
login_host=db.example.com
port=5432
login_user=postgres
Zde jsme se připojili k našemu testovacímu databázovému serveru na db.example.com s uživatelem; postgres . Nemusí to však být postgres user jako uživatelské jméno může být cokoliv.
Odebrání databáze je stejně snadné jako její vytvoření:
- postgresql_db: name=module_test
state=absent
login_host=db.example.com
port=5432
login_user=postgres
Všimněte si hodnoty „absent“ v parametru „state“.
postgresql_ext
Je známo, že PostgreSQL má velmi užitečná a výkonná rozšíření. Například nedávné rozšíření je tsm_system_rows což pomáhá načíst přesný počet řádků při vzorkování tabulek. (Pro další informace se můžete podívat na můj předchozí příspěvek o metodách vzorkování tabulek.)
Tento extra modul přidává nebo odstraňuje rozšíření PostgreSQL z databáze. Vyžaduje dva povinné parametry:db a jméno . db parametr odkazuje na název databáze a jméno parametr odkazuje na název rozšíření. Máme také stát parametr, který potřebuje přítomný nebo nepřítomný hodnoty a stejné parametry připojení jako v modulu postgresql_db.
Začněme vytvořením rozšíření, o kterém jsme hovořili:
- postgresql_ext: db=module_test
name=tsm_system_rows
state=present
login_host=db.example.com
port=5432
login_user=postgres
postgresql_user
Tento základní modul umožňuje přidávat nebo odebírat uživatele a role z databáze PostgreSQL.
Je to velmi výkonný modul, protože zajišťuje přítomnost uživatele v databázi a zároveň umožňuje úpravu oprávnění nebo rolí.
Začněme tím, že se podíváme na parametry. Jediným povinným parametrem je zde „name “, který odkazuje na uživatele nebo název role. Stejně jako ve většině modulů Ansible také „stav “ parametr je důležitý. Může mít jeden z přítomných nebo nepřítomný hodnoty a jeho výchozí hodnota je přítomný .
Kromě parametrů připojení jako v předchozích modulech jsou některé další důležité volitelné parametry:
- db :Název databáze, kde budou udělena oprávnění
- heslo :Heslo uživatele
- soukromí :Oprávnění ve formátu „priv1/priv2“ nebo oprávnění tabulky ve formátu „table:priv1,priv2,…“
- role_attr_flags :Atributy role. Možné hodnoty jsou:
- [NE]SUPERUSER
- [NE]CREATEROLE
- [NE]CREATEUSER
- [NE]CREATEDB
- [NE]ZDĚDIT
- [NE]PŘIHLÁŠENÍ
- [NE]REPLIKACE
Chcete-li vytvořit nového uživatele s názvem ada s heslem lovelace a oprávnění pro připojení k databázi module_test , můžeme do naší příručky přidat následující:
- postgresql_user: db=module_test
name=ada
password=lovelace
state=present
priv=CONNECT
login_host=db.example.com
port=5432
login_user=postgres
Nyní, když máme uživatelku připravenou, můžeme jí přidělit nějaké role. Chcete-li povolit „ada“ přihlásit se a vytvářet databáze:
- postgresql_user: name=ada
role_attr_flags=LOGIN,CREATEDB
login_host=db.example.com
port=5432
login_user=postgres
Můžeme také udělit globální nebo tabulková oprávnění, jako je „INSERT “, „AKTUALIZACE “, „VYBRAT “ a „DELETE ” pomocí priv parametr. Jedním důležitým bodem, který je třeba vzít v úvahu, je, že uživatele nelze odebrat, dokud nejsou nejprve odebrána všechna udělená oprávnění.
postgresql_privs
Tento základní modul uděluje nebo odebírá oprávnění k objektům databáze PostgreSQL. Podporované objekty jsou:table , sekvence , funkce , databáze , schéma , jazyk , tabulkový prostor a skupina .
Požadované parametry jsou „databáze“; název databáze, které se má udělit/odebrat oprávnění, a „role“; seznam názvů rolí oddělených čárkami.
Nejdůležitější volitelné parametry jsou:
- typ :Typ objektu pro nastavení oprávnění. Může být jeden z:tabulka, sekvence, funkce, databáze, schéma, jazyk, tabulkový prostor, skupina . Výchozí hodnota je table .
- objs :Databázové objekty pro nastavení oprávnění. Může mít více hodnot. V takovém případě jsou objekty odděleny čárkou.
- soukromí :Čárkami oddělený seznam oprávnění k udělení nebo odebrání. Možné hodnoty zahrnují:ALL , VYBRAT , AKTUALIZOVAT , VLOŽIT .
Podívejme se, jak to funguje udělením všech oprávnění „veřejnosti ” schéma na “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
Jednou z velmi výkonných funkcí PostgreSQL je jeho podpora pro prakticky jakýkoli jazyk, který lze použít jako procedurální jazyk. Tento extra modul přidává, odstraňuje nebo mění procedurální jazyky s databází PostgreSQL.
Jediný povinný parametr je „lang “; název procedurálního jazyka, který se má přidat nebo odebrat. Další důležité možnosti jsou „db “; název databáze, do které je jazyk přidán nebo z níž je odebrán, a „důvěra “; možnost, aby byl jazyk pro vybranou databázi důvěryhodný nebo nedůvěryhodný.
Povolme jazyk PL/Python pro naši databázi:
- postgresql_lang: db=module_test
lang=plpython2u
state=present
login_host=db.example.com
port=5432
login_user=postgres
Dáme vše dohromady
Nyní, když víme, jak je Ansible playbook strukturován a které PostgreSQL moduly máme k dispozici, můžeme nyní spojit naše znalosti v Ansible playbooku.
Konečná podoba našeho playbooku main.yml je následující:
---
- 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 }}
Nyní můžeme spustit náš playbook pomocí příkazu „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
Inventář a soubor playbooku najdete v mém úložišti GitHub vytvořeném pro tento blogový příspěvek. Existuje také další příručka s názvem „remove.yml“, která zruší vše, co jsme udělali v hlavní příručce.
Další informace o Ansible:
- Podívejte se na jejich dobře napsané dokumenty.
- Podívejte se na video rychlého startu Ansible, které je opravdu užitečným návodem.
- Řiďte se plánem jejich webinářů, na seznamu je několik skvělých nadcházejících webinářů.