将参数传递给Fabric任务

问题描述 投票:119回答:5

从命令行调用“fab”时,如何将参数传递给结构任务?例如:

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

Done.

是否有可能在没有提示fabric.operations.prompt的情况下这样做?

python fabric
5个回答
204
投票

Fabric 2任务参数文档:

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


Fabric 1.X使用以下语法将参数传递给任务:

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

你可以在Fabric docs上阅读更多相关信息。


4
投票

使用非常基本的字符串解析来理解Fabric参数,因此您必须对发送它们的方式有点小心。

以下是将参数传递给以下测试函数的不同方法的几个示例:

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

我在这里使用双引号来使shell脱离等式,但对于某些平台,单引号可能更好。还要注意fabric考虑分隔符的字符的转义。

文档中的更多细节:http://docs.fabfile.org/en/1.14/usage/fab.html#per-task-arguments


3
投票

在Fabric 2中,只需将参数添加到任务函数中。例如,要将version参数传递给任务deploy

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

运行如下:

fab -H host deploy --version v1.2.3

Fabric甚至自动记录选项:

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

Docstring:
  none

Options:
  -v STRING, --version=STRING

2
投票

您需要将所有Python变量作为字符串传递,尤其是在使用子进程运行脚本时,或者您将收到错误。您需要将变量分别转换回int / boolean类型。

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
投票

如果有人想在fabric2中将参数从一个任务传递到另一个任务,只需使用环境字典:

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

并运行:

fab2 qa sign
© www.soinside.com 2019 - 2024. All rights reserved.