Pasar parámetro a tarea de tejido

123

¿Cómo puedo pasar un parámetro a una tarea de estructura cuando llamo "fab" desde la línea de comandos? Por ejemplo:

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

Done.

¿Es posible hacer esto sin preguntar fabric.operations.prompt?

Donovan
fuente

Respuestas:

207

Documentación de argumentos de tareas de Fabric 2:

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


Fabric 1.X utiliza la siguiente sintaxis para pasar argumentos a las tareas:

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

Puede leer más al respecto en los documentos de Fabric .

Jakub Roztocil
fuente
9
Las citas no son necesarias; todos los argumentos son cadenas: "dado que este proceso implica el análisis de cadenas, todos los valores terminarán como cadenas de Python, así que planifique en consecuencia. (Esperamos mejorar esto en futuras versiones de Fabric, siempre que se pueda encontrar una sintaxis intuitiva)"
Carl G
44
Sin hello worldembargo, ¿las citas son necesarias?
PEZ
2
@PEZ Si eso es cierto, las comillas probablemente sean necesarias en ese ejemplo porque el analizador de línea de comando de la terminal o la estructura vería el espacio y pensaría que ese era el final de todo para esa tarea y que worldera una tarea nueva.
Adam Kerz
1
Además, después de usar esto durante menos de un minuto, descubrí que, en Windows, el uso de comillas simples da como resultado que las comillas simples se pasen como parte del argumento, pero las comillas dobles se eliminan primero. Entonces, 'hello world'daría como resultado una cadena de Python de 'hello world', pero "hello world"daría como resultado hello world(que es probablemente lo que la mayoría de la gente desearía).
Adam Kerz
55
Dado que el proceso implica el análisis de cadenas, el bar=Truecomando en la estructura pasará como un bar='True'valor no booleano
Programador químico
7

Los argumentos de estructura se entienden con un análisis de cadenas muy básico, por lo que debe tener un poco de cuidado con la forma en que los envía.

Aquí hay algunos ejemplos de diferentes formas de pasar argumentos a la siguiente función de prueba:

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

Utilizo comillas dobles aquí para sacar la concha de la ecuación, pero las comillas simples pueden ser mejores para algunas plataformas. También tenga en cuenta los escapes para los caracteres que la tela considera delimitadores.

Más detalles en los documentos: http://docs.fabfile.org/en/1.14/usage/fab.html#per-task-arguments

Bogdan Kiselitsa
fuente
7

En Fabric 2, simplemente agregue el argumento a su función de tarea. Por ejemplo, para pasar el versionargumento a la tarea deploy:

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

Ejecútelo de la siguiente manera:

fab -H host deploy --version v1.2.3

Fabric incluso documenta las opciones automáticamente:

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

Docstring:
  none

Options:
  -v STRING, --version=STRING
mrts
fuente
¿Hay alguna manera de predefinir los hosts en la función misma? Similar a la etiqueta @roles () donde podemos definir la lista de hosts para ejecutar la tarea.
Anish
2

Debe pasar todas las variables de Python como cadenas, especialmente si está utilizando un subproceso para ejecutar los scripts, o recibirá un error. Deberá convertir las variables de nuevo a tipos int / booleanos por separado.

def print_this(var):
    print str(var)

fab print_this:'hello world'
fab print_this='hello'
fab print_this:'99'
fab print_this='True'
forraje
fuente
1

Si alguien está buscando pasar parámetros de una tarea a otra en fabric2, solo use el diccionario de entorno para eso:

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

Y correr:

fab2 qa sign
MikeL
fuente