Passa il parametro all'attività fabric


123

Come posso passare un parametro a un'attività di fabric quando chiamo "fab" dalla riga di comando? Per esempio:

def task(something=''):
    print "You said %s" % something
$ fab task "hello"
You said hello

Done.

È possibile farlo senza chiedere conferma fabric.operations.prompt?

Risposte:


207

Documentazione degli argomenti dell'attività di Fabric 2:

http://docs.pyinvoke.org/en/latest/concepts/invoking-tasks.html#task-command-line-arguments


Fabric 1.X utilizza la seguente sintassi per il passaggio di argomenti alle attività:

 fab task:'hello world'
 fab task:something='hello'
 fab task:foo=99,bar=True
 fab task:foo,bar

Puoi leggere di più a riguardo nella documentazione di Fabric .


9
Le virgolette non sono necessarie; tutti gli argomenti sono stringhe: "poiché questo processo comporta l'analisi delle stringhe, tutti i valori finiranno come stringhe Python, quindi pianifica di conseguenza. (Speriamo di migliorare questo nelle versioni future di Fabric, a condizione che sia possibile trovare una sintassi intuitiva.)"
Carl G

4
Le citazioni in giro hello worldsembrano necessarie però?
PEZ

2
@PEZ Se questo è vero, le virgolette sono probabilmente necessarie in quell'esempio perché il parser della riga di comando del terminale o del fabric vedrebbe lo spazio e penserebbe che quella era la fine di tutto per quell'attività e quella worldera una nuova attività.
Adam Kerz

1
Inoltre, dopo averlo utilizzato per meno di un minuto, ho riscontrato che, su Windows, l'utilizzo di virgolette singole comporta il passaggio di virgolette singole come parte dell'argomento, ma le virgolette doppie vengono prima rimosse. Quindi, 'hello world'risulterebbe in una stringa Python di 'hello world', ma "hello world"risulterebbe in hello world(che è probabilmente ciò che la maggior parte delle persone vorrebbe).
Adam Kerz

5
Poiché il processo prevede l'analisi delle stringhe, il bar=Truecomando in fabric verrà passato in quanto bar='True'non è un valore booleano
Programmatore chimico

7

Gli argomenti del fabric vengono compresi con un'analisi delle stringhe molto semplice, quindi devi stare un po 'attento a come li invii.

Di seguito sono riportati alcuni esempi di modi diversi per passare argomenti alla seguente funzione di test:

@task
def test(*args, **kwargs):
    print("args:", args)
    print("named args:", kwargs)

$ fab "test:hello world"
('args:', ('hello world',))
('named args:', {})

$ fab "test:hello,world"
('args:', ('hello', 'world'))
('named args:', {})

$ fab "test:message=hello world"
('args:', ())
('named args:', {'message': 'hello world'})

$ fab "test:message=message \= hello\, world"
('args:', ())
('named args:', {'message': 'message = hello, world'})

Uso le virgolette doppie qui per togliere la shell dall'equazione, ma le virgolette singole potrebbero essere migliori per alcune piattaforme. Nota anche gli escape per i caratteri che fabric considera delimitatori.

Maggiori dettagli nei documenti: http://docs.fabfile.org/en/1.14/usage/fab.html#per-task-arguments


7

In Fabric 2, aggiungi semplicemente l'argomento alla tua funzione task. Ad esempio, per passare l' versionargomento all'attività deploy:

@task
def deploy(context, version):
    ...

Eseguilo come segue:

fab -H host deploy --version v1.2.3

Fabric documenta anche automaticamente le opzioni:

$ fab --help deploy
Usage: fab [--core-opts] deploy [--options] [other tasks here ...]

Docstring:
  none

Options:
  -v STRING, --version=STRING

c'è un modo per predefinire gli host nella funzione stessa? Simile al tag @roles () dove possiamo definire un elenco di host per eseguire l'attività.
Anish

2

Devi passare tutte le variabili Python come stringhe, specialmente se stai usando un sottoprocesso per eseguire gli script, altrimenti otterrai un errore. Sarà necessario riconvertire le variabili in tipi int / booleani separatamente.

def print_this(var):
    print str(var)

fab print_this:'hello world'
fab print_this='hello'
fab print_this:'99'
fab print_this='True'

1

Se qualcuno sta cercando di passare parametri da un'attività a un'altra in fabric2, usa semplicemente il dizionario dell'ambiente per quello:

@task
def qa(ctx):
  ctx.config.run.env['counter'] = 22
  ctx.config.run.env['conn'] = Connection('qa_host')

@task
def sign(ctx):
  print(ctx.config.run.env['counter'])
  conn = ctx.config.run.env['conn']
  conn.run('touch mike_was_here.txt')

E corri:

fab2 qa sign
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.