Python Fabric 部署脚本结构和语义

Python Fabric deploy script structure and semantics

我正在尝试编写一个基本的 Python Fabric 部署脚本,我有一些初学者级别的问题。

这是我目前的 fabfile.py(从这个 example 修改而来):

#!/usr/bin/env python

from fabric.api import *
import socket
import paramiko

env.roledefs = {'dev':['server.domain.tld']}

@task
@roles("dev")
def print_contents():
    echo("Printing working directory contents:\n")
    run("ls")

@task
@roles("dev")
def update_upgrade():
    """ Update the default OS installation's basic default tools. """
    sudo("sudo apt-get update")
    sudo("apt-get -y upgrade")

@task
@roles("dev")
def install_memcached():
    """ Download and install memcached. """
    sudo("apt-get install -y memcached")

@task
@roles("dev")
def deploy():
    print_contents()
    # Update
    update_upgrade()
    # Install
    install_memcached()

问题:

  1. 我需要 import socketimport paramiko 吗?
  2. 我不打算直接调用函数 print_contents()update_upgrade()install_memcached() - 它们只会在 deploy() 函数中调用。每个函数都需要成为 @task 装饰器的任务吗?
  3. 由于这是一个 Fabric 部署脚本,是否需要调用最终任务 deploy()?或者我们可以为该函数使用任何其他名称,例如。 update_all()?
  1. 不需要为此脚本导入socketparamiko,因为您不是直接从您的fabfile 调用它们。
  2. @task 装饰器仅用于您希望在命令行上作为结构任务使用的功能。在您提供的示例中,您只需要修饰 deploy 函数。

When this decorator is used, it signals to Fabric that only functions wrapped in the decorator are to be loaded up as valid tasks.

  1. 你可以用任何你喜欢的名字! Fabric 将使用您的函数名称作为任务名称,除非您使用 alias argument.

有关所有这些的更多信息,请参阅 docs for the task decorator