V průběhu provádění úkolů v příručce Ansible , můžete narazit na některé úkoly, které se svou povahou opakují. Jedná se o úkoly, které vyžadují vytvoření více her, což může být docela únavné. Stejně jako v každém programovacím jazyce poskytují smyčky v Ansible snadnější způsob provádění opakujících se úloh pomocí menšího počtu řádků kódu v playbooku.
Při vytváření smyček poskytuje Ansible tyto dvě direktivy:loop a s_* klíčové slovo.
Klíčové slovo smyčky bylo nedávno přidáno do Ansible 2.5 . Klíčové slovo loop se obvykle používá k vytvoření jednoduchých a standardních smyček, které procházejí několika položkami.
with_* klíčové slovo se používá s řadou vyhledávacích pluginů při iteraci hodnot. Vyhledávací pluginy umožňují Ansible přistupovat k informacím z externích zdrojů, jako jsou externí datová úložiště, souborové systémy atd. The with_* vyhledávání se stále velmi používá a dosud nebylo zavrženo.
Pojďme se nyní podívat na to, jak můžete implementovat smyčky v Ansible.
Iterace přes jednoduché smyčky
Zvažte Playbook, který přidá nového uživatele do cílového systému pomocí uživatelského modulu, jak je znázorněno:
---- hostitelé:ubuntu_webserver úkoly: - jméno:Vytvořit nového uživatele john user: jméno:john stav:přítomný
Tohle vypadá dobře. Ale co když máme do cílového systému přidat více uživatelů? Jak bychom na to šli? Jedním ze způsobů by bylo duplikovat úkoly, jak je uvedeno v příkladu níže, kde přidáváme 3 uživatele.
---- hostitelé:ubuntu_webserver úkoly: - jméno:Vytvořit nového uživatele john uživatel: jméno:john stav:přítomný - jméno:Vytvořit nového uživatele mike uživatel: jméno: jméno:mike je přítomen uživatel: nový uživatel je : jméno:andrew stav:přítomný
Jak se můžete zdát, vyžaduje to hodně duplikace a opakování.
Aby to bylo snazší, stejnou příručku lze napsat pomocí direktivy loop. Direktiva loop provede stejnou úlohu vícekrát. Ukládá hodnotu každé položky do proměnné s názvem item .Takže místo zadávání jmen uživatelů, kteří mají být přidáni, jednoduše zadejte proměnnou nazvanou item uzavřenou mezi dvojité složené závorky, jak je znázorněno.
jméno:‚{{ item }}‘
Proto bude proměnná odkazovat na každou z položek ve smyčce.
Jak můžete vidět, naše příručka je nyní mnohem přehlednější a zbytečně duplikuje/opakuje se.
$ vi create_users.yaml---- hostitelé:ubuntu_webserver úkoly: - name:Vytvořit nové uživatele user: name:'{{ item }}' stav:přítomný smyčka: -
Můžete také použít with_items direktiva namísto směrnice smyčky. Oba povedou ke stejnému výsledku.
---- hostitelé:ubuntu_webserver stát se:ano úkoly: - jméno:Vytvořit nové uživatele uživatel: jméno:'{{ item }}' stav:přítomen with_items: - john re wNyní můžete spustit příručku a vytvořit uživatele pomocí ansible-playbook příkaz, jak je znázorněno níže:
$ ansible-playbook -i inventář.txt create_users.yaml
Opakování seznamu slovníků
V prvním příkladu jsme se podívali na jednoduchou standardní smyčku, kde pole bylo seznamem řetězcových hodnot představujících uživatele, kteří mají být přidáni do vzdáleného cíle.
Ale co když potřebujeme přidat uid do smyčky tak, že každá položka má nyní dvě hodnoty:uživatelské jméno a uid . Jak byste předali 2 hodnoty v poli?
V tomto scénáři budete muset předat pole slovníků, každý se 2 páry klíč–hodnota, jak je znázorněno. Klíči budou jméno a uid, zatímco hodnoty budou uživatelské jméno a ID každého uživatele.
V části „úkoly ‘, již nemůžete definovat položku proměnné jako dříve. Protože máme 2 hodnoty, převede se to na dvě proměnné:item.name &item.uid .
Kompletní příručka je zobrazena níže:
$ vi create_users.yaml---- hostitelé:ubuntu_webserver stát se:yes úkoly: - name:Vytvořit nové uživatele uživatel: název:'{{ item.name }}' uid:'{{ item.uid }}' stav:současnost smyčka: - jméno:john uid:1020 - jméno:mike uid:1030 - jméno:andrew uid:před 10
Pole slovníků může být také reprezentováno ve formátu JSON.
loop: - { name:john , uid:1020 } - { name:mike , uid:1030 } - { name:andrew , uid:1040}Po provedení získáte následující výstup:
$ ansible-playbook -i inventář.txt create_users.yaml
Ansible smyčky s indexy
Občas můžete chtít sledovat hodnoty indexu v rámci pole položek. K tomu použijte ‘with indexed_items ' vzhlédnout. Hodnota indexu začíná od 0, zatímco index smyčky začíná od item.0 a hodnotu zpoložky.1
Zvažte níže uvedenou příručku:
$ vi indexes.yaml---- hostitelé:ubuntu_webserver úkoly: - name:Indexes with Ansible loop ladění: msg:"Auto v {{ item.0 }} je {{ item.1 }}" with_indexed_items:– „Nissan“ – „Mercedes“ – „Toyota“ – „Mazda“ – „BMW“
Po spuštění playbook zobrazí hodnotu indexu každé položky v seznamu polí.
$ ansible-playbook -i inventář.txt indexes.yaml
Podmínky v Ansible Loops
V Ansible cyklech můžete použít podmíněný příkaz, kdy řídit cyklování na základě povahy proměnných nebo systémových faktů. Podívejte se na níže uvedený playbook, kde máme seznam balíčků, které je třeba nainstalovat.
Zadali jsme pole nazvané „balíčky ‘, který obsahuje seznam balíčků, které je třeba nainstalovat. Každá z položek v poli obsahuje název balíčku, který se má nainstalovat, a vlastnost nazvanou „požadováno “, která je nastavena na hodnotu „True “ pro 2 balíčky a „False ‘ za jeden balíček.
$ vi install-packages.yaml---- name:Instalační software stát se:ano hostitelé:všechny varianty: balíčky: - název:neofetch povinné:True - název:cpu-checker povinné:True screen fetch Falešné úkoly: - name:Install "{{ item.name }}" na Ubuntu apt: name:"{{ item.name }}" State:present when: - item.required ==True - ansible_facttion =="Ubuntu" smyčka:"{{ balíčky }"
„kdy ‘ podmíněný příkaz se snaží nainstalovat softwarové balíčky s vlastností ‘požadováno ‘ nastaveno na ‘True “ na cílových systémech, kterými jsou distribuce Ubuntu. Níže je uveden výstup z playbooku při spuštění.
Podrobný výstup jasně ukazuje balíčky, které se instalují, a ten, který je na základě podmíněného příkazu ignorován.
A tím se dostáváme ke konci tohoto tématu. Doufáme, že dobře rozumíte smyčkám v příručkách Ansible. Neváhejte se obrátit na jakékoli vysvětlení.
Přečtěte si také :Jak používat šablonu Jinja2 v Ansible Playbook
Jak otáčet a komprimovat soubory protokolu v Linuxu pomocí Logrotate Jak nakonfigurovat trvalý svazek založený na NFS v KubernetesLinux