Übergeben Sie den Parameter an die Fabric-Aufgabe

123

Wie kann ich einen Parameter an eine Fabric-Task übergeben, wenn ich "fab" über die Befehlszeile aufrufe? Beispielsweise:

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

Done.

Ist es möglich, dies ohne Aufforderung zu tun fabric.operations.prompt?

Donovan
quelle

Antworten:

207

Dokumentation zu Fabric 2-Aufgabenargumenten:

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


Fabric 1.X verwendet die folgende Syntax zum Übergeben von Argumenten an Aufgaben:

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

Weitere Informationen finden Sie in den Fabric-Dokumenten .

Jakub Roztocil
quelle
9
Die Anführungszeichen sind nicht notwendig; Alle Argumente sind Zeichenfolgen: "Da dieser Prozess das Parsen von Zeichenfolgen umfasst, werden alle Werte als Python-Zeichenfolgen angezeigt. Planen Sie daher entsprechend. (Wir hoffen, dies in zukünftigen Versionen von Fabric zu verbessern, sofern eine intuitive Syntax gefunden werden kann.)"
Carl G
4
Die Anführungszeichen hello worldscheinen jedoch notwendig zu sein?
PEZ
2
@PEZ Wenn das stimmt, sind in diesem Beispiel wahrscheinlich Anführungszeichen erforderlich, da der Befehlszeilenparser des Terminals oder der Fabric den Leerzeichen sehen und denken würde, dass dies das Ende von allem für diese Aufgabe war und dass dies worldeine neue Aufgabe war.
Adam Kerz
1
Nachdem ich dies weniger als eine Minute lang verwendet habe, habe ich festgestellt, dass unter Windows die Verwendung von einfachen Anführungszeichen dazu führt, dass einfache Anführungszeichen als Teil des Arguments übergeben werden, doppelte Anführungszeichen jedoch zuerst entfernt werden. So 'hello world'würde eine Python String 'hello world', sondern "hello world"würde zu hello world(was wahrscheinlich ist es, was die meisten Menschen wollen würde).
Adam Kerz
5
Da der Prozess das Parsen von Strings beinhaltet, wird der bar=TrueBefehl in Fabric als bar='True'kein boolescher Wert übergeben
Chemical Programmer
7

Fabric-Argumente werden mit sehr einfachem Parsing von Zeichenfolgen verstanden, daher müssen Sie beim Senden ein wenig vorsichtig sein.

Hier einige Beispiele für verschiedene Möglichkeiten, Argumente an die folgende Testfunktion zu übergeben:

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

Ich verwende hier ein doppeltes Anführungszeichen, um die Shell aus der Gleichung herauszunehmen, aber einfache Anführungszeichen sind für einige Plattformen möglicherweise besser. Beachten Sie auch die Escapezeichen für Zeichen, die Fabric als Trennzeichen betrachtet.

Weitere Details finden Sie in den Dokumenten: http://docs.fabfile.org/en/1.14/usage/fab.html#per-task-arguments

Bogdan Kiselitsa
quelle
7

Fügen Sie in Fabric 2 einfach das Argument zu Ihrer Aufgabenfunktion hinzu. So übergeben Sie das versionArgument beispielsweise an task deploy:

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

Führen Sie es wie folgt aus:

fab -H host deploy --version v1.2.3

Fabric dokumentiert die Optionen sogar automatisch:

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

Docstring:
  none

Options:
  -v STRING, --version=STRING
mrts
quelle
Gibt es eine Möglichkeit, die Hosts in der Funktion selbst vorab zu definieren? Ähnlich dem Tag @roles (), in dem wir eine Liste der Hosts definieren können, auf denen die Aufgabe ausgeführt werden soll.
Anish
2

Sie müssen alle Python-Variablen als Zeichenfolgen übergeben, insbesondere wenn Sie zum Ausführen der Skripts einen Unterprozess verwenden. Andernfalls wird eine Fehlermeldung angezeigt. Sie müssen die Variablen separat wieder in int / boolean-Typen konvertieren.

def print_this(var):
    print str(var)

fab print_this:'hello world'
fab print_this='hello'
fab print_this:'99'
fab print_this='True'
frage
quelle
1

Wenn jemand Parameter in Fabric2 von einer Aufgabe an eine andere übergeben möchte, verwenden Sie dazu einfach das Umgebungswörterbuch:

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

Und Renn:

fab2 qa sign
MikeL
quelle