[Python] distribuire programmi python
Daniele Varrazzo
piro a develer.com
Sab 6 Set 2014 04:30:11 CEST
On 2014-09-06 01:37, Balan Victor wrote:
>>
>> Chef e' potente ma fossi in te userei Ansible. Ha questi vantaggi:
>>>
>> mmm ... pricing... mmm free trial ... mmm in ogni caso mi guardo
>> anche
> questo
Il programma e' gratis e open. A pagamento hanno dei servizi di
centralizzazione, inventari dinamici, cose che neanche ho capito cosa
sono onestamente.
>> - non serve un server sulla macchina remota: basta ssh per usarlo
>> - non serve conoscere ruby per usarlo (non serve neanche conoscere
>> Python
>> per usarlo, basta yaml; per Chef invece devi scrivere roba Ruby)
>> - se ti serve hackarlo, e' scritto in Python, che si suppone tu
>> conosca.
>
> sembra un fabric un po più potente .. o sbaglio?
In un certo senso sì: come fabric si connette via ssh ed esegue
comandi. Però non è imperativo, ma dichiarativo. Ovvero, tu hai un task
che dice "sulla macchina deve esserci un utente che si chiama 'pippo' e
appartiene al gruppo 'devs'. Oppure "deve esserci la directory
/foo/bar/baz proprietario root e permessi 755". "apache deve essere
installato almeno versione 2.2" ecc. Tu dichiari cosa vuoi ed ansible fa
la differenza. Ovvero: va sulla macchina, "l'utente c'è? Stapposto". "La
directory c'è? Ha permessi 700? Cambio i permessi". "Apache c'è? No?
apt-get install..." Eccetera. Tu descrivi lo stato finale e il programma
si incarica di verificare che quello stato sia realizzato, oppure se non
c'è fa in modo di raggiungerlo.
Fabric invece è puramente imperativo: tu gli dici di eseguire "apt-get
install apache", poi se questo fa qualcosa oppure niente perché apache
c'è già non sono fatti di fabric. Ma se fai "useradd" e l'utente c'è già
probabilmente il comando ti darà un errore che dovrai gestire, e se
della directory vuoi cambiare i permessi devi gestire tipo due casi
diversi: se non c'è la devi creare, se c'è devi fare chmod. Certo puoi
provare a rendere idempotenti anche questi comandi (tipo usando mkdir -p
che non dà errore se la dir c'è già). Ma in generale se il comando che
esegui non è idempotente allora devi fare prima un controllo delle
precondizioni.
E poi sopra questo c'è tutta la gestione delle variabili e la
generazione di file di configurazione da template. In effetti ansible lo
stiamo introducendo su un sistema web piuttosto complicato il cui deploy
è evoluto con:
1) si fa tutto a mano (ssh mollybox, git checkout, ah, cazz, qui c'è
una libreria vecchia, pip install sqlalchemy. No a-ri-cazz, il frontend
e il backend vogliono due versioni diverse... - voce dall'altra parte
dell'ufficio: "ehi, come mai molly è giù?")
2) virtualenv, requirements.txt e fabric. Questo sistema almeno il
mondo python. L'aggiornamento diventa tipo "fab up", che fa il git pull,
pip install -U -r requirements, stop, start.
Peccato che mentre facevamo questo al sistema si sono aggiunte un paio
di istanze di redis, un rabbitmq e pure morbid perchè non ci facciamo
mancare niente, e poi haproxy e dentro redis ci buttiamo roba fatta con
capnproto. A coordinare questa roba virtualenv non basta. La macchina
era piuttosto vecchia e lo sviluppatore che aggiungeva questa roba si
doveva compilare anche il compilatore per compilare pycapnp e non so che
versione di redis con dentro un interprete lua... Mi sono distratto un
attimo (sono stato via dal lavoro qualche mese) e quando sono tornato si
era anche scritto un sistema per
3) generare i file di configurazione da template (per qualche motivo
gli era "cresciuto" mentre nel sistema ci buttava dentro anche
supervisord). Per fortuna non gli è uscito benissimo e alcuni template
hanno bisogno di un template di partenza, o qualcosa del genere di cui
mi sono perso volentieri i dettagli.
Insomma, per fortuna la settimana scorsa è andato in ferie lui,
altrimenti mi riscriveva ansible dentro molly :) Quando si è distratto
un attimo ho ansibolato tutto, ovvero a) installazione dei package e
preparazione del sistema, b) installazione del nostro codice e librerie
python c) generazione dei file di configurazione. Quindi ora in quei
playbook di ansible c'è già quasi tutta la "conoscenza" del sistema
(quando ha migrato la macchina vecchia alla nuova dice che c'ha messo
una settimana a sistemare tutto, a forza di tentativi ed errori,
ovviamente. Io ho fatto gli stessi errori, ma almeno quello che ho fatto
adesso è ripetibile e in 10 minuti parte da una VM vuota a un sistema
funzionante). Il sistema di template è più completo, per cui riesce a
gestire le varie casistiche che ci dobbiamo smazzare (per esempio che su
una macchina girano 3 istanze piccole del sito su 3 ip diversi ma
quell'altro sito è grande quindi è diviso su tre macchine, frontend,
backend, database, con 8 nodi frontend, 2 backend...) che a coprirle
tutte con scriptini fatti a mano un po' gli saranno tremate le vene e
probabilmente qualche scorciatoia l'ha presa.
...dov'eravamo? Ah sì: fabric. Sì, ansible gli somiglia, ma ci devi
aggiungere sopra la gestione delle variabili e la gestione dei template
di configurazione, che sono i problemi immediatamente successivi a
quelli che fabric risolve, e che a volerseli risolvere da sè si finisce
col riscrivere ansible, ma peggio.
>> e mi sono gia' fatto mandare affanculo dagli sviluppatori, e tutto
>> in
>> pochi giorni
>
> ahahahahah :)
>
>
> Tuttavia il mio problema non è il deploy(e mi rendo conto di aver
> anche
> sbagliato il titolo). Il programma fa 'autodeploy'(dopo la prima
> installazione. Per la prima installazione mi potrei arrangiare con
> fabric x
> linux e psexec x win). Una volta che il programma è presente sul
> server
> remoto potrei renderlo in grado di aggiornare lo stesso python o al
> limite
> torno ad arrangiarmi con fabric/psexec.
L'auto-aggiornamento è una tecnica tipica di windows, dove non c'è il
concetto di qualcuno che si collega da remoto per aggiornare i programmi
sulla tua macchina (o meglio c'è, ma di solito parla russo e vende
pillole blu ed altri impianti per far bene l'amore). Diciamo che *a te*
resta difficile collegarti a windows, non al resto del mondo. Su linux,
soprattutto sui server non si fa. Certo se queste macchine non sono
raggiungibili via ssh puoi farci poco, ma con gli eseguibili
autoaggiornanti non è che hai tutta la libertà di fare cambiamenti che
hai pushando.
> Il mio dubbio era più su dove installo python? Io pensavo più a
> qualcosa
> del tipo /mio/path o C:\mio\path dove dentro ci sono due directory
> pythonXX
> e mioprogramma. E' una buona prassi? potrei avere dei problemi?. Non
> voglio
> nemmeno 'inquinare' la variabile PATH.
Su windows dovresti fare un programma auto-contenuto, tipo con
pyinstaller, in modo da non avere problemi di dipendenze da Python
esterni, avere due passi di installazione separati ecc. Un eseguibile
pyinstaller non ha nessuna dipendenza esterna e gira ovunque lo metti.
Contiene il codice python e se contiene delle dll le salva in una
directory temporanea e le usa da lì... si fa un discreto mazzo per
rendere l'eseguibile indipendente e secondo me conviene sfruttarlo (tra
l'altro è mantenuto dai ragazzi della Develer: un po' di anni fa c'ho
messo le mani anche io).
Su *nix compila python installandolo in /usr/local/py34 (./configure
--prefix=/usr/local/py34 && make && sudo make install) e crea un
virtualenv che utilizzi quell'eseguibile. Puoi avere diverse versioni di
Python e non si danno minimamente fastidio (ho tutta la collezione dal
2.4 al 3.4 sul portatile e sulle macchine di test).
> X win usare portable python potrebbe essere una buona idea?
> Activepython l'avete mai usato?
Portable mai. Activepython più di 10 anni fa; non so cosa cambi
rispetto al Python originale. Secondo me qualunque cosa non sia
autocontenuta non è una buona idea.
-- Daniele
Maggiori informazioni sulla lista
Python