Sveiciens visiem.
Šodien Python ir viena no visvairāk izmantotajām valodām programmatūras produktu izstrādē, kā arī to infrastruktūras nodrošināšanā. Tādēļ daudziem DevOps speciālistiem, vai nu pēc savas gribas vai pretēji tam, nācās apgūt jaunu valodu, lai to izmantotu kā papildinājumu sen zināmajiem Bash skriptiem. Tomēr Bash un Python ievēro dažādus pieejas principus kodēšanai un tiem ir noteiktas īpašības, tāpēc Bash skriptu pārvēršana “čūskas valodā” dažreiz izrādās sarežģīta un ne vienkārša uzdevums.
Lai atvieglotu DevOps speciālistu dzīvi, ir izveidots un turpina veidoties daudz noderīgu bibliotēku un rīku Python valodā. Šis raksts apraksta divas jaunas bibliotēkas, ko radījusi šī ieraksta autore — un — un tās ir paredzētas, lai atbrīvotu DevOps speciālistus no nepieciešamības veltīt daudz uzmanības Python darba niansēm, atstājot vairāk vietas interesantākiem uzdevumiem. Bibliotēku darbības joma ir vides mainīgie un ārējo rīku palaišana.
Kuros interesē, lūdzu, dodieties zemāk.
Jauni „velo“?
Izklausās dīvaini, kāpēc veidot jaunus pakotnes triviālām operācijām? Kas traucē izmantot tieši os.environ un subprocess.?
Pierādījumi par katru no bibliotēkām tiks sniegti atsevišķi.
Bibliotēka smart-env
Pirms rakstīt savējo izstrādājumu, ir noderīgi palūkoties internetā pēc gataviem risinājumiem. Protams, pastāv risks, ka nevarēsiet atrast to, kas nepieciešams, bet tas vairāk ir “apdrošināšanas gadījums”. Parasti pieeja izrādās efektīva un ietaupa daudz laika un pūļu.
Saskaņā ar rezultātiem bija atklātas šādas lietas:
- ir pakotnes, kas tiešām iesaiņo izsaukumus uz os.environ, tomēr prasa daudz novērsto darbību (klases eksemplāra izveidi, īpašas parametru izsaukums utt.);
- ir pietiekami labas pakotnes, kas tomēr stingri saistītas ar noteiktu ekosistēmu (galvenokārt tīmekļa ietvariem, piemēram, Django) un tāpēc bez pielāgošanas absolūti nav universālas;
- ir retas mēģinājumi izveidot kaut ko jaunu. Piemēram, un tieši analizēt mainīgo vērtības, izsaucot metodes veida
get_(mainīgā_nosaukums)Vai arī šis , kas tomēr neatbalsta pašreiz atpalikušo Python 2 (uz kura, neskatoties uz , joprojām ir milzums uzrakstīta koda un veselas ekosistēmas);
- ir skolas un studiju projekti, kuriem nav skaidras jēgas, kāpēc tie atrodas augšupejošajā PyPI un tikai rada problēmas jaunu pakotņu nosaukumu izveidē (īpaši nosaukums «smart-env» — piespiedu pasākums).
Un šo sarakstu var turpināt nebeidzami. Tomēr iepriekš minētie punkti bija pietiekami, lai aizdedzinātu ideju radīt kaut ko ērtu un universālu.
Prasības, kas tika izvirzītas smart-env izstrādes priekšā:
- Maksimāli vienkārša lietošanas shēma
- Vieglā konfigurējama datu tipa atbalsts
- Saderība ar Python 2.7
- Laba koda pārklājuma pārbaudei
Beigās to visu izdevās īstenot. Šeit ir lietošanas piemērs:
from smart_env import ENV
print(ENV.HOME) # Ekvivalenti print(os.environ['HOME'])
# pieņemot, ka jūs iestatījāt vides mainīgo MYVAR uz "True"
ENV.enable_automatic_type_cast()
my_var = ENV.MY_VAR # Ekvivalenti loģiskai True
ENV.NEW_VAR = 100 # Iestata jaunu vides mainīgo
Kā redzams piemērā, lai strādātu ar jauno klasi, pietiek to importēt (nav nepieciešams izveidot instanci — tas ir nevajadzīgs solis). Pieeja jebkuram vides mainīgajam tiek panākta, pieprasot to kā ENV klases mainīgo, kas faktiski padara šo klasi intuitīvi saprotamu nativā sistēmas vides iepakojumu, vienlaikus pārvēršot to par iespējamu konfigurācijas objekta variantu gandrīz jebkurai sistēmai (līdzīgs pieejas veids tiek īstenots, piemēram, Django, tikai tur konfigurācijas objekts faktiski ir modulis/pakotne settings).
Automātiskās tipizācijas atbalsta ieslēgšana/izslēgšana tiek sasniegta, izmantojot divas metodes — enable_automatic_type_cast() un disable_automatic_type_cast(). Tas var būt ērti, ja vides mainīgajā ir sērijveidots JSON līdzīgs objekts vai pat vienkārša loģiskā konstante (skatot mainīgo DEBUG Django, salīdzinot vides mainīgo ar «atzītām» virkņu — viens no bieži sastopamiem gadījumiem). Bet tagad nav nepieciešams tieši pārvērst virknes — lielākā daļa nepieciešamo darbību jau ir iekļauta bibliotēkas dziļumos un tikai gaida signālu darbībai. 🙂 Kopumā tipizācija darbojas caurspīdīgi un atbalsta gandrīz visus esošos iebūvētos datu tipus (netika testēti frozenset, complex un bytes).
Python 2 atbalsta prasība tika īstenota praktiski bez upuriem (atsacoties no typing un dažām "saldajām konfektēm" jaunākajās Python 3 versijās), īpaši pateicoties visuresošajam six (problēmu risināšanai ar metaklases izmantošanu).
Bet ir arī daži ierobežojumi:
- Python 3 atbalsts paredz versiju 3.5 un augstāku (to klātbūtne jūsu projektā ir vai nu slinkuma, vai nepieciešamības uzlabojumiem rezultāts, jo ir grūti izdomāt objektīvu iemeslu, kāpēc jūs joprojām izmantojat 3.4);
- Python 2.7 bibliotēka neatbalsta kopu litterālu deserializāciju. Apraksts . Bet, ja kāds vēlas to īstenot — laipni lūgts:);
Bibliotēka arī paredz mehānismu izņēmumiem kļūdu parsēšanas gadījumā. Ja rindu nav izdevies atpazīt ne vienam no pieejamajiem analizatoriem, vērtība paliek rindiņas (drīzāk ērtības un atpakaļsaderības ar ierasto mainīgo loģiku Bash dēļ).
Python-shell bibliotēka
Tagad pastāstīšu par otro bibliotēku (trūkumu aprakstu esošajiem analogiem atstāšu — tas ir līdzīgs aprakstītajam smart-env. Analogi — un ).
Kopumā, realizācijas ideja un prasības tai ir līdzīgas aprakstītajām smart-env, ko var redzēt piemēra piemērā:
from python_shell import Shell
Shell.ls('-l', '$HOME') # Vienāds ar "ls -l $HOME"
command = Shell.whoami() # Vienāds ar "whoami"
print(command.output) # izdrukā jūsu pašreizējo lietotājvārdu
print(command.command) # izdrukā "whoami"
print(command.return_code) # izdrukā "0"
print(command.arguments) # izdrukā ""
Shell.mkdir('-p', '\/tmp\/new_folder') # izveido jaunu mapi
Ideja ir šāda:
- Vienots klase, kas iemieso Bash Python pasaulē;
- Katru Bash komandu izsauc kā Shell klases funkciju;
- Katras funkcijas izsaukuma parametri tiek nodoti attiecīgās Bash komandas izsaukumam;
- Katra komanda tiek izpildīta "šeit un tagad" tās izsaukšanas brīdī, t.i., tiek izmantots sinhronais pieejas veids;
- ir iespēja piekļūt komandas izvadam stdout, kā arī tās atgriešanas kodam;
- Ja komanda sistēmā nav pieejama — tiek izmests izņēmums.
Kā arī smart-env gadījumā, tiek nodrošināta Python 2 atbalsts (patiesībā, upuru asinis bija nedaudz vairāk), un nav atbalsta Python 3.0-3.4.
Bibliotēku attīstības plāni
Bibliotēkas var izmantot jau tagad: abas ir publicētas oficiālajā PyPI. Avota kodi ir pieejami GitHub (skatīt zemāk).
Abas bibliotēkas tiks attīstītas, ņemot vērā interešu grupu atsauksmes. Un, ja smart-env varbūt ir grūti izdomāt jaunu funkciju dažādību, tad python-shell noteikti var vēl pievienot kaut ko jaunu:
- atbalsts nenovēršamiem izsaukumiem;
- iespēja interaktīvi komunicēt ar komandu (darbs ar stdin);
- jaunu īpašību pievienošana (piemēram, īpašība, lai saņemtu izeju no stderr);
- pieejamo komandu katalogs (izmantošanai ar funkciju dir());
- utt.
Saites
- Bibliotēka smart-env: un
- Bibliotēka python-shell: un
- bibliotēku atjauninājumiem
UPD 2020. gada 23. februārī:
* Repozitāri ir pārcelti, atbilstošās saites ir atjaunotas
* Versija python-shell==1.0.1 tiek gatavota iznākšanai 2020. gada 29. februārī. Izmaiņu vidū ir atbalsts komandu automātiskajai pabeigšanai un komandu dir(Shell), komandu izpilde ar Python nederīgu identifikatoru, kā arī kļūdu labojumi.
Avots: habr.com
