jaký je pro tohle use case? Krátkým pohledem vidím, že parsuješ textový výstup příkazů, což je někdy velice ošemetné, viz třeba tvůj hosts, kde jak vidím nepočítáš s mezerou jako oddělovačem. Krom toho nevidím, že bys nějak pracoval s locales, pro přenosný script se hodí, když si tohle pohlídá.
Na tyhle věci používáme osquery, výstup má daleko spolehlivější. Případně velice slušnou práci dělá ansible -m setup
jaký je pro tohle use case?
- Sběr dat a následná analýza jinými nástroji (např. pro monitoring).
Krátkým pohledem vidím, že parsuješ textový výstup příkazů, což je někdy velice ošemetné, viz třeba tvůj hosts, kde jak vidím nepočítáš s mezerou jako oddělovačem.
- Ano, parsuji textové výstupy příkazů a děkuji za upozornění na jakoukoliv chybu ve způsobu zpracování dat.
Krom toho nevidím, že bys nějak pracoval s locales, pro přenosný script se hodí, když si tohle pohlídá.
- Ne, s locales momentálně nepracuji.
Na tyhle věci používáme osquery, výstup má daleko spolehlivější. Případně velice slušnou práci dělá ansible -m setup
- Nesnažím se konkurovat zaběhlým projektům se spoustou vývojářů. Toto je můj hobby projekt, který je teprve v začátku a nabízím jej jako možnost jak získat užitečné údaje ze systému a nemuset při tom psát vlastní parsery.
Petr.
@RDa
Odpověď je stejná jako u ostatních nástrojů:
1) sdruží mnoho různých výstupů do jednoho API - taková Fasáda
2) standardizuje tento nástroj, takže podpoří jednotnost napříč systémy po světě
3) dá možnost vývojářům se zapojit místo matlání svých vlastních verzí - např. jako Language Server Protocol nebo zrovna "vynález" JSONu ....
Přesně, tohle je peklo a za trest když to někdo takto dělá. Už jsem v životě narazil na několik případů kde toto vedlo ke ztrátě dat a podobným problémům.
Člověk si řekne vždyť ono to jen zpracovává výstup nějaké aplikace a ten dá na výstup. No to platí jen do té doby než se všude po netu začnou objevovat super návody, které daný nástroj využívají jako mezi krok pro další příkazy. A to že to v 90% funguje je sice pěkné, ale v těch 10% to může způsobit obrovské škody.
Za mne by se nikdy neměl zpracovávat výstup nástrojů, které negenerují nějaký standardní formát (TSV,CSV,JSON,XML,SDL,YAML...)
Ano, ale musel bych pohledat. Tuším že posledně co mě nadělalo peklo byl nějaký návod (dost možná i oficiální) jak zvětšit disk na amazon AWS. Problém byl že verze z jednoho nástrojů dávala lokalizovaný ouptut a tím padem se jaksi prohodil název disku či číslo partition. Ono šlo tuším ještě o kombinaci s nvme diskem.
No jo, zvyky jsou blby, treba casto jsem pouzival:
hddtemp /dev/sd?
Ale od doby co ma clovek >26 disku, tak je spravnejsi varianta:
hddtemp /dev/sd*[a-z]
Bohuzel do toho vstupuji disky bez senzoru (nebo nefuncni tunel skrze usb) a taky to, ze ma clovek nejake disky ktere maji binarni srajdy v nazvu, tak vypada prakticky pouzitelny skript mam pak takto:
hddtemp /dev/sd*[a-z] 2>/dev/null \
| tr -d '\001\200\100' \
| sed -u -E 's/(SSD 850 EVO 500G)(.*):/\1B:/'
To uz je fakt lepsi ty hodnoty ziskat priste jinou cestou.
Co me nejvice vadilo na parsovani textu je, ze nektere tooly sem tam hodnoty orezou - takze vyparsujete samozrejme irelevantni hodnotu.
Zkusil jste používat /dev/disk/by-{id,partuuid,by-path,by-uuid}? Obecně bych souhlasil s projektem OpenZFS a používal variantu by-id.
Chápu, že to má možná další výzvy, taky takové věci neřeším každý den :-)
Tam ale jsou namixovane vsechny disk-like block-device. Tj. krome diskovych zarizeni tam jsou i partisny (s -partN suffixexm), a taky lvm a mdraid zarizeni, takze to oddelat inverznim grepem bude jeste slozitejsi :-)
Jiste se nekde nachazi seznam obyc disku - napr. jako /sys/block/sd*, jenze to jsou jine adresare, takze se to musi trocha osefovat:
hddtemp `ls -d /sys/block/sd* | sed 's/sys\/block/dev/'`
Kreativite se meze nekladou v skriptovani, je to fajn na premysleni. Ale vzdy to ma neco sanci rozbit.. napr. az to pobezi ve virtualu a bude tam /dev/vd* :-)
Napr. fdisk oreze model disku:
# fdisk -l /dev/sdo Disk /dev/sdo: 7.28 TiB, 8001563222016 bytes, 15628053168 sectors Disk model: WDC WD80PURZ-85Y Units: sectors of 1 * 512 = 512 bytes
vs:
# smartctl -i /dev/sdr smartctl 7.1 2019-12-30 r5022 [x86_64-linux-5.10.1-gentoo-x86_64] (local build) Copyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org === START OF INFORMATION SECTION === Device Model: WDC WD80PURZ-85YNPY0
a podobne lsscsi oreze jak model, tak typ objektu:
# lsscsi 6 [6:0:19:0] enclosu ADAPTEC AEC-82885T B053 - [6:0:22:0] disk ATA WDC WD80PURZ-85Y 0A80 /dev/sdg [6:0:24:0] disk ATA WDC WD80PURZ-85Y 0A80 /dev/sdh [6:0:26:0] disk ATA SAMSUNG MZ7WD240 5W3Q /dev/sdi ...
Ono to je docela opruz, protoze nekdy na tech extra pismenkach z modelu fakt zalezi - mel jsem tri ruzne druhy WD30xxxx - s ruznym suffixem, kazdy mel jinej vykon.. asi co dum dal, ale nemoznost to poradne dohledat je fakt obtezujici.
Právě, že máme. Na Unixu dlouhé roky existují neřešitelné bezpečnostní problémy, náhodně se vyskytující bugy a odporné rovnáky na ohejbáky, protože v r. 1969 někdo dostal zvrácený nápad zpracovávat jakákoli data jako netypovaný a nestrukturovaný proud oktetů, a od té doby si fanboyové myslí, že je to tak dobře. Není, nebylo a nikdy nebude.
Škoda, že se více neuchytily třeba ty LISP machines. Aktuálně by asi bylo lepší posílat např. EDN, což je superset JSONu a má i další výhody jako jednodušší streamovatelnost. Možná jsou lepší varianty, ale tohle mi nepřijde špatné a je možné v tom reprezentovat dost dobře i čísla různých přesností nebo třeba množiny.
Problém bych viděl v tom, že by muselo existovat něco jako Clojure a bez garbage collection a tedy méně dynamického, aby se to dalo zkompilovat do strojového kódu předem. To by přesto asi umožňovalo nějaký interpret na způsob Babashky. Nemyslím ale, že by to byl neřešitelný problém. Jistě by nebyl problém vytvořit i nástroje, které by pracovaly s EDN v jazycích jako Rust, kde by se "prostě" přidala jen knihovna, která by většinu operací ulehčovala.
Možná by to šlo i nějak nalepit na současný systém na způsob Closh, ale myslím spíš, že je to dlouhodobě víc práce a slepá cesta.
Ahoj Adame,
je to trošku OT, ale já třeba používám https://github.com/swaroopch/edn_format pro Python. Výhoda EDN je, že lze snadno předat "data readery" pro další typy, například UUID, datetime, URL atd., což je vlastně typovost dat:
#inst "2012-02-01" #uri "http://www.root.cz"
Pro milovníky kulatých závorek :-) může být zajímavé tohle: Complex filtering with Scheme
Nevím, jestli víte jak funguje Ansible, ale dělá úplně to samé co moje aplikace (aspoň tedy co se týká získávání dat) . Na vzdáleném hostu spustí systémový příkaz s parametry, získá výstup a ten potom parsuje. Moje aplikace to dělá lokálně.
Viz Ansible - systemd.py
https://github.com/ansible/ansible/blob/devel/lib/ansible/modules/systemd.py#L331
def parse_systemctl_show(lines):
https://github.com/ansible/ansible/blob/devel/lib/ansible/modules/systemd.py#L290
Ansible je tu již nějaký ten rok a za tu dobu má vyladěny parsery a obrovské množství přispěvatelů.
Položím vám otázku - pokud by moje aplikace používala stejné příkazy a parsery jako Ansible, tak by pro vás byla důvěryhodná?
Petr
Důvěryhodnost si získáte tím, že bude dlouhou dobu fungovat a dávat správné výstupy na různých hardwarech, s různými jádry, na různých locales, ... Toho nedosáhnete, když se nebude používat - a nebude se používat, dokud toho nedosáhnete. Obvykle start života takového nástroje začíná tím, že jej potřebuje nějaký "vyšší" systém. Viz např. ansible.
Komentáře kolegů chápu, taky mi nepřijde jako příliš progresivní brát výstupy (a tím pádem být závislý) na dalších programech, nota bene, když ty informace máte při ruce v /sys a /proc. Použít výstup z jiného programu IMO dává smysl jen v tom případě, pokud je potřeba data interpretovat - doplnit např. o hodnoty z číselníků, které jádro neposkytne přímo.
Jenže, co člověk, to názor. Nejlepší je vrátit se k tomu, na co se Vás už někdo ptal. Jaký je use case. To usnadní zodpovědět tyto otázky.
Že má nějaký produkt "vychytaný" parser ještě neznamená, že způsob, jakým data získává, není z principu špatně zvolený. Tudíž že nemá jenom poměrně spolehlivý rovnák na ohýbák. Není podstatné, jestli mu důvěřuje ten nebo onen; až v tom Ansible nebo někde jinde narazí na okrajový příklad, který nevychytali nebo ten parser někdo "zoptimalizuje" tak, že část případů nebude fungovat, bude to houby platné.
Nový projekt má smysl, pokud máte dostatečně speciální případ použití nebo nějakou novou funkcionalitu. Může být, že třeba považujete Vaši verzi za technologicky lepší, pak je ale vhodné se vyhnout opakování starých chyb a slepých uliček.
Problémem není jen parsování nestrukturovaného výstupu nebo Python 2. Ansible je důvěryhodné i proto, že má za sebou obrovské množství lidí. Když už se objeví nějaký bug, tak ho v Ansible celkem rychle opraví. A je poměrně dobrá pravděpodobnost, že to bude platit i za rok nebo dva.
NIH (not invented here) syndromu je potřeba se vyhýbat. Prospěšnější je přispět do už zavedených projektů. Soukromé pokusy jsou v pořádku, pokud se něco potřebujete naučit. Nicméně pro jejich úspěšné rozšíření je potřeba mnohem více úsilí.
Mimochodem zrovna u toho systemd je tam skoro více dokumentace než kódu. Právě proto, že si autoři jsou vědomi toho, jak to může být křehké.
A ansible jde pustit lokálně: ansible -m setup localhost
ano, ansible také volá také cli příkazy, nepovažuji to za nejlepší způsob, ale je poměrně dobře ověřen praxí a za mě dává spolehlivé výsledky, dá se použít rychle. Za dobu co ho používám jsem hlásil jen minimum problémů.
Osquery od facebooku nebo třeba monitorovací nástroj netdata používá /dev, /proc aj. zařízení pro získávání věšiny informací, to považuji za správnou a udržovatelnou cestu. API v tomhle případě se totiž mění pozvolna, naopak formát textových výstup je mění každou chvíli a závisí na spoustě jiných skutečností.
Každý kdo pracuje s linuxem si parsuje cli a repl výstupy, ale je rozdíl si to udělat pro sebe na konkrétní použití, rovnou si ověřovat výstup a předhodit to jako projekt veřejnosti, kde bych už nějakou přenositelnost a ověřenost čekal.
Tenhle problém je hezky vysvětlený tady: Classic pipeline example. Ano, řešením je používání strukturovaných dat místo parsování textových výstupů určených pro člověka. A ta data jsou ve většině případů relační/tabulková...