collective.hostout可以帮助您以最少的努力控制多个应用程序环境。您可以使用一个简单的工具来管理本地、预发布和部署环境。
项目描述
它能做什么?
如果您是远程应用程序管理的新手,hostout可以帮助您在几分钟内部署您的第一个站点。hostout与Plone、django或任何基于buildout的环境兼容。
hostout是一个zc.buildout 食谱。Hostout会生成一个脚本,该脚本登录到您的远程主机并执行预设的可自定义命令。例如:
$ bin/hostout productionserver deploy
$ bin/hostout server1 server2 supervisorctl restart instance1
$ bin/hostout all cmd ls -al
$ bin/hostout staging mylocalfabriccommand
它是如何做到的?
命令可以轻松地从本地的fabric脚本、hostout命令插件或内置命令中添加,以帮助您启动和部署构建到远程主机。
为什么hostout很棒?
管理多个环境可能会非常痛苦,成为开发的障碍。hostout将所有环境的所有设置以易于管理的格式放在一个地方。
安装hostout
首先,按照说明操作,在开发机器上运行开发构建,然后您可以将此配方添加到Plone、django或其他基于构建的环境的构建中。
将collective.hostout部分添加到您的开发构建中。
>>> write('buildout.cfg', ... """ ... [buildout] ... parts = host1 ... ... [host1] ... recipe = collective.hostout ... host = 127.0.0.1:10022 ... user = root ... password = root ... path = /usr/local/plone/host1 ... """ % globals())
如果您没有包括密码,稍后将被提示输入。
接下来,重新运行您的构建以在构建的bin目录中安装hostout脚本
>>> print system('bin/buildout -N') Installing host1. Generated script '/sample-buildout/bin/hostout'.
生成的脚本使用命令和主机作为参数运行
>>> print system('bin/hostout') cmdline is: bin/hostout host1 [host2...] [all] cmd1 [cmd2...] [arg1 arg2...] Valid hosts are: host1
每个主机都指代您的构建中recipe=collective.hostout的部分的名称。每个主机对应一个主机和远程路径,这是命令默认作用的默认位置。
>>> print system('bin/hostout host1') cmdline is: bin/hostout host1 [host2...] [all] cmd1 [cmd2...] [arg1 arg2...] Valid commands are: bootstrap : Install python and users needed to run buildout buildout : Run the buildout on the remote server deploy : predeploy, uploadeggs, uploadbuildout, buildout and then postdeploy postdeploy : Perform any final plugin tasks predeploy : Install buildout and its dependencies if needed. Hookpoint for plugins resetpermissions : Ensure ownership and permissions are correct on buildout and cache run : Execute cmd on remote as login user sudo : Execute cmd on remote as root user uploadbuildout : Upload buildout pinned to local picked versions + uploaded eggs uploadeggs : Any develop eggs are released as eggs and uploaded to the server
>>> print system('bin/hostout host1 run pwd') Hostout: Running command 'run' from '.../fabfile.py' Logging into the following hosts as root: 127.0.0.1 [127.0.0.1] run: sh -c "cd /usr/local/plone/host1 && pwd" [127.0.0.1] out: CMD RECIEVED Done.
定义
- 构建
zc.buildout是创建用于运行应用程序的隔离环境的工具。它由一个称为构建文件的配置文件(或多个文件)控制。
- 构建配方
构建文件由部分组成,每个部分都有一个配方,负责安装特定的软件组件。
- 部署
将您正在开发的应用程序移动到主机服务器上以使用。通常部署会到一个用于测试或生产的预发布位置,以进行有限的使用或在主流中使用。生产、预发布和开发通常具有不同但相关的构建,并且可能涉及每个构建的不同数量的主机。
- 主机
在本文件中,这是一个运行Linux的机器或VPS,您希望将其部署到应用程序。
- fabric文件
请参阅fabric
使用内置部署命令
我们通常在开发机器上安装并运行了一个构建,我们需要快速轻松地将其部署到一台或多台主机。
首先,您需要一个Linux主机。您需要一个具有ssh访问和sudo访问权限的Linux。VPS和云托管现在很便宜,选择很多,例如每月最低11美元USD。如果您不确定,可以选择按小时付费的选项,例如预配置的Ubuntu,例如rackspacecloud或amazon EC2。
接下来,您需要为应用程序创建一个生产构建。有大量可供选择,无论是Plone、grok、django、BFG还是pylons。通常构建会包含几个文件,一个用于开发,一个用于生产。只需记住,为了获得最佳性能,您需要了解您的构建。
对于这个示例,我们还在构建中添加了一个开发蛋。
>>> mkdir('example')
>>> write('example', 'example.py', ... """ ... def run(): ... print "example" ... ... """)
>>> write('example', 'setup.py', ... """ ... from setuptools import setup ... ... setup( ... name = "example", ... entry_points = {'default': ['mkdir = mkdir:Mkdir']}, ... ) ... """)
>>> write('buildout.cfg', ... """ ... [buildout] ... parts = example host1 ... develop = example ... ... [example] ... recipe = zc.recipe.egg ... eggs = example ... ... [host1] ... recipe = collective.hostout ... host = 127.0.0.1:10022 ... user = root ... password = root ... ... """ % globals()) >>> print system('bin/buildout -N') Develop: '.../example' Uninstalling host1. Installing example. Installing host1.
部署命令将登录到您的宿主并设置构建环境,如果不存在,上传并安装构建。部署命令实际上是五个命令
- predeploy
如果需要,启动服务器。
- uploadeggs
任何开发蛋都会作为蛋释放并上传到服务器
- uploadbuildout
准备一个特殊的构建,引用已上传的蛋以及所有其他固定到本地选择的版本的蛋
- 构建
在远程服务器上运行构建
- postdeploy
执行任何最终插件任务
>>> print system('bin/hostout host1 deploy') running clean ... creating '...example-0.0.0dev_....egg' and adding '...' to it ... Hostout: Running command 'predeploy' from '.../collective.hostout/collective/hostout/fabfile.py' ... Hostout: Running command 'uploadeggs' from '.../collective.hostout/collective/hostout/fabfile.py' Hostout: Preparing eggs for transport Hostout: Develop egg /sample-buildout/example changed. Releasing with hash ... Hostout: Eggs to transport: example = 0.0.0dev-... Hostout: Wrote versions to /sample-buildout/host1.cfg ... Hostout: Running command 'uploadbuildout' from '.../collective.hostout/collective/hostout/fabfile.py' ... Hostout: Running command 'buildout' from '.../collective/hostout/fabfile.py' ... Hostout: Running command 'postdeploy' from '.../collective.hostout/collective/hostout/fabfile.py' ...
现在,我们的构建已经部署到我们的主机上,成为了一个活版本
启动
Hostout 内置了一个名为 bootstrap 的命令,如果预部署命令在远程路径未找到 buildout 安装,则会调用此命令。Bootstrap 不仅安装 buildout,还会安装正确的 python 版本、开发工具、所需库,并创建管理 buildout 所需的用户。内置的 bootstrap 可能不适用于所有 Linux 版本,因此请寻找与您安装的 Linux 发行版匹配的 Hostout 插件。
部署选项
- 构建
您要在远程主机上构建的配置文件。请注意,这不必与 Hostout 部分的 .cfg 文件相同,但 eggs 的版本将由包含 Hostout 部分的 buildout 确定。默认为 buildout.cfg
- 有效用户
将拥有 buildout 文件的用户。默认为 #TODO
- 路径
远程主机上创建 buildout 的绝对路径。默认为 ~${hostout:effective-user}/buildout
- 预命令
在运行 buildout 之前作为 root 执行的一系列 shell 命令。您可以使用此命令关闭应用程序。如果这些命令失败,它们将被忽略。
- 后命令
在运行 buildout 之后作为 root 执行的一系列 shell 命令。您可以使用此命令启动应用程序。如果这些命令失败,它们将被忽略。
- 部分
使用等于此值的 parts 运行 buildout
- 包含
运行此 buildout 所需的附加配置文件或目录
- buildout-cache
如果您想覆盖主机上 buildout-cache 的默认位置
- python 版本
在引导过程中要安装的 python 版本。默认为本地 buildout 中使用的版本。(未实现)
使用命令插件
您可以通过 extends 选项使用他人创建的命令。在 extends 选项中命名 buildout 菜单 egg,buildout 将下载并将任何 fabfiles 和其他配置选项合并到当前的 Hostout 配置中。以下是一些内置插件的示例,其他插件可在 pypi 上找到。
collective.hostout:supervisor
此菜谱是 Hostout 插件的示例。它将在部署后设置预命令和后命令来停止并重新启动 supervisor。它采用以下选项
>>> write('buildout.cfg', ... """ ... [buildout] ... parts = host1 ... ... [host1] ... recipe = collective.hostout ... host = 127.0.0.1:10022 ... password = root ... extends = collective.hostout:supervisor ... supervisor = supervisor ... init.d = True ... ... """)
>>> print system('bin/buildout -N') Uninstalling host1. Uninstalling example. Installing host1.
>>> print system('bin/hostout host1') cmdline is: bin/hostout host1 [host2...] [all] cmd1 [cmd2...] [arg1 arg2...] Valid commands are: ... installonstartup : Installs supervisor into your init.d scripts in order to ensure that supervisor is started on boot ... supervisorctl : Takes command line arguments and runs supervisorctl on the remote host supervisorshutdown : Shutdown the supervisor daemon supervisorstartup : Start the supervisor daemon ...
以下选项可能被使用
- supervisor
要停止和重新启动的 supervisor 部分名称
- init.d
如果设置,supervisord 脚本将被链接到 init.d,因此任何机器重启也将启动 supervisor
此外,supervisor 插件将在预部署期间关闭 supervisor,并在后部署期间启动 supervisor。
>>> print system('bin/hostout host1 deploy') Hostout: Running command 'predeploy' from '/.../collective/hostout/supervisor/fabfile.py' Logging into the following hosts as : 127.0.0.1 [127.0.0.1] sudo: /var/lib/plone/host1/bin/supervisorctl shutdown || echo 'Failed to shutdown' ... Hostout: Running command 'postdeploy' from '/.../collective/hostout/supervisor/fabfile.py' ... [127.0.0.1] sudo: /var/lib/plone/host1/bin/supervisord ... [127.0.0.1] sudo: /var/lib/plone/host1/bin/supervisorctl status ... Hostout: Running command 'postdeploy' from '.../collective.hostout/collective/hostout/fabfile.py' ...
collective.hostout:mrdeveloper
如果您包含此扩展,并且您有任何未提交的修改,您的 Hostout 部署将失败
>>> write('buildout.cfg', ... """ ... [buildout] ... parts = host1 example ... extensions = ... mr.developer ... sources = sources ... sources-dir = . ... auto-checkout = example ... [sources] ... example = fs example ... ... [example] ... recipe = zc.recipe.egg ... eggs = example ... ... [host1] ... recipe = collective.hostout ... host = 127.0.0.1:10022 ... password = root ... extends = collective.hostout:mrdeveloper ... ... """ )
>>> print system('bin/buildout -N') mr.developer: Filesystem package 'example' doesn't need a checkout. Develop: '/sample-buildout/./example' Uninstalling host1. Installing _mr.developer. Getting distribution for 'elementtree'. Got elementtree 1.2.6-20050316. Generated script '/sample-buildout/bin/develop'. Installing example. Installing host1.
###>>> 打印系统('bin/hostout host1 deploy')包 'example1' 已修改。Hostout 终止
collective.hostout:ubuntu
(目前未实现)如果您包含此扩展,则您的远程主机将使用原生 ubuntu 软件包,而不是更通用的 plone 统一安装程序。
警告:这将根据需要更改系统软件包以获取正确的 python 版本
collective.hostout.datafs
(未实现)添加此扩展将为操作 zope 或 plone 安装的 ZODB 数据库文件提供额外的命令。
>>> write('buildout.cfg', ... """ ... [buildout] ... parts = host1 ... ... [host1] ... recipe = collective.hostout ... host = localhost:10022 ... password = root ... extends = collective.hostout:datafs ... filestorage = ... ${buildout:directory}/var/filestorage/Data01.fs ... ${buildout:directory}/var/filestorage/Data02.fs ... ... ... """ % globals())
###>>> 打印系统('bin/buildout -N')
###>>> 打印系统('bin/hostout host1 upload')这将覆盖您主机上的以下文件存储文件。 - var/filestorage/Data.fs 您确定要这样做吗 [y/N]?
###>>> 打印系统('bin/hostout host1 download')这将覆盖您本地 buildout 目录中的以下文件存储文件。 - var/filestorage/Data.fs 您确定要这样做吗 [y/N]?
###>>> 打印系统('bin/hostout host1 backup')正在运行 repozo 以在远程服务器 'host1' 上创建备份...
添加您自己的命令
Hostout 使用 fabric 文件。Fabric 是一种通过 ssh 在主机上执行命令的简单方法。您可以按以下方式创建自己的 fabric 文件
>>> write('fabfile.py',""" ... def echo(cmdline1): ... hostout = get('hostout') ... bin = "%s/bin" % hostout.getRemoteBuildoutPath() ... option1 = hostout.options['option1'] ... run("echo '%s %s'" % (option1, cmdline1) ) ... """)
在您的hostout部分中,引用此文件。
>>> write('buildout.cfg', ... """ ... [buildout] ... parts = host1 ... ... [host1] ... recipe = collective.hostout ... host = 127.0.0.1:10022 ... fabfiles = fabfile.py ... option1 = buildout ... user = root ... password = root ... ... """ )
>>> print system('bin/buildout -N') Uninstalling host1. Installing host1.
>>> print system('bin/hostout host1 echo "is cool"') Hostout: Running command 'echo' from 'fabfile.py' Logging into the following hosts as root: 127.0.0.1 [127.0.0.1] run: echo 'buildout is cool' [127.0.0.1] out: CMD RECIEVED Done.
详细Hostout选项
- 主机
要部署到的主机的IP地址或主机名。默认情况下,它将连接到端口22使用ssh。您可以使用hostname:port来覆盖端口。
- 用户
hostout将尝试登录到您的主机作为的用户。将读取用户的ssh配置以获取默认值。
- 密码
登录用户的密码。如果未提供,则hostout将每次都询问。
- identity-file
登录用户的公钥。
- extends
指定另一个部分,其中包含此hostout的默认值。
- fabfiles
包含可以从中调用hostout脚本的命令的fabric文件的路径。命令可以通过fabric环境中的hostout.options访问hostout选项。
待办事项列表
使用最新的fabric并切换到python2.6
完成ubuntu引导
数据库处理的插件,包括备份,在开发、预发布和生产之间移动,无论位置如何。
云API的插件,如Amazon Ec2或Rackspace Cloud
与SCM集成以对所有部分进行标记,以便可以回滚部署。
在不存在SCM的情况下处理基本的回滚,例如当buildout失败时。
自动设置主机以实现无密码ssh登录。
帮助部署DNS设置,可能通过特定于托管公司的插件。
直接集成统一安装环境设置脚本。
通过可选的隧道连接到客户端Web代理来支持防火墙服务器。
探索从默认plone安装到完全托管站点的更简单过渡方式。
致谢
Dylan Jay (software at pretaweb dot com)
发布历史
0.9.4 (2009-01-31)
命令行已更改,以允许多站和参数。
mr.developer插件
supervisor插件
文档更清晰,更详细
ssh测试现在工作
可用命令的出色列表
0.9.3
修复了extends的工作方式
fabric命令在环境中使用hostout而不是参数
新的重置权限命令
fab_hosts等对所有命令进行了设置
supervisor配方现在使用fabfile
0.9.2 (2009-09-26)
可以直接从配方扩展,而不是从buildout部分扩展
supervisor插件配方
修复了配方的版本锁定
0.9.1 (2009-09-17)
修复了版本中包名称小写时的错误
0.9 (2009-09-15)
新的命令行允许同时部署到多个主机
使用“extends”选项从另一个部分获取默认值
fabfiles选项可以创建自己的hostout命令
将hostout cfg生成移动到部署时间
egg发布将内容散列作为版本号,除非更改,否则不会构建或上传
新的部分选项仅安装指定的部分
许多选项名称简化(保持向后兼容性)
预命令现在在buildout初始化之前运行
buildout现在以“有效用户”身份运行,而不是root。预和后命令仍然以root身份运行
eggs直接发布到下载缓存,而不是单独的dist目录
所有hostout部分的版本识别仅执行一次
0.1.3 (2009-05-06)
修复了将fabfile作为资源获取时的错误
允许指定不在buildout文件中的额外配置
0.1.2 (2009-04-24)
初始发布。基本的上传eggs和运行远程buildout。
collective.hostout-0.9.4.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 714a60d114765691d007e21ad18eadc1d797799fa55e7c36c5bb84f921b8dbf3 |
|
MD5 | 706d860989edbccbf375b62cd077ed0e |
|
BLAKE2b-256 | de7ebbe12356080ea0e85af1e9c5ae7f0796bde684e1c353631e4fa48a844ffd |