GNU/Linux >> Znalost Linux >  >> Linux

Jak vytvořit Ansible Playbook

Před několika týdny jsem začal používat Ansible ke zjednodušení administrativních úkolů pro více organizací, které podporuji. Kromě toho jsem chtěl především zjednodušit správu vlastní flotily osmi nebo devíti hostitelů (přesný počet se často mění). Od té doby, co jsem začal používat Linux, dělám veškerou svou automatizaci pomocí skriptů Bash. Skripty jsem použil k automatizaci distribuce dalších skriptů pro automatizaci aktualizací, systémových a uživatelských konfiguračních souborů, upgradů na novější verze Fedory a aktualizací na nová vydání Fedory. A to nezahrnuje všechny ty drobné ad-hoc úkoly, které se objevují na hodinovém základě.

Skripty budou i nadále hrát zásadní roli v mé administrativní automatizaci. Ansible však vypadá, že dokáže převzít mnoho úkolů a dělat je mnohem lépe než dokonce složité skripty. Je to všechno o příručce a v tomto článku vytvořím takový, který dokáže provést aktualizaci systému a zároveň zohlednit systémové rozdíly.

Nedávno jsem psal o mém prvním dni používání Ansible. Pokud jste tento článek nečetli, možná to budete chtít udělat, než budete pokračovat v tomto. Tento článek předpokládá, že máte velmi základní znalosti s používáním Ansible. Pokud jste četli můj článek na výše uvedeném odkazu, měli byste být schopni bez problémů sledovat tento text.

Tento článek je rozdělen do dvou částí, takže si nezapomeňte přečíst druhou polovinu. V této části definujeme některé důležité koncepty a termíny Ansible, prodiskutujeme komentáře a implementujeme první hru z příručky. Druhá část pokračuje dvěma zbývajícími hrami, některými doplňujícími informacemi a mým seznamem zdrojů.

Příručka tohoto článku nevyžaduje instalaci žádných modulů nebo kolekcí Ansible kromě výchozích vestavěných. Tato příručka byla testována s Ansible 2.9.14.

[ Čtenářům se také líbilo: Přidejte repo a nainstalujte balíček způsobem Ansible ]

Co je to příručka?

Když jsem psal tento článek, sledoval jsem také některé relace letošního virtuálního AnsibleFestu. Jak jsem se díval, vytvořil jsem si vlastní popis herní knihy – takový, který mi dává smysl. Tento popis obsahuje úryvky moudrosti z příručky od několika přednášejících a také některé knihy a blogové příspěvky, které jsem četl.

Zde je moje definice:

Ansible playbook je člověkem vytvořený popis požadovaného stavu jednoho nebo více počítačů. Ansible čte příručku, porovnává skutečný stav počítačů se stavem uvedeným v příručce a provádí úkoly potřebné k tomu, aby tyto počítače odpovídaly stavu popsanému v příručce.

Aktualizace

Instalace aktualizací na moderní hostitele Linuxu je téměř neustálý úkol, který je důležitý kvůli množství oprav zabezpečení a vylepšení funkcí, které neustále přicházejí. Pokud je aktualizován určitý software, jako je jádro, glibc nebo systemd, je také nutné restartovat hostitele. Je také potřeba provést některé další úkoly, jako je aktualizace databáze manuálových stránek.

Přestože mám automatické instalace aktualizací pomocí skvělého skriptu, s některými mými hostiteli je třeba zacházet trochu jinak než s ostatními. Například nechci současně aktualizovat firewall a e-mailový/webový/DHCP/DNS server. Pokud se server restartuje, firewall nemůže získat informace, které potřebuje, aby mohl pokračovat se svými vlastními aktualizacemi, a ani ostatní hostitelé v mé síti nemohou. Pokud dojde k výpadku firewallu, ztratí se můj server a všichni ostatní interní hostitelé přístup k externím úložištím Fedory. To znamená počkat, až se tito dva hostitelé restartují, než budou moci začít aktualizace na ostatních hostitelích.

Takže jsem tyto aktualizace prováděl tak, že jsem spouštěl skripty na bráně firewall a pak jsem čekal na dokončení, pak jsem se přesunul na server a čekal na dokončení, než jsem spustil malý program příkazového řádku, který aktualizační skript postupně spustil. zbytek mých hostitelů. Mohl jsem tyto závislosti zapsat do svých skriptů, ale prvních pár dní s Ansible mi ukázalo, že už má tyto schopnosti a mnoho dalších, díky kterým by byl můj úkol mnohem jednodušší. Opravdu – MNOHEM jednodušší. A celkově rychlejší, bez mého zásahu.

Strategie Ansible

Ansible používá strategii hub pro správu hostitelů. Software Ansible je nainstalován na hostiteli, který funguje jako kontrolér. Software Ansible na straně klienta neexistuje, takže žádný není třeba instalovat na vzdálené hostitele.

Ansible používá pro komunikaci se vzdálenými hostiteli SSH, který je již nainstalován téměř v každé distribuci Linuxu. Přestože se správci systému mohou rozhodnout používat hesla pro vzdálený přístup k hostitelům, to jistě snižuje efektivitu a nepraktickou povahu nástroje, jako je Ansible. Stejně jako většina ostatních správců tedy používám páry veřejných a soukromých klíčů (PPKP), které jsou považovány za bezpečnější než hesla a umožňují automatizaci úloh pro jeden až tisíce vzdálených hostitelů bez zásahu správce.

Ansible posílá příkazy vzdáleným hostitelům přes SSH a používá výsledky k určení úspěšnosti příkazu. Tyto výsledky může také použít k určení dalšího postupu pomocí podmíněného kdy prohlášení.

Definování požadavků

Stejně jako jakýkoli program, ať už napsaný v C, Pythonu, Bash nebo jakémkoli jiném jazyce, vždy začínám souborem požadavků. Četl jste mou knihu The Linux Philosophy for SysAdmins, že? To platí také pro nástroje jako Ansible. Potřebuji definovat, kam jdu, abych mohl identifikovat, kdy jsem dorazil.

Toto jsou požadavky na můj Ansible playbook:

Play 1:Ansible controller

  1. Nejprve nainstalujte aktualizace do ovládacího uzlu Ansible.
  2. Aktualizujte databázi manuálových stránek.
  3. V případě potřeby vypněte. To je pro můj řídicí uzel jiné než pro ostatní hostitele kvůli podivné základní desce, která neprovádí správný restart.
  4. Po restartu se přihlaste a znovu spusťte příručku. Protože je řídicí uzel již v požadovaném stavu, nebudou provedeny žádné další akce a začne Play 2.

Hra 2:Servery

  1. Instalujte aktualizace na brány firewall a servery v sérii, tj. jednu po druhé.
  2. Aktualizujte databázi manuálových stránek.
  3. V případě potřeby restartujte.
  4. Počkejte, až se restartuje první hostitel, je-li to nutné, a teprve poté začněte na dalším.

Play 3:Workstations

  1. Nezačínejte aktualizovat pracovní stanice, dokud nebudou dokončeny servery.
  2. Instalujte aktualizace na každý počítač běžící současně paralelně.
  3. Aktualizujte databázi manuálových stránek.
  4. V případě potřeby restartujte.

Ano, vím, že existují i ​​jiné způsoby, jak toho dosáhnout. Naposledy jsem přemýšlel o použití ovladače Ansible, abych nemusel řešit restartování příručky po restartu ovladače. Ale způsob, jakým to dělám, je nejprve provést aktualizace na své primární pracovní stanici – což je také můj řídicí uzel Ansible – a poté provést nějaké testování před aktualizací zbytku systémů, takže tato strategie na to funguje perfektně. Vaše potřeby se budou pravděpodobně lišit od mých, takže byste měli použít jakoukoli metodu, která vám nejlépe vyhovuje. Na Ansible je to, že je dostatečně flexibilní, aby vyhovoval různým potřebám.

Nyní, když mám požadavky na úkol, mohu začít s příručkou.

Syntaxe

Ansible playbooky musí odpovídat standardní syntaxi a formátování YAML. Nejčastější chyby, se kterými jsem se setkal, jsou mé vlastní chyby ve formátování. Obvykle je to proto, že jsem použil nebo nepoužil úvodní pomlčky podle potřeby nebo jsem použil nesprávné odsazení.

Názvy her začínají v prvním sloupci příručky a každý následující úkol je odsazen přesně dvěma mezerami . Přesně dvě mezery odsazují každou akci v úkolu a dílčí úkoly jsou dále odsazeny přesně dvěma mezerami. Jakýkoli jiný počet mezer nebo použití jakýchkoli mezer jiných než mezer, jako jsou tabulátory, způsobí chybu běhu. Chybu také generuje nadbytečné bílé místo na konci řádku.

Uděláte chyby ve formátování a rychle se naučíte vidět problémy. Existují některé nástroje, které nám mohou pomoci při hledání těchto chyb před pokusem o spuštění playbooků, a mohou z dlouhodobého hlediska ušetřit spoustu času.

Spuštění příručky

Začněme tedy sešitem, který tyto úkoly provede v požadovaném pořadí. Příručky jsou jednoduše sbírkou úkolů které definují požadovaný stav hostitele. Název hostitele nebo skupina inventáře je uvedena na začátku příručky a definuje hostitele, na kterých Ansible spustí příručku.

Náš playbook bude obsahovat tři hraní pro zpracování každého typu hostitele, který jsem identifikoval v prohlášení o požadavcích. Každá hra bude mít trochu jinou logiku, ale výsledkem bude stejný výsledek – jeden nebo více hostitelů se všemi nainstalovanými aktualizacemi.

Moje příručka se jmenuje doUpdates.yml a nachází se v /root/ansible/Updates adresář, který jsem pro tento projekt vytvořil. Program Bash nainstalovaný hrami v této příručce se nachází v /root/ansible/Updates/files adresář.

Pojďme prozkoumat tuto příručku jednu sekci po druhé.

Definovat jako soubor YAML

Celý svůj kód začínám dobře strukturovanými komentáři, aby v budoucnu existoval název souboru a krátký popis této příručky pro mě nebo jiného správce systému. Příručky mohou obsahovat komentáře, i když jsem viděl několik článků nebo knih, které to zmiňují.

Jako správce systému, který věří v dokumentaci všeho, zjišťuji, že komentáře mohou být velmi užitečné. Nejde ani tak o to říkat v komentářích totéž jako v názvu úkolu, ale jde o to identifikovat účel skupin úkolů a zajistit, abych zaznamenal své důvody, proč dělám určité věci určitým způsobem nebo objednat. To může později pomoci s laděním problémů, kdy bych mohl zapomenout na své původní myšlení. Stejně jako v Bash začínají komentáře # .

Primární funkcí této první části jsou tři pomlčky (--- ), které se používají k definování tohoto jako souboru YAML. Symbol yml přípona v názvu souboru znamená YAML. Viděl jsem pro to několik významů, ale moje sázka je na „Ještě další značkovací jazyk“, přestože jsem viděl některá tvrzení, že YAML není jeden.

########################################################################
#                             doUpdates.yml
#------------------------------------------------------------------
# This playbook installs all available RPM updates on the inventory hosts.
#
#    
#------------------------------------------------------------------
#
# Change History              
# Date        Name         Version   Description
# 2020/10/01  David Both   00.00     Started new code
# 2020/10/10  David Both   01.00     First release code finished
# 2020/10/18  David Both   01.01     Minor changes to sequence and
#                                    fix a couple minor problems.
#
########################################################################
---

První hra

Tato další část definuje první hru v playbooku. Příručky mohou mít jedno nebo více přehrání a naše má tři:jednu pro řídicího hostitele, na kterém běží Ansible, jednu pro dva servery v mé síti a jednu pro ostatní pracovní stanice. Dále definuji první hru – koneckonců je to příručka.

Všimněte si, že hra začíná ve sloupci nula a poté je ve hře přísné odsazení zbývajících řádků. Žádné prohlášení nedefinuje začátek hry. Ansible používá pevnou strukturu YAML k určení, kde každá hra a úkol začíná.

########################################################################
#######################################################################
# Play 1 - Do updates for host david
########################################################################
########################################################################
- name: Play 1 - Install updates on david - the Ansible controler
  hosts: david
  remote_user: root
  vars:
    run: false
    reboot: false

Často se budeme setkávat s různými klíčovými slovy, takže zde jsou některá vysvětlení, která bych si přál mít, když jsem začal pracovat s Ansible.

jméno :Tento řádek představuje název přehrávání a název přehrávání se zobrazuje v datovém toku STDOUT. Díky tomu lze snadno identifikovat každou spuštěnou hru a sledovat, jak později přesměrovaný stream sleduji nebo sleduji. Klíčové slovo je vyžadováno pro každou hru a úkol, ale textový obsah je volitelný.

hostitelé :Toto definuje názvy hostitelů, na kterých bude přehrávání spuštěno. Může obsahovat mezerami oddělený seznam názvů hostitelů nebo název skupiny hostitelů. Skupina hostitelů a názvy všech uvedených hostitelů se musí objevit v souboru inventáře. Ve výchozím nastavení je to /etc/ansible/hosts ale může to být jiný soubor, pokud použijete -i (--inventory ) možnost určit alternativní soubor.

remote_user :Tento řádek není požadavkem, ale specifikuje uživatele, kterého bude Ansible na vzdáleném hostiteli chovat. Pokud je uživatel na vzdáleném hostiteli stejný jako uživatel na místním hostiteli, tento řádek není potřeba. Ve výchozím nastavení používá Ansible stejné uživatelské ID na vzdáleném hostiteli jako uživatel, který spouští Ansible playbook. Používám to zde pouze pro informační účely. Většinu playbooků spouštím jako root na localhost, takže se Ansible přihlásí ke vzdálenému hostiteli jako root.

vars :Tuto sekci lze použít k definování jedné nebo více proměnných, které lze použít jako v jakémkoli programovacím jazyce. V tomto případě je používám v podmíněných příkazech „kdy“ později v příručce k řízení cesty provádění.

Rozsah proměnných je omezen na sekci, ve které jsou definovány. V tomto případě jsou definovány ve hře 1, takže jsou omezeny na tuto hru. Pokud je budu chtít použít v pozdějších hrách, budu je muset znovu nastavit v každé hře, ve které jsou vyžadovány. Pokud je v úkolu nastavena proměnná, pak jsou dostupné pouze v rámci tohoto úkolu a ne ve zbytku hry.

Hodnoty proměnných lze přepsat na příkazovém řádku pomocí -e (--extra_variables ) možnost zadat jinou hodnotu. Uvidíme, až bude čas spustit playbook.

Úkoly

Toto je začátek sekce úkolů pro Play 1. úkol :klíčové slovo je odsazeno přesně dvěma mezerami. Každý úkol musí mít název prohlášení, i když pro jméno není žádný text. Text usnadňuje sledování logiky playbooku a zobrazuje se na obrazovce během provádění, aby mi pomohl sledovat pokrok v reálném čase.

tasks:
########################################################################
# Do some preliminary checking 
########################################################################
    - name: Install the latest version of the doUpdates script
      copy:
        src: /root/ansible/Updates/files/doUpdates
        dest: /usr/local/bin
        mode: 0774
        owner: root
        group: root



    - name: Check for currently available updates
      command: doUpdates -c
      register: check
    - debug: var=check.stdout_lines

Tato první část obsahuje tři úkoly. První úloha zkopíruje program Bash, který jsem napsal, do cílového hostitele. Druhý spustí právě nainstalovaný program a přiřadí – zaregistruje – datový tok STDOUT z doUpdates program do proměnné "check." Třetí úloha vytiskne všechny řádky STDOUT v kontrolní proměnné na obrazovku.

Podívejme se na nová klíčová slova trochu podrobněji:

kopírovat :Klíčové slovo copy definuje začátek stanzy, která může zkopírovat jeden nebo více souborů ze zadaného zdrojového umístění (src ) do zadaného cílového umístění (cíl ). Klíčová slova v této části definují různé aspekty operace kopírování a konečný stav zkopírovaného souboru.

src :Toto je plně kvalifikovaná cesta a název souboru, který se má zkopírovat. V tomto případě zkopíruji pouze jeden soubor, ale je snadné zkopírovat všechny soubory v adresáři nebo pouze ty, které odpovídají vzoru souboru glob. Zdrojový soubor je obvykle uložen v umístění v adresářovém stromu Ansible hub. V tomto případě se plně kvalifikovaná cesta k mému zdrojovému souboru nachází v /root/ansible/Updates/files/doUpdates .

cíl :Toto je cílová cesta na cílovém hostiteli (hostitelích), do kterého bude zdrojový soubor zkopírován.

režimu :Klíčové slovo mode definuje režim souboru, který bude použit na zkopírovaný soubor. Bez ohledu na souborový režim zdrojového souboru Ansible nastaví režim souboru na režim uvedený v tomto prohlášení. Například rwxr_xr__ nebo 0754 . Při použití osmičkového formátu nezapomeňte použít všechny čtyři bajty.

vlastník :Toto je účet vlastníka, který bude použit pro soubor.

skupina :Toto je skupinový účet, který bude použit pro soubor.

příkaz :S tímto klíčovým slovem lze použít jakýkoli příkaz shellu Linux, skript prostředí nebo program příkazového řádku spolu s volbami a argumenty. Použil jsem program Bash, který byl právě nainstalován, abych získal některé informace, které nelze snadno získat pomocí vestavěných modulů Ansible, jako je dnf .

zaregistrovat se :Toto klíčové slovo nastaví STDOUT z výše uvedeného příkazu do proměnné s názvem "check." kdy: klíčové slovo se může dotazovat na obsah této proměnné. Poté se používá jako podmínka k určení, zda bude proveden úkol, jehož je součástí. To uvidíme v další sekci.

ladit :Vytiskne obsah zadané proměnné na obrazovku. Často to používám jako nástroj pro ladění. Považuji to za užitečné při ladění. Nápověda, nápověda.

Nyní něco málo o mých aktualizacích Program Bash.

Původně jsem tento program Bash napsal, abych skutečně provedl aktualizace, které jsem nyní začal dělat s Ansible. Obsahuje nějaký kód, který určuje, zda jsou dostupné aktualizace. Určuje také, zda bylo aktualizováno jádro, systemd nebo glibc, přičemž každý z nich by měl vyžadovat restart, aby se plně projevil. Můj program vysílá několik řádků do STDOUT, které mohu použít v Ansible jako podmínku pro rozhodnutí, zda restartovat cílového hostitele. Používám to v této další části, která provádí skutečné aktualizace, a ta následující provádí vypnutí mé primární pracovní stanice. Podobný kód provede restart na všech ostatních hostitelích, jak uvidíte.

STDOUT z tohoto programu se používá s -c Tato možnost vypadá takto, když jsou dostupné aktualizace, ale není vyžadován restart. Mohu použít regulární výraz k vyhledání klíčových řetězců v libovolném textu v tomto datovém proudu, který lze použít v kdy :podmíněné k určení, zda je provedena konkrétní úloha.

TASK [debug] ******************************************************************************************************************************************
ok: [wally1] => {
    "check.stdout_lines": [
        "########## 48 updates ARE available for host wally1.both.org. ##########",
        "########## Including: ##########",
        "Last metadata expiration check: 1:47:12 ago on Tue 20 Oct 2020 01:50:07 PM EDT.",
        "Updates Information Summary: available",
        "    3 Security notice(s)",
        "        2 Moderate Security notice(s)",
        "    3 Bugfix notice(s)",
        "    2 Enhancement notice(s)",
        "    2 other notice(s)",
        "########## A reboot will NOT be required after these updates are installed. ##########",
        "Program terminated normally"
    ]
}

Tato další část bezprostředně výše provede skutečné aktualizace, pokud jsou splněny všechny podmínky v kdy :tvrzení jsou pravdivá. Tato sekce používá vestavěný Ansible dnf správce balíčků.

########################################################################
# Do the updates.
########################################################################
# Install all available updates
    - name: Install all current updates
      dnf:
        name: "*"
        state: latest
      when: (check.stdout | regex_search('updates ARE available')) and run == "true"

dnf :Volá vestavěný modul Ansible, který je propojen se správcem balíčků DNF. Přestože je ve svých možnostech trochu omezený, může instalovat, odstraňovat a aktualizovat balíčky. Jedním z omezení modulu DNF je, že nemá check-update funkce. Proto nadále používám svůj program Bash k objevování seznamu balíčků, které mají být aktualizovány, a na základě toho určuji, zda je třeba provést restart (nebo vypnutí). Ansible má také vestavěné YUM a APT.

jméno :Poskytuje název balíku, se kterým se má pracovat. V tomto případě je to znak glob souboru * označuje všechny nainstalované balíčky.

stát :Hodnota "latest" pro toto klíčové slovo znamená, že všechny nainstalované balíčky mají být aktualizovány na nejnovější verzi. Některé z dalších možností stavu jsou "přítomný", což znamená, že balíček je nainstalován, ale nemusí nutně mít nejnovější verzi, a "nepřítomný", což znamená, že pokud je nainstalován, balíček se odstraní.

kdy :Tato podmíněná fráze určuje podmínky, které musí být splněny, aby se tato úloha spustila. V tomto případě se aktualizace nainstalují pouze v případě, že řetězec textu definovaný v regulárním výrazu je přítomen v proměnné "check", která byla dříve zaregistrována, a proměnná "run" je nastavena na "true."

Nyní, když byly aktualizace provedeny, možná budu muset restartovat, takže uvidíme, jak se s tím vypořádám. Další úkol to udělá za nás.

Za prvé, mám trochu dokumentace prostřednictvím komentářů, které popisují, že jsem kvůli potenciálnímu problému s hardwarem u tohoto hostitele spíše vypnul než restartoval. Toto je dokonalý příklad toho, proč bychom měli do našeho kódu a příruček zahrnout komentáře, protože vysvětlují, proč je tato konkrétní hra potřebná a proč se liší od ostatních. Je to také skvělý příklad toho, jak mohu s jedním hostitelem zacházet jinak než s ostatními.

########################################################################
# Now poweroff host david because of MB problems that won't let it
# do a reboot without manual intervention. Need to see if I
# can figure out this problem and fix it but it is a hardware issue
# and this is just a temporary circumvention. 
########################################################################
    - name: Poweroff this host if necessary and reboot extra variable is true
      command: poweroff
      when: (check.stdout | regex_search('reboot will be required')) and reboot == "true" and run == "true"

V tomto úkolu posílám poweroff namísto preferované akce restartování počítače. Dělám to z důvodu uvedeného v komentářích:Protože základní deska na mé primární pracovní stanici – což je také můj rozbočovač Ansible – se správně nerestartuje. To je pravděpodobně způsobeno nesprávnou konfigurací z mé strany, spíše než jakýmkoliv typem poruchy. Zatím jsem nezjistil důvod, protože jsem zjistil, že čas, který jsem již strávil hledáním a prováděním změn konfigurace systému BIOS, překročil můj limit tolerance a potřebuji dokončit práci. Občas na tom pracuji trochu víc, ale už to nestojí za ten čas navíc.

Spouštění playbooku se po tomto vypnutí zastaví (nebo se restartuje, pokud se vaše zařízení rozbočovače Ansible restartuje správně), takže jej musím restartovat poté, co se konečně znovu spustí. Tentokrát, protože aktualizace byly nainstalovány, k vypnutí ani restartu nedojde a spustí se další přehrávání.

A tím končí první hra.

[ Potřebujete více o Ansible? Absolvujte bezplatný kurz technického přehledu od společnosti Red Hat. Ansible Essentials:Jednoduchost v technickém přehledu automatizace. ] 

Koneckonců

Probrali jsme zde mnoho informací a doufám, že vám podrobné vysvětlení klíčových slov a úkolů pomohlo. Je také jasné, jaký je můj názor na komentáře:Jsou kritické. Play 1 rozjíždí náš Ansible playbook.

Ve druhé části tohoto článku uzavřeme příručku dvěma dalšími hrami pro správu firewallu a serverů a poté zbytku hostitelů v síti. Poskytnu také některé následné podrobnosti a koncepty.


Linux
  1. Jak nainstalovat softwarové balíčky pomocí Ansible playbooku

  2. Jak vytvořit uživatele Linuxu pomocí Ansible

  3. jak vytvořit Ansible playbook pro získání verzí OS vzdálených hostitelů?

  1. Jak vytvořit soubor v Ansible

  2. Ansible Playbook:Jak vytvářet a konfigurovat Playbooky

  3. Jak předat další proměnné do příručky Ansible

  1. Jak používat značky v Ansible Playbook (příklady)

  2. Jak používat proměnné v Ansible Playbook

  3. Jak používat smyčky v Ansible Playbook