介绍
自动化,一切。
让我们也想出一种方法来使用单个工具来做到这一点,一个易于编程,易于使用的工具,为什么不使用任何东西,除了安装在远程机器上的SSH - 所有命令都被编写在一个位置进行本地执行或在任何数量的各种服务器上。
这听起来不太棒吗?我们同意。
在这篇DigitalOcean文章中, Fabric - the [系统]管理和应用部署简化库 - 是我们的主题,我们将学习如何安装这个奇妙的工具,并看到事情可以通过简单地自动化日常管理任务来变得多么容易,否则需要通过Bash黑客和难以维护的复杂脚本跳过。
词典
1、什么是工厂?
- 结构和 Python 编程语言
- 系统/服务器管理
- 应用部署
如何在运行 Ubuntu / Debian 的 Droplet 上安装 Fabric
Fabric的功能和与SSH的集成
run
(fabric.operations.run)sudo
(fabric.operations.sudo)local
(fabric.operations.local)get
(fabric.operations.get)put
(fabric.operations.put)prompt
(fabric.operations.prompt)reboot
(fabric.operations.reboot)
工厂的助手:背景管理员
cd
(fabric.context_managers.cd)lcd
(fabric.context_managers.lcd)path
(fabric.context_managers.path)settings
(fabric.context_managers.settings)prefix
(fabric.context_managers.prefix)
自动化管理任务的例子fabfile
什么是工厂?
Fabric 是一个 Python 库(即用于构建 on 的工具),用于与 SSH 和计算机系统互动,以便自动化各种任务,从应用部署到一般系统管理。
虽然基于Python,但这并不意味着它是严格用于与其他Python应用程序或工具一起工作。事实上,Fabric是为您实现几乎任何事情而存在的,无论是特定语言或系统。
Fabric 脚本是基本的 Python 文件. 它们使用由 Fabric 提供的 fab
工具运行. 所有这些都包括(即 import..
)你的脚本(即执行指令)并执行所提供的程序。
使用 Fabric (fabfile.py
) 说Hello Fab!
:
1# def hello(who="world"):
2# print "Hello {who}!".format(who=who)
3
4$ fab hello:who=Fab
5Hello Fab!
布拉克和Python编程语言
正如我们在上文中简要提到的,虽然Fabic可以在非常广泛的场景中使用,但它是一个基于Python的库, _fabfile_s需要使用Python编程语言进行编程。
无论你对任何其他编程语言(包括Python)的经验如何,当你通过我们的Tablic文章时,你将学习如何使用这个工具,并不会花费很长时间来看到它是多么简单和奇妙。
Python是一个非常流行的,广泛采用的一般目的(即不是为解决特定问题而创建的)编程语言,它可以很容易地通过它对代码可读性和简单性的重要性来区分出来。
为了了解 Python 中的编程可能是什么样的,您可以阅读 [Python 初学者指南] 所列的一些优秀文章(https://wiki.python.org/moin/BeginnersGuide/Programmers)。
系统/服务器管理
使用 Fabric 的关键领域之一是自动化系统(和服务器)管理的日常任务,这些工作包括几乎所有与:
- 构建服务器; 其维护; 监控。
当你开始使用你自己的Dropplet(即具有完全控制/访问的完全虚拟化服务器)时,看似神秘的东西会很快开始成为你熟悉的。当你部署应用程序并开始处理其维护时,仅仅是自然的预期你会遇到一些问题。
这正是你希望多年前遇见 Fabric 的时刻。
应用部署
部署一个应用程序(不论它是网站,API或服务器)通常意味着从头开始设置系统(或从及时拍摄的快照中),通过更新一切,下载依赖,设置文件结构和权限,然后最终上传您的代码库 - 或使用SCM如Git下载它。
在开发过程中,你也可能有需要经常执行的命令(例如:在进入部署周期之前)。
能够以逻辑上组织和最重要的是可编程的方式编写这些任务(本地和远程),在你意识到在不断重复相同步骤时浪费了多少时间后不久就证明是无价的。
這正是當Fabric以Python檔案的形式來幫助你時,它會知道要做什麼,以及要做什麼。
如何在运行 Ubuntu / Debian 的 Droplet 上安装 Fabric
安装 Fabric 的一个简单而连接的方式是使用默认操作系统包管理器aptitude
。
若要使用aptitude
安装 Fabric,请执行以下操作:
1sudo aptitude install fabric
2
3# Alternatively, you can also use *pip*:
4# pip install fabric
Fabric的功能和与SSH的集成
在盒子之外,任何Python命令(或程序)和模块都可以通过Fabric使用 - 鉴于Fabric确实是一个Python库。
Fabric真正带给桌面的是它与SSH的广泛和优秀的集成,允许使用简单的脚本(即fabfile.py
)简化一切。
在本节中,您可以找到带有 Fabric 的工具(例如函数)的选择,这些工具可用于与您指定的命令执行的环境进行交互。
** 注:** 您可以通过访问其文档(有关该主题)(http://docs.fabfile.org/en/1.4.0/api/core/operations.html)查看并了解更多关于 Fabric 的操作。
主营企业(fabric.operations.run)
Fabric的运行
程序用于在一个或多个远程主机上执行壳命令。
- 可以使用变量捕捉 run 的输出结果。
如果命令成功或失败,可以使用
.failed
和.succeeded
来检查。
使用例子:
1# Create a directory (i.e. folder)
2run("mkdir /tmp/trunk/")
3
4# Uptime
5run("uptime")
6
7# Hostname
8run("hostname")
9
10# Capture the output of "ls" command
11result = run("ls -l /var/www")
12
13# Check if command failed
14result.failed
除了运行
之外,最常用的 Fabric 命令可能是sudo
,它允许在远程主机上使用 sudo (即 superuser) 特权执行一组命令和参数。
如果 sudo 命令用于明确指定的用户,则执行将不会作为 root 而是另一个 (即 UID 1010)。
使用例子:
1# Create a directory
2sudo("mkdir /var/www")
3
4# Create a directory as another user
5sudo("mkdir /var/www/web-app-one", user="web-admin")
6
7# Return the output
8result = sudo("ls -l /var/www")
当地(fabric.operations.local )
正如我们在介绍中提到的,一个单一的 Fabric 脚本 (fabfile) 可以用于在本地机器和远程系统(s)上执行操作。
然而,与 run 或 sudo 不同,与本地
的输出相同的方式无法相互作用. 输出可以捕捉或打印 - 开关可以用捕捉
参数设置。
局部助手,如lcd
环境管理器(用于设置局部
工作目录)是honoured
与局部
相同,同样的运行
(或sudo
)是cd
环境管理器的荣誉。
使用例子:
1# Create a source distribution tar archive (for a Python App.)
2local("python setup.py sdist --formats=gztar", capture=False)
3
4# Extract the contents of a tar archive
5local("tar xzvf /tmp/trunk/app.tar.gz")
6
7# Remove a file
8local("rm /tmp/trunk/app.tar.gz")
点击查看(fabric.operations.get)
得到
命令存在于从远程系统下载(即拖动)文件到正在使用 Fabric 的计算机上。它类似于scp
的工作方式,在您需要下载备份、日志数据或其他与服务器相关的项目时非常有用。
- 您可以使用「remote_path」参数指定远程路径。 您可以使用「local_path」参数指定本地 - 下载 - 路径。
使用例子:
1# Download some logs
2get(remote_path="/tmp/log_extracts.tar.gz", local_path="/logs/new_log.tar.gz")
3
4# Download a database back-up
5get("/backup/db.gz", "./db.gz")
工厂(工厂)工厂(工厂)
当您需要上传文件时,可以使用放
命令非常类似于得到
,您可以再次访问执行命令的结果,使用失败
或成功
。
local_path
- 设置本地路径.remote_path
- 设置远程路径.use_sudo
- 使用巧妙的技巧将文件上传到远程机器的任何地方:上传到临时位置,然后移动。mode
- 设置文件模式(旗帜)。mirror_local
- 通过阅读本地文件模式自动设置文件旗帜(即使其可执行)。
使用例子:
1# Upload a tar archive of an application
2put("/local/path/to/app.tar.gz", "/tmp/trunk/app.tar.gz")
3
4# Use the context manager `cd` instead of "remote_path" arg.
5# This will upload app.tar.gz to /tmp/trunk/
6with cd("/tmp"):
7 put("local/path/to/app.tar.gz", "trunk")
8
9# Upload a file and set the exact mode desired
10upload = put("requirements.txt", "requirements.txt", mode=664)
11
12# Verify the upload
13upload.succeeded
快速操作(Fabric.operations.prompt)
当你发现自己需要一些额外的灵活性与Fabric工作时,‘prompt’将来拯救你. 这个命令执行它的名字,并要求用户(即正在运行脚本)输入一定的数据,以在连续执行中使用。
例如,如果您正在使用单个文件来管理多个应用程序,则可以使用提示
设置一个来执行这些操作。
在开始任何事情之前,提示
也可以用来查询要使用的端口号码。
使用例子:
1# Prompt the user
2port_number = prompt("Which port would you like to use?")
3
4# Prompt the user with defaults and validation
5port_number = prompt("Which port?", default=42, validate=int)
重新启动(fabric.operations.reboot)
重新启动
命令也具有自我解释性:它用于重新启动远程系统. 默认情况下,它在完成工作之前等待两分钟(即120秒 ->等待=120
)。
使用例子:
1# Reboot the remote system
2reboot()
3
4# Reboot after 30 seconds
5reboot(wait=30)
Fabric的助手:背景管理员
Fabric 的 context managers 与 Python 的 with
语句一起使用,原因是执行命令之间的会话在 shell-less 连接之间不保持。
** 注意:** 您可以通过访问其文档(有关该主题)查看并了解更多关于 Fabric 的语境管理器(http://docs.fabfile.org/en/1.4.0/api/core/context_managers.html)。
CD(fabric.context_managers.cd 编辑)
「cd」背景管理器允许保持目录状态(即下列评论块要执行的地方)。
使用例子:
1# The *cd* context manager makes enwrapped command's
2# execution relative to the stated path (i.e. "/tmp/trunk")
3with cd("/tmp/trunk"):
4 items = sudo("ls -l")
5
6# It is possible to "chain" context managers
7# The run commands gets executed, therefore at "/tmp/trunk"
8with cd("/tmp"):
9 with cd("/trunk"):
10 run("ls")
lcd (fabric.context_managers.lcd) 管理器
LCD
背景管理器(本地CD)与上面的管理器(CD)非常相似,但它只会影响本地系统的状态。
使用例子:
1# Change the local working directory to project's
2# and upload a tar archive
3with lcd("~/projects/my_project"):
4 print "Uploading the project archive"
5 put("app.tar.gz", "/tmp/trunk/app.tar.gz")
路径(fabric.context_managers.path)
path
背景管理器会更改 PATH 变量。
设置(fabric.context_managers.settings)
当您需要暂时(即对于特定命令链),您可以使用设置
语句(即env
值)。
使用例子:
1# Perform actions using a different *user*
2with settings(user="user1"):
3 sudo("cmd")
序列(fabric.context_managers.prefix)
前缀
语句是它的名字所暗示的,并将给定的运行
和sudo
命令与指定的命令包裹在一起。
使用例子:
1with prefix("cmd arg."):
2 run("./start")
3# cmd arg. && ./start
自动化管理任务的例子fabfile
要开始学习如何编程 _fabfile_s 来自动化一个简单的管理任务,让我们创建一个空的 `fabfile.py'。
运行以下命令以使用文本编辑器 nano 创建 `fabfile.py’:
1nano fabfile.py
附上以下代码块来更新系统并安装 memcached:
1# Fabfile to:
2# - update the remote system(s)
3# - download and install an application
4
5# Import Fabric's API module
6from fabric.api import *
7
8env.hosts = [
9 'server.domain.tld',
10 # 'ip.add.rr.ess
11 # 'server2.domain.tld',
12]
13# Set the username
14env.user = "root"
15
16# Set the password [NOT RECOMMENDED]
17# env.password = "passwd"
18
19def update_upgrade():
20 """
21 Update the default OS installation's
22 basic default tools.
23 """
24 run("aptitude update")
25 run("aptitude -y upgrade")
26
27def install_memcached():
28 """ Download and install memcached. """
29 run("aptitude install -y memcached")
30
31def update_install():
32
33 # Update
34 update_upgrade()
35
36 # Install
37 install_memcached()
使用 CTRL + X 保存和退出,并用 Y 确认。
现在,您可以开始使用 Fabric 和这里解释的功能来自动化您日常的服务器管理任务。
1# Automate everything!
2fab update_install