
Není to žádné tajemství, že s výchozími nastaveními Ansible nemusí být jeho výkon příliš rychlý. V tomto článku upozorním na několik důvodů a navrhnu užitečné minimální úpravy, které mohou skutečně zvýšit rychlost vašeho projektu.
Zde a dále diskutujeme Ansible 2.9.x, který byl nainstalován do čerstvě vytvořeného virtualenv oblíbeným způsobem.
Po instalaci vytvořte vedle vašeho playbooku soubor «ansible.cfg» — toto umístění umožní přenášet nastavení spolu s projektem a budou se automaticky načítat.
Pipeline
To, že je třeba používat pipelining, tedy nikoli kopírování modulů do souborového systému cílového systému, ale předávání zip archivu obaleného v Base64 přímo na stdin interpretátoru Python, už někteří slyšeli, jiní ne, ale faktem zůstává, že: se stále podceňuje. Bohužel, některé populární distribuce Linuxu nastavovaly sudo výchozí špatně — a to tak, že tento příkaz vyžadoval přítomnost tty (terminálu), takže v Ansible tuto velmi užitečnou funkci ponechali výchozí nastavení vypnutou.
pipelining = TrueShromažďování faktů
Víte, že s výchozími nastaveními Ansible pro každý play iniciuje shromažďování faktů ze všech zapojených hostitelů? Pokud jste to nevěděli, nyní víte. Aby se tomu zabránilo, je třeba povolit buď explicitní režim shromažďování faktů, nebo inteligentní režim. V něm se fakta shromažďují pouze z hostitelů, kteří se v předchozích plays nevyskytovali.
UPD. Při kopírování budete muset vybrat jedno z těchto nastavení.
gathering = smart|explicitOpětovné používání ssh spojení
Pokud jste někdy spouštěli Ansible v režimu výstupu ladících informací (volba «v» opakovaně od jednou do devíti krát), možná jste si všimli, že ssh spojení se neustále navazuje a přerušuje. I zde existuje pár nuancí.
Zamezení opětovné instalace ssh spojení lze dosáhnout na dvou úrovních současně: jak v klientu ssh, tak při přenosu souborů na řízený hostitel z řídícího zařízení.
Pro opětovné použití otevřeného ssh připojení stačí jednoduše předat požadované klíče ssh klientovi. Poté začne dělat následující: při prvním navázání ssh připojení navíc vytvoří takzvaný control socket, při následných pak zkontroluje existenci tohoto socketu, a pokud je úspěšný, znovu použije existující ssh připojení. Aby to mělo smysl, nastavíme čas pro uchování připojení při neaktivitě. Více si můžete přečíst v , a v kontextu Ansible jednoduše používáme "prohození" potřebných voleb ssh klientovi.
ssh_args = "-o ControlMaster=auto -o ControlPersist=15m"Pro opětovné použití již otevřeného ssh připojení při přenosu souborů na spravovaný host stačí uvést ještě jednu neznámou nastavení ssh_transfer_method. Dokumentace k tomuto je extrémně a zavádějící, neboť tato volba je plně funkční! Zato čtení umožňuje pochopit, co se přesně bude dít: na spravovaném hostu bude spuštěn příkaz dd, který přímo pracuje s požadovaným souborem.
transfer_method = pipedMimochodem, v větvi "develop" toto nastavení také existuje a .
Neboj se nože, boj se vidlici
Další užitečné nastavení — forks. To určuje počet pracovních procesů, které se budou současně připojovat k hostům a vykonávat úkoly. Vzhledem k vlastnostem Pythonu jako programovacího jazyka se používají právě procesy, nikoli vlákna, protože Ansible stále podporuje Python 2.7 — žádný asyncio, tady není potřeba rozvářet asynchronní zpracování! Výchozí počet prostředníků v Ansible je pracovníků, ale pokud požádáte správně, může spustit více:
forks = 20Jen hned varuji, že tady mohou nastat určité komplikace spojené s dostupným objemem paměti na správním stroji. Jinými slovy, nastavit forks=100500 je samozřejmě možné, ale kdo říkal, že to bude fungovat?
Shrneme to dohromady
Konečně, pro ansible.cfg (ini formát) potřebná nastavení by mohla vypadat takto:
[defaults]
gathering = smart|explicit
forks = 20
[ssh_connection]
pipelining = True
ssh_args = -o ControlMaster=auto -o ControlPersist=15m
transfer_method = piped
A pokud chceš všechno schovat do normálního YaML inventáře zdravého člověka, může to vypadat asi takto:
---
all:
vars:
ansible_ssh_pipelining: true
ansible_ssh_transfer_method: piped
ansible_ssh_args: -o ControlMaster=auto -o ControlPersist=15m
Bohužel, s nastavením „gathering = smart/explicit“ a „forks = 20“ to neprojde: jejich YaML ekvivalenty neexistují. Buď je nastavíme v ansible.cfg, nebo je předáme prostřednictvím proměnných prostředí ANSIBLE_GATHERING a ANSIBLE_FORKS.
O Mitogenu
— A kde je zde o Mitogenu? — můžeš se ptát, vážený čtenáři. V tomto článku — nikde. Ale pokud jsi skutečně připraven číst jeho kód a zkoumat, proč tvůj playbook selhává s Mitogenem, zatímco s vanilkovým Ansible funguje v pořádku, nebo proč tento stejný playbook doteď bezchybně fungoval a po aktualizaci začal fungovat zvláštně — co, Mitogen by mohl být tvým nástrojem. Používej ho, zkoumej, piš články — rád si je přečtu.
Proč osobně já nepoužívám Mitogen? Protože to funguje pouze, když jsou úkoly skutečně jednoduché a všechno je v pořádku. Ale jakmile se trochu odchýlíš doleva nebo doprava — to je konec: na tebe letí hromada nejasných výjimek a k dokreslení obrazu chybí jen okřídlená fráze „děkujeme všem, všichni jsou svobodní“. Stručně řečeno, nechci trávit čas zkoumáním příčin dalšího „podzemního úderu“.
Některá z těchto nastavení byla objevena při čtení pluginu connection s výmluvným názvem „ssh.py“. Výsledky čtení sdílím v naději, že to inspiruje někoho, aby se podíval na zdrojové kódy, četl je, ověřoval realizaci a porovnával s dokumentací — vždyť to přinese pozitivní výsledky. Hodně štěstí!
Pouze registrovaní uživatelé se mohou účastnit ankety. , prosím.
Která z uvedených nastavení Ansible používáte pro urychlení svých projektů?
69,6%pipelining = true32
34,8%gathering = smart/explicit16
52,2%ssh_args = "-o ControlMaster=auto -o ControlPersist=…"24
17,4%transfer_method = piped8
63,0%forks = XXX29
6,5%Žádná z toho, pouze Mitogen3
8,7%Mitogen + zmíním, které z těchto nastavení4
Hlasovalo 46 uživatelů. Zdrželo se 21 uživatelů.
Chceš se dozvědět více o Ansible?
78,3%ano, samozřejmě54
21,7%ano, chci více hardcore věcí!15
0,0%ne, a to ani zadarmo0
0,0%ne, je to příliš složité!!!0
Hlasovalo 69 uživatelů. Zdrželo se 7 uživatelů.
Zdroj: habr.com
