跳转到主要内容

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选项

对于更复杂的配置,您可以使用extends值在多个hostout定义之间共享默认值。

>>> write('buildout.cfg',
... """
... [buildout]
... parts = prod staging
...
... [hostout]
... recipe = collective.hostout
... password = blah
... user = root
... identity-file = id_dsa.pub
... pre-commands =
...    ${buildout:directory}/bin/supervisorctl shutdown || echo 'Unable to shutdown'
... post-commands =
...    ${buildout:directory}/bin/supervisord
... effective-user = plone
... include = config/haproxy.in
...
...
... [prod]
... recipe = collective.hostout
... extends = hostout
... host = localhost:10022
... buildout =
...    config/prod.cfg
... path = /var/plone/prod
...
... [staging]
... recipe = collective.hostout
... extends = hostout
... host = staging.prod.com
... buildout =
...    config/staging.cfg
... path = /var/plone/staging
...
... """ % globals())
>>> print system('bin/buildout -N')
    Uninstalling host1.
    Uninstalling example.
    Uninstalling _mr.developer.
    Installing hostout.
    Installing staging.
    Installing prod.

##>>> print system(‘bin/hostout deploy’) 无效的hostout hostouts: prod staging

详细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。

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面