Puppet je software s otevřeným zdrojovým kódem pro správu konfigurace a nasazení. Byla založena v roce 2005, je multiplatformní a má dokonce svůj vlastní deklarativní jazyk pro konfiguraci.
Úlohy související se správou a údržbou PostgreSQL (nebo jiného softwaru) sestává z každodenních, opakujících se procesů, které vyžadují monitorování. To platí i pro ty úlohy provozované skripty nebo příkazy prostřednictvím plánovacího nástroje. Složitost těchto úloh se exponenciálně zvyšuje, jsou-li prováděny na rozsáhlé infrastruktuře, nicméně použití Puppet pro tento druh úloh může často vyřešit tyto typy velkých problémů, protože Puppet centralizuje a automatizuje výkon těchto operací velmi agilním způsobem.
Puppet funguje v rámci architektury na úrovni klient/server, kde se provádí konfigurace; tyto operace jsou poté rozptýleny a spuštěny na všech klientech (známých také jako uzly).
Uzel agentů obvykle běží každých 30 minut a shromáždí sadu informací (typ procesoru, architektura, IP adresa atd..), které se také nazývají fakta, a poté informace odešle master, který čeká na odpověď, aby zjistil, zda je možné použít nějaké nové konfigurace.
Tyto skutečnosti umožní masteru přizpůsobit stejnou konfiguraci pro každý uzel.
Velmi zjednodušeně je Puppet jedním z nejdůležitějších nástrojů DevOps k dispozici dnes. V tomto blogu se podíváme na následující...
- Případ použití pro Puppet &PostgreSQL
- Instalace loutky
- Konfigurace a programování loutky
- Konfigurace Puppet pro PostgreSQL
Instalace a nastavení Puppet (verze 5.3.10) popsané níže byly provedeny na sadě hostitelů používajících CentOS 7.0 jako operační systém.
Případ použití pro Puppet &PostgreSQL
Předpokládejme, že je problém ve vašem firewallu na počítačích, které hostí všechny vaše PostgreSQL servery, pak by bylo nutné odmítnout všechna odchozí připojení k PostgreSQL a provést to co nejdříve.
Puppet je pro tuto situaci perfektní nástroj, zejména proto, že rychlost a efektivita nezbytný. O tomto příkladu uvedeném v sekci „Konfigurace Puppet pro PostgreSQL“ budeme hovořit pomocí správy parametru listen_addresses.
Instalace loutky
Existuje soubor běžných kroků, které je třeba provést na hlavním hostiteli nebo hostiteli agenta:
Krok jedna
Aktualizace souboru /etc/hosts s názvy hostitelů a jejich IP adresou
192.168.1.85 agent agent.severalnines.com
192.168.1.87 master master.severalnines.com puppet
Krok dva
Přidání repozitářů Puppet do systému
$ sudo rpm –Uvh https://yum.puppetlabs.com/puppet5/el/7/x86_64/puppet5-release-5.0.0-1-el7.noarch.rpm
Pro jiné operační systémy nebo verze CentOS lze nejvhodnější úložiště nalézt v Puppet, Inc. Yum Repositories.
Krok tři
Konfigurace serveru NTP (Network Time Protocol)
$ sudo yum -y install chrony
Krok čtyři
Chrony se používá k synchronizaci systémových hodin z různých NTP serverů, a tak udržuje čas synchronizovaný mezi hlavním a agentním serverem.
Po instalaci chrony musí být povolena a restartována:
$ sudo systemctl enable chronyd.service
$ sudo systemctl restart chronyd.service
Krok 5
Zakázat parametr SELinux
V souboru /etc/sysconfig/selinux musí být parametr SELINUX (Security-Enhanced Linux) deaktivován, aby neomezoval přístup na obou hostitelích.
SELINUX=disabled
Krok šest
Před instalací loutky (buď master nebo agent) musí být firewall v těchto hostitelích odpovídajícím způsobem definován:
$ sudo firewall-cmd -–add-service=ntp -–permanent
$ sudo firewall-cmd –-reload
Instalace Mistra loutek
Jakmile je do systému přidáno úložiště balíčků puppet5-release-5.0.0-1-el7.noarch.rpm, lze instalaci puppetserveru provést:
$ sudo yum install -y puppetserver
Parametr max. přidělení paměti je důležité nastavení pro aktualizaci souboru /etc/sysconfig/puppetserver na 2 GB (nebo na 1 GB, pokud se služba nespustí):
JAVA_ARGS="-Xms2g –Xmx2g "
V konfiguračním souboru /etc/puppetlabs/puppet/puppet.conf je nutné přidat následující parametrizaci:
[master]
dns_alt_names=master.severalnines.com,puppet
[main]
certname = master.severalnines.com
server = master.severalnines.com
environment = production
runinterval = 1h
Služba puppetserver používá port 8140 k naslouchání požadavkům uzlu, proto je nutné zajistit, aby byl tento port povolen:
$ sudo firewall-cmd --add-port=8140/tcp --permanent
$ sudo firewall-cmd --reload
Po provedení všech nastavení v loutkovém mistrovi je čas spustit tuto službu:
$ sudo systemctl start puppetserver
$ sudo systemctl enable puppetserver
Instalace Puppet Agent
Agent Puppet v úložišti balíčků puppet5-release-5.0.0-1-el7.noarch.rpm je také přidán do systému, instalaci puppet-agenta lze provést ihned:
$ sudo yum install -y puppet-agent
Konfigurační soubor puppet-agent /etc/puppetlabs/puppet/puppet.conf je také potřeba aktualizovat přidáním následujícího parametru:
[main]
certname = agent.severalnines.com
server = master.severalnines.com
environment = production
runinterval = 1h
Další krok spočívá v registraci uzlu agenta na hlavním hostiteli provedením následujícího příkazu:
$ sudo /opt/puppetlabs/bin/puppet resource service puppet ensure=running enable=true
service { ‘puppet’:
ensure => ‘running’,
enable => ‘true’
}
V tuto chvíli na hlavním hostiteli čeká na žádost loutkového agenta o podepsání certifikátu:
To musí být podepsáno provedením jednoho z následujících příkazů:
$ sudo /opt/puppetlabs/bin/puppet cert sign agent.severalnines.com
nebo
$ sudo /opt/puppetlabs/bin/puppet cert sign --all
Konečně (a jakmile loutkář podepíše certifikát) je čas použít konfigurace na agenta získáním katalogu od loutkáře:
$ sudo /opt/puppetlabs/bin/puppet agent --test
Parametr --test v tomto příkazu neznamená test, nastavení získaná z hlavního serveru se použije na místního agenta. Aby bylo možné otestovat/zkontrolovat konfigurace z hlavního serveru, musí být proveden následující příkaz:
$ sudo /opt/puppetlabs/bin/puppet agent --noop
Konfigurace a programování loutky
Puppet používá deklarativní programovací přístup, jehož účelem je specifikovat, co dělat, a nezáleží na způsobu, jak toho dosáhnout!
Nejzákladnější částí kódu na Puppet je zdroj, který specifikuje vlastnost systému, jako je příkaz, služba, soubor, adresář, uživatel nebo balíček.
Níže je uvedena syntaxe zdroje pro vytvoření uživatele:
user { 'admin_postgresql':
ensure => present,
uid => '1000',
gid => '1000',
home => '/home/admin/postresql'
}
K předchozí třídě (také známé jako manifest) souboru s příponou „pp“ (to znamená Puppet Program) lze připojit různé zdroje, nicméně několik manifestů a dat (jako jsou fakta, soubory a šablony) vytvoří modul. Všechny logické hierarchie a pravidla jsou znázorněny v níže uvedeném diagramu:
Účelem každého modulu je obsahovat všechny potřebné manifesty pro spuštění jednoho úkoly modulárním způsobem. Na druhou stranu koncept třídy není stejný jako v objektově orientovaných programovacích jazycích, v Puppet funguje jako agregátor zdrojů.
Uspořádání těchto souborů má specifickou strukturu adresářů, kterou je třeba dodržovat:
Ve kterých je účel každé složky následující:
Složka | Popis |
manifesty | Kód loutky |
soubory | Statické soubory ke zkopírování do uzlů |
šablony | Soubory šablon ke zkopírování do spravovaných uzlů (lze je upravit pomocí proměnných) |
příklady | Manifest ukázat, jak modul používat |
class dev_accounts {
$rootgroup = $osfamily ? {
'Debian' => 'sudo',
'RedHat' => 'wheel',
default => warning('This distribution is not supported by the Accounts module'),
}
include accounts::groups
user { 'username':
ensure => present,
home => '/home/admin/postresql',
shell => '/bin/bash',
managehome => true,
gid => 'admin_db',
groups => "$rootgroup",
password => '$1$7URTNNqb$65ca6wPFDvixURc/MMg7O1'
}
}
V další části vám ukážeme, jak vygenerovat obsah složky s příklady a také příkazy pro testování a publikování jednotlivých modulů.
Konfigurace Puppet pro PostgreSQL
Než představíme několik příkladů konfigurace pro nasazení a údržbu databáze PostgreSQL, je nutné nainstalovat loutkový modul PostgreSQL (na hostitelský server), abyste mohli využívat všechny jejich funkce:
$ sudo /opt/puppetlabs/bin/puppet module install puppetlabs-postgresql
V současné době jsou ve veřejném úložišti modulů Puppet Forge k dispozici tisíce modulů připravených k použití na Puppet.
Krok jedna
Nakonfigurujte a nasaďte novou instanci PostgreSQL. Zde je veškeré potřebné programování a konfigurace pro instalaci nové instance PostgreSQL do všech uzlů.
Prvním krokem je vytvoření nového adresáře se strukturou modulu, jak bylo dříve sdíleno:
$ cd /etc/puppetlabs/code/environments/production/modules
$ mkdir db_postgresql_admin
$ cd db_postgresql_admin; mkdir{examples,files,manifests,templates}
Potom musíte do souboru manifestu manifests/init.pp zahrnout třídu postgresql::server poskytovanou nainstalovaným modulem:
class db_postgresql_admin{
include postgresql::server
}
Chcete-li zkontrolovat syntaxi manifestu, je vhodné provést následující příkaz:
$ sudo /opt/puppetlabs/bin/puppet parser validate init.pp
Pokud není vráceno nic, znamená to, že syntaxe je správná
Abyste si ukázali, jak používat tento modul v ukázkové složce, je nutné vytvořit nový soubor manifestu init.pp s následujícím obsahem:
include db_postgresql_admin
Ukázkové umístění v modulu musí být otestováno a aplikováno na hlavní katalog:
$ sudo /opt/puppetlabs/bin/puppet apply --modulepath=/etc/puppetlabs/code/environments/production/modules --noop init.pp
Nakonec je nutné definovat, ke kterému modulu má každý uzel přístup v souboru „/etc/puppetlabs/code/environments/production/manifests/site.pp“ :
node ’agent.severalnines.com’,’agent2.severalnines.com’{
include db_postgresql_admin
}
Nebo výchozí konfigurace pro všechny uzly:
node default {
include db_postgresql_admin
}
Uly obvykle každých 30 minut kontrolují hlavní katalog, nicméně tento dotaz lze vynutit na straně uzlu následujícím příkazem:
$ /opt/puppetlabs/bin/puppet agent -t
Nebo pokud je účelem simulovat rozdíly mezi hlavní konfigurací a aktuálním nastavením uzlu, lze použít parametr nopp (bez operace):
$ /opt/puppetlabs/bin/puppet agent -t --noop
Krok dva
Aktualizujte instanci PostgreSQL, aby naslouchala všem rozhraním. Předchozí instalace definuje nastavení instance ve velmi restriktivním režimu:povoluje pouze připojení na localhost, což mohou potvrdit hostitelé přidružení k portu 5432 (definováno pro PostgreSQL):
$ sudo netstat -ntlp|grep 5432
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 3237/postgres
tcp6 0 0 ::1:5432 :::* LISTEN 3237/postgres
Aby bylo možné poslouchat celé rozhraní, je nutné mít v souboru /etc/puppetlabs/code/environments/production/modules/db_postgresql_admin/manifests/init.pp následující obsah
class db_postgresql_admin{
class{‘postgresql:server’:
listen_addresses=>’*’ #listening all interfaces
}
}
Ve výše uvedeném příkladu je deklarována třída postgresql::server a nastavení parametru listen_addresses na „*“, což znamená všechna rozhraní.
Nyní je port 5432 spojen se všemi rozhraními, lze jej potvrdit pomocí následující IP adresy/portu:„0.0.0.0:5432“
$ sudo netstat -ntlp|grep 5432
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN 1232/postgres
tcp6 0 0 :::5432 :::* LISTEN 1232/postgres
Chcete-li vrátit výchozí nastavení:povolte databázová připojení pouze z localhost, parametr listen_addresses musí být nastaven na „localhost“ nebo v případě potřeby zadat seznam hostitelů:
listen_addresses = 'agent2.severalnines.com,agent3.severalnines.com,localhost'
Chcete-li načíst novou konfiguraci z hlavního hostitele, stačí si ji vyžádat v uzlu:
$ /opt/puppetlabs/bin/puppet agent -t
Krok tři
Vytvořte databázi PostgreSQL. Instanci PostgreSQL lze vytvořit s novou databází a také s novým uživatelem (s heslem) pro použití této databáze a pravidlem pro soubor pg_hab.conf, které povolí připojení k databázi pro tohoto nového uživatele:
class db_postgresql_admin{
class{‘postgresql:server’:
listen_addresses=>’*’ #listening all interfaces
}
postgresql::server::db{‘nines_blog_db’:
user => ‘severalnines’, password=> postgresql_password(‘severalnines’,’passwd12’)
}
postgresql::server::pg_hba_rule{‘Authentication for severalnines’:
Description =>’Open access to severalnines’,
type => ‘local’,
database => ‘nines_blog_db’,
user => ‘severalnines’,
address => ‘127.0.0.1/32’
auth_method => ‘md5’
}
}
Tento poslední zdroj má název „Autentizace pro několik devítek“ a soubor pg_hba.conf bude mít ještě jedno další pravidlo:
# Rule Name: Authentication for severalnines
# Description: Open access for severalnines
# Order: 150
local nines_blog_db severalnines 127.0.0.1/32 md5
Chcete-li načíst novou konfiguraci z hlavního hostitele, stačí si ji vyžádat v uzlu:
$ /opt/puppetlabs/bin/puppet agent -t
Krok čtyři
Vytvořte uživatele pouze pro čtení. Chcete-li vytvořit nového uživatele s oprávněními pouze pro čtení, je třeba do předchozího manifestu přidat následující zdroje:
postgresql::server::role{‘Creation of a new role nines_reader’:
createdb => false,
createrole => false,
superuser => false, password_hash=> postgresql_password(‘nines_reader’,’passwd13’)
}
postgresql::server::pg_hba_rule{‘Authentication for nines_reader’:
description =>’Open access to nines_reader’,
type => ‘host’,
database => ‘nines_blog_db’,
user => ‘nines_reader’,
address => ‘192.168.1.10/32’,
auth_method => ‘md5’
}
Chcete-li načíst novou konfiguraci z hlavního hostitele, stačí si ji vyžádat v uzlu:
$ /opt/puppetlabs/bin/puppet agent -t
Závěr
V tomto příspěvku na blogu jsme vám ukázali základní kroky k nasazení a zahájení konfigurace databáze PostgreSQL automatickým a přizpůsobeným způsobem na několika uzlech (což mohou být dokonce virtuální počítače).
Tyto typy automatizace vám mohou pomoci stát se efektivnějšími, než když to děláte ručně, a konfiguraci PostgreSQL lze snadno provést pomocí několika tříd dostupných v úložišti puppetforge