如何使用Fabric自动化管理任务和部署

来自菜鸟教程
跳转至:导航、​搜索

介绍


让我们自动化一些事情。 一切。

让我们也想出一种使用单个工具来做到这一点的方法。 一种易于编程、易于使用的软件。 为什么不只在远程机器上安装 SSH 来完成这一切——所有命令都在一个位置编写脚本,以便在本地或任意数量的各种服务器上执行。

听起来不是很棒 和 fab 吗? 我们同意。

在这篇 DigitalOcean 文章中,Fabric[系统] 管理和应用程序部署流线化库 – 是我们的主题。 我们将学习如何安装这个出色的工具,并了解通过简单地自动化平凡的管理任务会变得多么容易,否则这些任务需要通过 bash hack 和难以维护的复杂脚本来完成。

词汇表


1. 什么是面料?


  1. Fabric 和 Python 编程语言
  2. 系统/服务器管理
  3. 应用部署

2. 如何在运行 Ubuntu / Debian 的 Droplet 上安装 Fabric


3. Fabric 的特性和与 SSH 的集成


  1. run (面料.操作.运行)
  2. sudo (fabric.operations.sudo)
  3. local (面料.操作.本地)
  4. get (面料.操作.get)
  5. put (面料.操作.put)
  6. prompt (fabric.operations.prompt)
  7. reboot (面料.操作.重启)

4. Fabric 的助手:上下文管理器


  1. cd (fabric.context_managers.cd)
  2. lcd (fabric.context_managers.lcd)
  3. path (fabric.context_managers.path)
  4. settings (fabric.context_managers.settings)
  5. prefix (fabric.context_managers.prefix)

5. 用于自动化管理任务的示例 fabfile


什么是面料?


Fabric 是一个 Python 库(即 一种在 上构建 的工具,用于与 SSH 和计算机系统 [轻松] 进行交互,以自动执行从应用程序部署到一般系统管理的各种任务。

尽管它是基于 Python 的,但这并不意味着它严格用于与其他 Python 应用程序或工具一起工作。 事实上,无论特定语言或系统如何,Fabric 都可以让您实现任何目标。 只要满足非常基本的要求,您就可以利用这个优秀的库。

Fabric 脚本是基本的 Python 文件。 它们使用 Fabric 附带的 fab 工具运行。 所有这一切都是包括(即 import ..) 你的脚本(即 执行说明)并执行提供的程序。

说“你好 Fab!” 使用织物(fabfile.py):

# def hello(who="world"):
#    print "Hello {who}!".format(who=who)
    
$ fab hello:who=Fab
Hello Fab!

Fabric 和 Python 编程语言


正如我们上面简要提到的,虽然 Fabric 可以在非常大规模的场景中使用,但它是一个基于 Python 的库,需要使用 Python 编程语言对 fabfile 进行编程。

无论您有任何其他编程语言(包括 Python)的经验,当您浏览我们的 Fabric 文章时,您将学习如何使用此工具,并且很快就会看到它是多么的简单和美妙。

Python 是一种非常流行、被广泛采用的通用用途(即 不是为解决特定问题而创建的)编程语言。 它很容易通过它对代码可读性和简单性的重视来区分。 要了解 Python,请查看非常简短的 Python Enhancement Proposal (PEPs) 20 The Zen of Python,然后是位长的 Python 代码样式指南

为了全面了解 Python 编程可能是什么样的,您可以阅读 Python Beginner's Guide 中列出的一些优秀文章。

系统/服务器管理


使用 Fabric 的关键领域之一是自动化系统(和服务器)管理的日常任务。 这些工作几乎包括与以下相关的所有内容:

  • 搭建服务器;
  • 其维护,以及;
  • 监测。

当您开始使用自己的 Droplet(这是一个具有完全控制/访问权限的成熟虚拟化服务器)时,您将很快开始熟悉那些看似神秘的事物。 当您部署应用程序并开始处理它们的维护时,很自然地期望您会遇到一些问题。 但是,当您的应用程序越来越受欢迎并且事情开始增长时,管理多个 Droplet 并一遍又一遍地重复所有内容的需求就不再有趣了。

那正是您希望多年前遇到 Fabric 的时候。

应用部署


部署应用程序(无论是网站、API 还是服务器)通常意味着从头开始(或从及时拍摄的快照)设置系统,通过更新所有内容、下载依赖项、设置文件来准备系统结构和权限,然后最后上传您的代码库 - 或使用诸如 Git 之类的 SCM 下载它。

在开发过程中,您也可能有需要定期执行的命令(例如:在进入部署周期之前)。

在您意识到不断重复相同的步骤浪费了多少时间之后,能够以逻辑组织和(最重要的是)可编程的方式编写这些任务(本地和远程)的脚本证明是非常宝贵的,这使得所有事情都容易出错过程。

这正是 Fabric 以 Python 文件的形式为您提供帮助的时候,该文件将知道 what 做什么以及 where 做什么。

如何在运行 Ubuntu / Debian 的 Droplet 上安装 Fabric


安装 Fabric 的一种简单而统一的方法是使用默认的操作系统包管理器 aptitude

为了使用 aptitude 安装 Fabric,请运行以下命令:

sudo aptitude install fabric

# Alternatively, you can also use *pip*:
# pip install fabric

Fabric 的特性和与 SSH 的集成


开箱即用,任何 Python 命令(或过程)和模块都可以通过 Fabric 使用——假设 Fabric 确实是一个 Python 库。

Fabric 真正带来的是它与 SSH 的广泛而出色的集成,允许使用简单的脚本(即 fabfile.py)。

在本节中,您可以找到一系列工具(例如 Fabric 附带的函数),可用于与执行您指定的命令的环境进行交互。

注意:您可以通过访问其关于主题的文档来查看并了解有关Fabric的操作的更多信息。

运行 (fabric.operations.run)


Fabric 的 run 过程用于在一个或多个远程主机上执行 shell 命令。

  • run 的输出结果可以使用变量来捕获。
  • 可以使用 .failed.succeeded 检查命令是否成功。

使用示例:

# Create a directory (i.e. folder)
run("mkdir /tmp/trunk/")

# Uptime
run("uptime")

# Hostname
run("hostname")

# Capture the output of "ls" command
result = run("ls -l /var/www")

# Check if command failed
result.failed

sudo (fabric.operations.sudo)


除了 run,使用最广泛的 Fabric 命令大概是 sudo。 它允许使用 sudo 执行一组给定的命令和参数(即 superuser) 远程主机上的权限。

如果 sudo 命令与明确指定的用户一起使用,则执行将不会以 root 身份执行,而是以另一个身份执行(即 UID 1010)。

使用示例:

# Create a directory
sudo("mkdir /var/www")

# Create a directory as another user
sudo("mkdir /var/www/web-app-one", user="web-admin")

# Return the output
result = sudo("ls -l /var/www")

本地 (fabric.operations.local)


正如我们在介绍中提到的,单个 Fabric 脚本(fabfile)可用于在本地机器和远程系统上执行操作。 为此,Fabric 提供了 local 操作来在本地运行命令。

然而,与 run 或 sudo 不同的是,无法以相同的方式与 local 的输出交互。 可以捕获或打印输出 - 可以使用 capture 参数设置开关。

本地助手,例如 lcd 上下文管理器(用于设置 local 工作目录)是 honouredlocal,方式相同 [ X168X](或 sudo)支持 cd 上下文管理器。

使用示例:

# Create a source distribution tar archive (for a Python App.)
local("python setup.py sdist --formats=gztar", capture=False)

# Extract the contents of a tar archive
local("tar xzvf /tmp/trunk/app.tar.gz")

# Remove a file
local("rm /tmp/trunk/app.tar.gz")

获取(面料.操作.get)


get 命令存在下载(即 将文件从远程系统拉到正在使用 Fabric 的计算机。 它类似于 scp 的工作原理,当您需要下载备份、记录数据或其他一些与服务器相关的项目时,它会派上用场。

  • 您可以使用 remote_path 参数指定远程路径。
  • 您可以使用 local_path 参数指定本地下载路径。

使用示例:

# Download some logs
get(remote_path="/tmp/log_extracts.tar.gz", local_path="/logs/new_log.tar.gz")

# Download a database back-up
get("/backup/db.gz", "./db.gz")

放(面料.操作.放)


当您需要上传文件时,put 命令的使用与get 非常相似。 您可以使用 .failed.succeeded 再次访问命令的执行结果。

  • local_path - 设置本地路径。
  • remote_path - 设置远程路径。
  • use_sudo - 使用一个漂亮的技巧将文件上传到远程机器上的任何地方:上传到一个临时位置然后移动。
  • mode - 设置文件模式(标志)。
  • mirror_local - 设置文件标志(即 通过读取本地文件的模式自动生成可执行文件)。

使用示例:

# Upload a tar archive of an application
put("/local/path/to/app.tar.gz", "/tmp/trunk/app.tar.gz")

# Use the context manager `cd` instead of "remote_path" arg.
# This will upload app.tar.gz to /tmp/trunk/
with cd("/tmp"):
    put("local/path/to/app.tar.gz", "trunk")

# Upload a file and set the exact mode desired
upload = put("requirements.txt", "requirements.txt", mode=664)

# Verify the upload
upload.succeeded

提示(fabric.operations.prompt)


当您发现自己在使用 Fabric 时需要一些额外的灵活性时,prompt 将助您一臂之力。 该命令完全按照其名称所暗示的那样执行并询问用户(即 一个正在运行脚本的脚本)输入特定数据以在连续执行期间使用。

如果您使用单个文件管理多个应用程序,例如,您可以使用 prompt 设置一个来执行操作。

在开始之前,还可以使用 prompt 来查询要使用的端口号。

使用示例:

# Prompt the user
port_number = prompt("Which port would you like to use?")

# Prompt the user with defaults and validation
port_number = prompt("Which port?", default=42, validate=int)

重启(fabric.operations.reboot)


reboot 命令也是不言自明的:它用于重新启动远程系统。 默认情况下,它等待两分钟(即 120 秒 -> wait=120) 在完成其工作之前。

使用示例:

# Reboot the remote system
reboot()

# Reboot after 30 seconds
reboot(wait=30)

Fabric 的助手:上下文管理器


Fabric 的 上下文管理器 与 Python 的 with 语句一起使用。 原因是命令执行之间的会话是 not 保持在 shell-less 连接之间。

注意: 你可以通过访问其关于主题的文档来查看和了解有关Fabric上下文管理器的更多信息。

光盘 (fabric.context_managers.cd)


cd 上下文管理器允许保持目录状态(即 其中将执行以下注释块)。 它类似于在 SSH 会话期间运行 cd 命令并运行各种不同的命令。

使用示例:

# The *cd* context manager makes enwrapped command's
# execution relative to the stated path (i.e. "/tmp/trunk")
with cd("/tmp/trunk"):
    items = sudo("ls -l")

# It is possible to "chain" context managers
# The run commands gets executed, therefore at "/tmp/trunk"
with cd("/tmp"):
    with cd("/trunk"):
        run("ls")

液晶显示器 (fabric.context_managers.lcd)


lcd 上下文管理器(本地 cd)的工作方式与上述(cd)非常相似; 但是,它只影响本地系统的状态。

使用示例:

# Change the local working directory to project's
# and upload a tar archive
with lcd("~/projects/my_project"):
    print "Uploading the project archive"
    put("app.tar.gz", "/tmp/trunk/app.tar.gz")

路径(fabric.context_managers.path)


path 上下文管理器更改 PATH 变量。

设置(fabric.context_managers.settings)


当您需要临时(即 对于某个命令链),可以使用 settings 语句(即 覆盖 env 值)。

使用示例:

# Perform actions using a different *user*
with settings(user="user1"):
    sudo("cmd")

前缀(fabric.context_managers.prefix)


prefix 语句执行其名称所暗示的操作,并将给定的 runsudo 命令包装为指定的命令。

使用示例:

with prefix("cmd arg."):
    run("./start")
# cmd arg. && ./start

用于自动化管理任务的示例 fabfile


要开始学习如何对 fabfile 进行编程以自动执行简单的管理任务,让我们创建一个空的 fabfile.py

运行以下命令以使用文本编辑器 nano 创建 fabfile.py

nano fabfile.py

附加以下代码块更新系统并安装 memcached:

# Fabfile to:
#    - update the remote system(s) 
#    - download and install an application

# Import Fabric's API module
from fabric.api import *


env.hosts = [
    'server.domain.tld',
  # 'ip.add.rr.ess
  # 'server2.domain.tld',
]
# Set the username
env.user   = "root"

# Set the password [NOT RECOMMENDED]
# env.password = "passwd"

def update_upgrade():
    """
        Update the default OS installation's
        basic default tools.
                                            """
    run("aptitude    update")
    run("aptitude -y upgrade")

def install_memcached():
    """ Download and install memcached. """
    run("aptitude install -y memcached")

def update_install():

    # Update
    update_upgrade()
    
    # Install
    install_memcached()

使用 CTRL+X 保存并退出并使用 Y 确认。

现在,您可以开始使用 Fabric 及其在此处解释的功能来自动化您的普通服务器管理任务。

# Automate everything!
fab update_install

提交人: [[“%3Ca|https]] ://twitter.com/ostezer [[“%3C/a|”>操作系统]] 泰泽