Passar parâmetro para a tarefa de malha


123

Como posso passar um parâmetro para uma tarefa de malha ao chamar "fab" na linha de comando? Por exemplo:

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

Done.

É possível fazer isso sem avisar fabric.operations.prompt?

Respostas:


207

Documentação dos argumentos da tarefa do Fabric 2:

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


O Fabric 1.X usa a seguinte sintaxe para passar argumentos para tarefas:

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

Você pode ler mais sobre isso nos documentos do Fabric .


9
As aspas não são necessárias; todos os argumentos são cadeias de caracteres: "como esse processo envolve análise de cadeias, todos os valores acabam como cadeias de caracteres Python, portanto planeje adequadamente. (Esperamos melhorar isso em versões futuras do Fabric, desde que seja possível encontrar uma sintaxe intuitiva.)"
Carl G

4
As citações ao redor hello worldparecem necessárias?
PEZ

2
@PEZ Se isso for verdade, as aspas provavelmente são necessárias nesse exemplo, porque o analisador de linha de comando do terminal ou da malha veria o espaço e pensaria que isso era o fim de tudo para essa tarefa e que worldera uma nova tarefa.
Adam Kerz

1
Além disso, depois de usá-lo por menos de um minuto, descobri que, no Windows, o uso de aspas simples resulta em aspas simples sendo passadas como parte do argumento, mas as aspas duplas são removidas primeiro. Portanto, 'hello world'resultaria em uma string Python de 'hello world', mas "hello world"resultaria em hello world(que provavelmente é o que a maioria das pessoas gostaria).
Adam Kerz 23/12/2015

5
Uma vez que o processo envolve a análise de cadeia, bar=Trueno comando tecido vai passada como bar='True'o que não é boolean valor
Química programador

7

Os argumentos de malha são entendidos com uma análise de cadeias muito básica, portanto, você deve ter um pouco de cuidado com a forma como os envia.

Aqui estão alguns exemplos de maneiras diferentes de passar argumentos para a seguinte função de teste:

@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'})

Eu uso aspas duplas aqui para tirar o shell da equação, mas aspas simples podem ser melhores para algumas plataformas. Observe também as fugas dos caracteres que a malha considera delimitadores.

Mais detalhes nos documentos: http://docs.fabfile.org/en/1.14/usage/fab.html#per-task-arguments


7

No Fabric 2, basta adicionar o argumento à sua função de tarefa. Por exemplo, para passar o versionargumento para a tarefa deploy:

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

Execute-o da seguinte maneira:

fab -H host deploy --version v1.2.3

O Fabric até documenta as opções automaticamente:

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

Docstring:
  none

Options:
  -v STRING, --version=STRING

existe uma maneira de predefinir os hosts na própria função? Semelhante à tag @roles (), onde podemos definir a lista de hosts para executar a tarefa.
Anish

2

Você precisa passar todas as variáveis ​​Python como seqüências de caracteres, especialmente se estiver usando o subprocesso para executar os scripts, ou você receberá um erro. Você precisará converter as variáveis ​​novamente para tipos int / booleanos separadamente.

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 alguém estiver procurando passar parâmetros de uma tarefa para outra no fabric2, basta usar o dicionário de ambiente para isso:

@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 corra:

fab2 qa sign
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.