跳转到主要内容

用于Plone部署的zc.buildout配方,配置各种Unix系统服务。

项目描述

简介

此配方提供在buildout中部署Plone/Zope2时配置各种Unix服务的支持。

目前提供以下功能:

  • 为所有Zope 2实例和ZEO部分以及ftw.structlog日志文件创建Logrotate配置。

  • 创建类似RedHat的运行控制脚本。

  • 创建打包所有存储的packall脚本。

  • ftw.structlogftw.contentstats日志创建filebeat探查器配置。

支持的选项

该配方支持以下选项:

logrotate-directory

将创建logrotate配置文件的目录。默认为${buildout:directory}/etc/logrotate.d。添加此参数不传递任何参数以抑制生成logrotate配置。

如果设置此参数,此配方将为所有存在的Zope 2实例和ZEO部分创建logrotate配置,以及无条件地为ftw.structlog日志文件创建logrotate配置。

logrotate-options

应添加到logrotate配置中的logrotate选项列表。

如果没有指定logrotate-options中的postrotate,将自动添加重新打开已旋转日志文件的配置。

示例

logrotate-options =
    rotate 4
    weekly
    missingok
    notifempty
    nomail

将为ftw.structlog日志文件创建类似其他日志文件的logrotate配置,除了以下内容:

  • 如果没有在logrotate-options中指定,则不会自动插入postrotate脚本

  • missingok将始终包含

  • 旋转模式将始终为copytruncate,而nocopytruncate将被忽略

startup-directory

如果指定,将在给定的目录中创建一个启动脚本。如果存在此选项,则禁用运行控制脚本的生成。

shutdown-directory

如果指定,将在给定的目录中创建一个关机脚本。如果存在此选项,则禁用运行控制脚本的生成。

rc-directory

运行控制脚本应安装的目录。默认为 ${buildout:directory}/bin。不带参数添加此参数以抑制运行控制脚本的生成。

rc-prefix

运行控制脚本的名称前缀。默认为 rc-

rc-user

运行控制脚本启动进程时使用的用户名称。默认为 zope

has-supervisor

布尔值指示是否正在使用supervisor。如果为true,则为supervisor仅生成运行控制脚本。如果为false,则为所有zope和zeo部分生成运行控制脚本。默认情况下,该配方尝试自动确定是否正在使用supervisor。

zopes

一个Zope 2实例部分的列表。默认为所有使用 plone.recipe.zope2instance 配方的部分。

zeos

一个ZEO服务器部分的列表。默认为所有使用 plone.recipe.zeoserverplone.recipe.zope2zeoserver 配方的部分。

packall-symlink-directory

在给定的目录中创建对packall脚本的符号链接。可用于自动化多个部署的打包。

create-filebeat-config

布尔值指示是否应为此部署创建filebeat配置。默认为true。设置为 false 以抑制filebeat配置的创建。

变更日志

1.4.3 (2019-02-04)

  • 在生成logrotate配置时跳过重复的zope部分。[lgraf]

1.4.2 (2019-02-04)

  • 添加选项以抑制filebeat配置的创建。[lgraf]

1.4.1 (2018-01-10)

  • 只有当脚本不是可执行时才将其chmod为可执行。[buchi]

1.4.0 (2017-12-08)

  • 为ftw.structlog和ftw.contentstats日志生成filebeat prospector配置。[lgraf]

  • 在使脚本可执行时尊重当前umask。[buchi]

1.3.0 (2017-09-11)

  • 为ftw.structlog的日志文件生成logrotate配置。[lgraf]

1.2.0 (2016-02-10)

  • bin/packall 在成功时记录到 var/log/pack.log。[jone]

  • 添加选项以在全局目录中创建启动和关机脚本,而不是运行控制脚本。[buchi]

  • 为所有存储创建packall脚本。[buchi]

  • 通过不再删除第一个选项来修复buildout 2.x中处理logrotate选项的问题。[buchi]

1.1.1 (2014-01-21)

  • 如果pid文件缺失,使postrotate命令静默失败。[buchi]

1.1 (2013-03-05)

  • 添加了选项以指定运行控制脚本启动进程的用户。[buchi]

  • 在supervisor运行控制脚本中添加了状态命令。[buchi]

1.0.1 (2012-03-12)

  • 修复了包含空白的logrotate选项的处理。[buchi]

1.0 (2012-03-12)

  • 初始发布。[buchi]

示例用法

首先我们创建一个假的 plone.recipe.zope2instance 脚本,我们可以在我们的测试中使用它。

创建一个配方源目录

>>> mkdir(sample_buildout, 'plone.recipe.zope2instance')

然后创建一个带有假配方的源文件

>>> write(sample_buildout, 'plone.recipe.zope2instance',
...       'zope2instance.py',
... """
... import os, zc.buildout
...
... class Recipe(object):
...
...     def __init__(self, buildout, name, options):
...         self.name, self.options = name, options
...         options['event-log'] = os.path.join(
...                               buildout['buildout']['directory'],
...                               'var', 'log', self.name + '.log'
...                               )
...         options['z2-log'] = os.path.join(
...                               buildout['buildout']['directory'],
...                               'var', 'log', self.name + '-Z2.log'
...                               )
...
...     def install(self):
...         return tuple()
...
...     def update(self):
...         pass
... """)

提供打包信息,以便可以将配方作为develop egg安装

>>> write(sample_buildout, 'plone.recipe.zope2instance', 'setup.py',
... """
... from setuptools import setup
...
... setup(
...     name = "plone.recipe.zope2instance",
...     entry_points = {'zc.buildout': ['default = zope2instance:Recipe']},
...     )
... """)

添加README.txt以避免distutils的讨厌警告

>>> write(sample_buildout, 'plone.recipe.zope2instance', 'README.txt', " ")

我们将从创建一个使用我们的配方的基本buildout开始

>>> write('buildout.cfg',
... """
... [buildout]
... develop = plone.recipe.zope2instance
... parts = instance1 deployment
...
... [instance1]
... recipe = plone.recipe.zope2instance
...
... [deployment]
... recipe = ftw.recipe.deployment
... """)

运行buildout给我们

>>> print system(buildout)
Develop: '/sample-buildout/plone.recipe.zope2instance'
Installing instance1.
Installing deployment.
<BLANKLINE>

现在我们应该有一个文件,其名称与我们的 buildout 目录相同,包含我们的 logrotate 配置

>>> cat(sample_buildout, 'etc', 'logrotate.d', 'sample-buildout')
... #doctest: -NORMALIZE_WHITESPACE
/sample-buildout/var/log/instance1.log
/sample-buildout/var/log/instance1-Z2.log {
    sharedscripts
    postrotate
        /bin/kill -SIGUSR2 `cat /sample-buildout/var/instance1.pid 2>/dev/null` >/dev/null 2>&1 || true
    endscript
}
/sample-buildout/var/log/instance1-json.log {
    copytruncate
    missingok
}

我们还应该有一个用于 instance1 的运行控制脚本

>>> ls(sample_buildout, 'bin')
- buildout
- rc-instance1

>>> cat(sample_buildout, 'bin', 'rc-instance1')
#!/bin/sh
<BLANKLINE>
# chkconfig: 345 90 10
# description: Starts Zope
<BLANKLINE>
START_SCRIPT="/sample-buildout/bin/instance1"
<BLANKLINE>
[ -f $START_SCRIPT ] || exit 1
<BLANKLINE>
# Source function library.
. /etc/init.d/functions
<BLANKLINE>
RETVAL=0
<BLANKLINE>
if [ $(whoami) != "root" ]; then
    echo "You must be root."
    exit 1
fi
<BLANKLINE>
case $1 in
    start|stop)
        su zope -c "$START_SCRIPT $*" </dev/null
        RETVAL=$?
        if [ $RETVAL -eq 0 ]
        then
            echo_success
        else
            echo_failure
        fi
        echo
        ;;
    restart)
        ${0} stop
        sleep 1
        ${0} start
        ;;
    *)
        su zope -c "$START_SCRIPT $*" </dev/null
        ;;
esac

我们还应该有一个用于部署的 filebeat prospectors 配置文件

>>> cat(sample_buildout, 'etc', 'filebeat.d', 'sample-buildout.yml')
... #doctest: -NORMALIZE_WHITESPACE
- type: log
  fields:
    event_type: contentstats
    deployment: sample-buildout
  fields_under_root: true
  json.keys_under_root: true
  json.add_error_key: true
  paths:
    - /sample-buildout/var/log/contentstats-json.log
- type: log
  fields:
    event_type: structlog
    deployment: sample-buildout
  fields_under_root: true
  json.keys_under_root: true
  json.add_error_key: true
  paths:
    - /sample-buildout/var/log/instance1-json.log

除非我们明确禁用 filebeat 配置的创建

>>> write('buildout.cfg',
... """
... [buildout]
... develop = plone.recipe.zope2instance
... parts = instance1 deployment
...
... [instance1]
... recipe = plone.recipe.zope2instance
...
... [deployment]
... recipe = ftw.recipe.deployment
... create-filebeat-config = false
... """)

然后再次运行 buildout

>>> print system(buildout)
Develop: '/sample-buildout/plone.recipe.zope2instance'
Uninstalling deployment.
Updating instance1.
Installing deployment.
<BLANKLINE>

我们的部署不应该有 filebeat 配置

>>> import os
>>> os.path.isfile(os.path.join(sample_buildout, 'etc', 'filebeat.d', 'sample-buildout.yml'))
False

如果我们错误地将重复的 plone.recipe.zope2instance 实例添加到部分中

>>> write('buildout.cfg',
... """
... [buildout]
... develop = plone.recipe.zope2instance
... parts = instance1 instance1 instance1 instance1 instance1 deployment
...
... [instance1]
... recipe = plone.recipe.zope2instance
...
... [deployment]
... recipe = ftw.recipe.deployment
... """)

运行 buildout 将打印一条警告信息

>>> print system(buildout)
Develop: '/sample-buildout/plone.recipe.zope2instance'
ftw.recipe.deployment:
##########################################################
# Duplicate zope parts found!
# ['instance1', 'instance1', 'instance1', 'instance1', 'instance1']
# This could be caused by extending from multiple zeoclients/
# .cfg files instead of just one, and should be avoided.
# To prevent generating invalid logrotate configs, duplicate
# parts will be skipped, but you should still fix this issue.
##########################################################
<BLANKLINE>
Uninstalling deployment.
Updating instance1.
Installing deployment.
<BLANKLINE>

最终我们仍然有一个有效的 logrotate 配置(没有重复的路径)

>>> cat(sample_buildout, 'etc', 'logrotate.d', 'sample-buildout')
... #doctest: -NORMALIZE_WHITESPACE
/sample-buildout/var/log/instance1.log
/sample-buildout/var/log/instance1-Z2.log {
    sharedscripts
    postrotate
        /bin/kill -SIGUSR2 `cat /sample-buildout/var/instance1.pid 2>/dev/null` >/dev/null 2>&1 || true
    endscript
}
/sample-buildout/var/log/instance1-json.log {
    copytruncate
    missingok
}

让我们也添加一个 zeo 部分。因此,我们首先需要一个假的 plone.recipe.zeoserver 脚本

>>> mkdir(sample_buildout, 'plone.recipe.zeoserver')
>>> write(sample_buildout, 'plone.recipe.zeoserver', 'zeoserver.py',
... """
... import os, zc.buildout
...
... class Recipe(object):
...
...     def __init__(self, buildout, name, options):
...         self.name, self.options = name, options
...         options['zeo-log'] = os.path.join(
...                               buildout['buildout']['directory'],
...                               'var', 'log', self.name + '.log'
...                               )
...         self.storage_number = options.get('storage-number', '1')
...         self.blob_storage = options.get('blob-storage', '')
...
...     def install(self):
...         return tuple()
...
...     def update(self):
...         pass
... """)
>>> write(sample_buildout, 'plone.recipe.zeoserver', 'setup.py',
... """
... from setuptools import setup
...
... setup(
...     name = "plone.recipe.zeoserver",
...     entry_points = {'zc.buildout': ['default = zeoserver:Recipe']},
...     )
... """)
>>> write(sample_buildout, 'plone.recipe.zeoserver', 'README.txt', " ")

创建一个包含多个实例部分和 zeo 部分的 buildout

>>> write('buildout.cfg',
... """
... [buildout]
... develop = plone.recipe.zope2instance plone.recipe.zeoserver
... parts = instance1 instance2 zeo deployment
...
... [instance1]
... recipe = plone.recipe.zope2instance
...
... [instance2]
... <= instance1
...
... [zeo]
... recipe = plone.recipe.zeoserver
...
... [deployment]
... recipe = ftw.recipe.deployment
... """)

运行buildout给我们

>>> print system(buildout)
Develop: '/sample-buildout/plone.recipe.zope2instance'
Develop: '/sample-buildout/plone.recipe.zeoserver'
Updating instance1.
Installing instance2.
Installing zeo.
Updating deployment.
<BLANKLINE>

验证 logrotate 配置文件的內容

>>> cat(sample_buildout, 'etc', 'logrotate.d', 'sample-buildout')
/sample-buildout/var/log/instance1.log
/sample-buildout/var/log/instance1-Z2.log {
    sharedscripts
    postrotate
        /bin/kill -SIGUSR2 `cat /sample-buildout/var/instance1.pid 2>/dev/null` >/dev/null 2>&1 || true
    endscript
}
/sample-buildout/var/log/instance2.log
/sample-buildout/var/log/instance2-Z2.log {
    sharedscripts
    postrotate
        /bin/kill -SIGUSR2 `cat /sample-buildout/var/instance2.pid 2>/dev/null` >/dev/null 2>&1 || true
    endscript
}
/sample-buildout/var/log/zeo.log {
    copytruncate
}
/sample-buildout/var/log/instance1-json.log {
    copytruncate
    missingok
}
/sample-buildout/var/log/instance2-json.log {
    copytruncate
    missingok
}

验证 zeo 运行控制脚本

>>> cat(sample_buildout, 'bin', 'rc-zeo')
#!/bin/sh
<BLANKLINE>
# chkconfig: 345 85 15
# description: Starts ZEO server
<BLANKLINE>
START_SCRIPT="/sample-buildout/bin/zeo"
<BLANKLINE>
[ -f $START_SCRIPT ] || exit 1
<BLANKLINE>
# Source function library.
. /etc/init.d/functions
<BLANKLINE>
RETVAL=0
<BLANKLINE>
if [ $(whoami) != "root" ]; then
    echo "You must be root."
    exit 1
fi
<BLANKLINE>
case $1 in
    start|stop)
        su zope -c "$START_SCRIPT $*" </dev/null
        RETVAL=$?
        if [ $RETVAL -eq 0 ]
        then
            echo_success
        else
            echo_failure
        fi
        echo
        ;;
    restart)
        ${0} stop
        sleep 1
        ${0} start
        ;;
    *)
        su zope -c "$START_SCRIPT $*" </dev/null
        ;;
esac

验证实例 2 的运行控制脚本

>>> cat(sample_buildout, 'bin', 'rc-instance2')
#!/bin/sh
<BLANKLINE>
# chkconfig: 345 90 10
# description: Starts Zope
<BLANKLINE>
START_SCRIPT="/sample-buildout/bin/instance2"
<BLANKLINE>
[ -f $START_SCRIPT ] || exit 1
<BLANKLINE>
# Source function library.
. /etc/init.d/functions
<BLANKLINE>
RETVAL=0
<BLANKLINE>
if [ $(whoami) != "root" ]; then
    echo "You must be root."
    exit 1
fi
<BLANKLINE>
case $1 in
    start|stop)
        su zope -c "$START_SCRIPT $*" </dev/null
        RETVAL=$?
        if [ $RETVAL -eq 0 ]
        then
            echo_success
        else
            echo_failure
        fi
        echo
        ;;
    restart)
        ${0} stop
        sleep 1
        ${0} start
        ;;
    *)
        su zope -c "$START_SCRIPT $*" </dev/null
        ;;
esac

我们还应该有一个用于打包所有数据库的 packall 脚本

>>> cat(sample_buildout, 'bin', 'packall')
#!/bin/sh
/sample-buildout/bin/zeopack -S 1 -B /sample-buildout/var/blobstorage \
    && echo `date +%Y-%m-%dT%H:%M:%S%z` "packed Data (blobstorage)" >> /sample-buildout/var/log/pack.log

我们可以指定运行进程时应使用的用户

>>> write('buildout.cfg',
... """
... [buildout]
... develop = plone.recipe.zope2instance plone.recipe.zeoserver
... parts = instance1 instance2 zeo deployment
...
... [instance1]
... recipe = plone.recipe.zope2instance
...
... [instance2]
... <= instance1
...
... [zeo]
... recipe = plone.recipe.zeoserver
...
... [deployment]
... recipe = ftw.recipe.deployment
... rc-user = plone
... """)

运行buildout给我们

>>> print system(buildout)
Develop: '/sample-buildout/plone.recipe.zope2instance'
Develop: '/sample-buildout/plone.recipe.zeoserver'
Uninstalling deployment.
Updating instance1.
Updating instance2.
Updating zeo.
Installing deployment.
<BLANKLINE>

验证实例 1 的运行控制脚本

>>> cat(sample_buildout, 'bin', 'rc-instance1')
#!/bin/sh
<BLANKLINE>
# chkconfig: 345 90 10
# description: Starts Zope
<BLANKLINE>
START_SCRIPT="/sample-buildout/bin/instance1"
<BLANKLINE>
[ -f $START_SCRIPT ] || exit 1
<BLANKLINE>
# Source function library.
. /etc/init.d/functions
<BLANKLINE>
RETVAL=0
<BLANKLINE>
if [ $(whoami) != "root" ]; then
    echo "You must be root."
    exit 1
fi
<BLANKLINE>
case $1 in
    start|stop)
        su plone -c "$START_SCRIPT $*" </dev/null
        RETVAL=$?
        if [ $RETVAL -eq 0 ]
        then
            echo_success
        else
            echo_failure
        fi
        echo
        ;;
    restart)
        ${0} stop
        sleep 1
        ${0} start
        ;;
    *)
        su plone -c "$START_SCRIPT $*" </dev/null
        ;;
esac

在我们可以添加 supervisor 部分之前,我们需要一个假的配方

>>> mkdir(sample_buildout, 'collective.recipe.supervisor')
>>> write(sample_buildout, 'collective.recipe.supervisor', 'supervisor.py',
... """
... import os, zc.buildout
...
... class Recipe(object):
...
...     def __init__(self, buildout, name, options):
...         pass
...
...     def install(self):
...         return tuple()
...
...     def update(self):
...         pass
... """)
>>> write(sample_buildout, 'collective.recipe.supervisor', 'setup.py',
... """
... from setuptools import setup
...
... setup(
...     name = "collective.recipe.supervisor",
...     entry_points = {'zc.buildout': ['default = supervisor:Recipe']},
...     )
... """)
>>> write(sample_buildout, 'collective.recipe.supervisor', 'README.txt',
... " ")

创建一个包含 supervisor 部分的 buildout

>>> write('buildout.cfg',
... """
... [buildout]
... develop =
...     plone.recipe.zope2instance
...     plone.recipe.zeoserver
...     collective.recipe.supervisor
... parts = instance1 instance2 zeo supervisor deployment
...
... [instance1]
... recipe = plone.recipe.zope2instance
...
... [instance2]
... <= instance1
...
... [zeo]
... recipe = plone.recipe.zeoserver
...
... [supervisor]
... recipe = collective.recipe.supervisor
...
... [deployment]
... recipe = ftw.recipe.deployment
... rc-user = plone
... """)

运行buildout给我们

>>> print system(buildout)
Develop: '/sample-buildout/plone.recipe.zope2instance'
Develop: '/sample-buildout/plone.recipe.zeoserver'
Develop: '/sample-buildout/collective.recipe.supervisor'
Updating instance1.
Updating instance2.
Updating zeo.
Installing supervisor.
Updating deployment.
<BLANKLINE>

验证 supervisor 控制脚本

>>> cat(sample_buildout, 'bin', 'rc-supervisor')
#!/bin/sh
<BLANKLINE>
# chkconfig: 345 90 10
# description: Starts supervisor
<BLANKLINE>
SUPERVISORCTL="/sample-buildout/bin/supervisorctl"
SUPERVISORD="/sample-buildout/bin/supervisord"
<BLANKLINE>
[ -f $SUPERVISORD ] || exit 1
[ -f $SUPERVISORCTL ] || exit 1
<BLANKLINE>
# Source function library.
. /etc/init.d/functions
<BLANKLINE>
RETVAL=0
<BLANKLINE>
if [ $(whoami) != "root" ]; then
    echo "You must be root."
    exit 1
fi
<BLANKLINE>
start() {
    echo -n "Starting supervisor: "
    su plone -c "$SUPERVISORD"
    RETVAL=$?
    if [ $RETVAL -eq 0 ]; then
        echo_success
    else
        echo_failure
    fi
    return $RETVAL
}
<BLANKLINE>
stop() {
    echo -n "Stopping supervisor: "
    su plone -c "$SUPERVISORCTL shutdown"
    RETVAL=$?
    if [ $RETVAL -eq 0 ]; then
        echo_success
    else
        echo_failure
    fi
    return $RETVAL
}
<BLANKLINE>
status() {
    su plone -c "$SUPERVISORCTL status"
}
<BLANKLINE>
case "$1" in
    start)
        start
        ;;
<BLANKLINE>
    stop)
        stop
        ;;
<BLANKLINE>
    restart)
        stop
        start
        ;;
<BLANKLINE>
    status)
        status
        ;;
esac
<BLANKLINE>
exit $REVAL

我们可以提供一些额外的 logrotate 选项

>>> write('buildout.cfg',
... """
... [buildout]
... develop =
...     plone.recipe.zope2instance
...     plone.recipe.zeoserver
...     collective.recipe.supervisor
...
... parts = instance1 deployment
...
... [instance1]
... recipe = plone.recipe.zope2instance
...
... [deployment]
... recipe = ftw.recipe.deployment
... logrotate-options =
...     rotate 4
...     weekly
...     missingok
...     notifempty
...     nomail
... """)

运行buildout给我们

>>> print system(buildout)
Develop: '/sample-buildout/plone.recipe.zope2instance'
Develop: '/sample-buildout/plone.recipe.zeoserver'
Develop: '/sample-buildout/collective.recipe.supervisor'
Uninstalling deployment.
Uninstalling supervisor.
Uninstalling zeo.
Uninstalling instance2.
Updating instance1.
Installing deployment.
<BLANKLINE>

验证文件是否包含我们的 logrotate 选项

>>> cat(sample_buildout, 'etc', 'logrotate.d', 'sample-buildout')
... #doctest: -NORMALIZE_WHITESPACE
/sample-buildout/var/log/instance1.log
/sample-buildout/var/log/instance1-Z2.log {
    rotate 4
    weekly
    missingok
    notifempty
    nomail
    sharedscripts
    postrotate
        /bin/kill -SIGUSR2 `cat /sample-buildout/var/instance1.pid 2>/dev/null` >/dev/null 2>&1 || true
    endscript
}
/sample-buildout/var/log/instance1-json.log {
    rotate 4
    weekly
    missingok
    notifempty
    nomail
    copytruncate
}

我们可以提供自定义存储选项

>>> write('buildout.cfg',
... """
... [buildout]
... develop = plone.recipe.zope2instance plone.recipe.zeoserver
... parts = instance1 zeo deployment
...
... [instance1]
... recipe = plone.recipe.zope2instance
...
... [zeo]
... recipe = plone.recipe.zeoserver
... storage-number = main
... blob-storage = blobstorage-main
...
... [deployment]
... recipe = ftw.recipe.deployment
... """)

运行buildout给我们

>>> print system(buildout)
Develop: '/sample-buildout/plone.recipe.zope2instance'
Develop: '/sample-buildout/plone.recipe.zeoserver'
Uninstalling deployment.
Updating instance1.
Installing zeo.
Installing deployment.
<BLANKLINE>

我们的 packall 脚本应包含正确的存储参数

>>> cat(sample_buildout, 'bin', 'packall')
#!/bin/sh
/sample-buildout/bin/zeopack -S main -B /sample-buildout/var/blobstorage-main \
    && echo `date +%Y-%m-%dT%H:%M:%S%z` "packed main (blobstorage-main)" >> /sample-buildout/var/log/pack.log

让我们添加一个 filestorage 部分。因此,我们首先需要一个假的 collective.recipe.filestorage 脚本

>>> mkdir(sample_buildout, 'collective.recipe.filestorage')
>>> write(sample_buildout, 'collective.recipe.filestorage', 'filestorage.py',
... """
... import os, zc.buildout
...
... class Recipe(object):
...
...     def __init__(self, buildout, name, options):
...         self.name, self.options = name, options
...         self.subparts = options.get('parts', '').split()
...
...     def install(self):
...         return tuple()
...
...     def update(self):
...         pass
... """)
>>> write(sample_buildout, 'collective.recipe.filestorage', 'setup.py',
... """
... from setuptools import setup
...
... setup(
...     name = "collective.recipe.filestorage",
...     entry_points = {'zc.buildout': ['default = filestorage:Recipe']},
...     )
... """)
>>> write(sample_buildout, 'collective.recipe.filestorage', 'README.txt', " ")

创建一个包含 filestorage 部分的 buildout

>>> write('buildout.cfg',
... """
... [buildout]
... develop = plone.recipe.zope2instance plone.recipe.zeoserver collective.recipe.filestorage
... parts = instance1 zeo filestorage deployment
...
... [instance1]
... recipe = plone.recipe.zope2instance
...
... [zeo]
... recipe = plone.recipe.zeoserver
...
... [filestorage]
... recipe = collective.recipe.filestorage
... parts = storage1
...
... [deployment]
... recipe = ftw.recipe.deployment
... """)

运行buildout给我们

>>> print system(buildout)
Develop: '/sample-buildout/plone.recipe.zope2instance'
Develop: '/sample-buildout/plone.recipe.zeoserver'
Develop: '/sample-buildout/collective.recipe.filestorage'
Uninstalling zeo.
Updating instance1.
Installing zeo.
Installing filestorage.
Updating deployment.
<BLANKLINE>

我们的 packall 脚本应包含所有存储的打包命令

>>> cat(sample_buildout, 'bin', 'packall')
#!/bin/sh
/sample-buildout/bin/zeopack -S 1 -B /sample-buildout/var/blobstorage  \
    && echo `date +%Y-%m-%dT%H:%M:%S%z` "packed Data (blobstorage)" >> /sample-buildout/var/log/pack.log
/sample-buildout/bin/zeopack -S storage1 \
    && echo `date +%Y-%m-%dT%H:%M:%S%z` "packed storage1" >> /sample-buildout/var/log/pack.log

让我们创建一个包含多个 filestorages 和 blobs 的 buildout

>>> write('buildout.cfg',
... """
... [buildout]
... develop = plone.recipe.zope2instance plone.recipe.zeoserver collective.recipe.filestorage
... parts = instance1 zeo filestorage deployment
...
... [instance1]
... recipe = plone.recipe.zope2instance
...
... [zeo]
... recipe = plone.recipe.zeoserver
...
... [filestorage]
... recipe = collective.recipe.filestorage
... parts = storage1 storage2
... blob-storage = var/blobstorage-%(fs_part_name)s
... zeo-storage = %(fs_part_name)s_storage
...
... [deployment]
... recipe = ftw.recipe.deployment
... """)

运行buildout给我们

>>> print system(buildout)
Develop: '/sample-buildout/plone.recipe.zope2instance'
Develop: '/sample-buildout/plone.recipe.zeoserver'
Develop: '/sample-buildout/collective.recipe.filestorage'
Uninstalling filestorage.
Updating instance1.
Updating zeo.
Installing filestorage.
Updating deployment.
<BLANKLINE>

我们的 packall 脚本应包含所有存储的打包命令

>>> cat(sample_buildout, 'bin', 'packall')
#!/bin/sh
/sample-buildout/bin/zeopack -S 1 -B /sample-buildout/var/blobstorage  \
    && echo `date +%Y-%m-%dT%H:%M:%S%z` "packed Data (blobstorage)" >> /sample-buildout/var/log/pack.log
/sample-buildout/bin/zeopack -S storage1_storage -B /sample-buildout/var/blobstorage-storage1 \
    && echo `date +%Y-%m-%dT%H:%M:%S%z` "packed storage1_storage (blobstorage-storage1)" >> /sample-buildout/var/log/pack.log
/sample-buildout/bin/zeopack -S storage2_storage -B /sample-buildout/var/blobstorage-storage2 \
    && echo `date +%Y-%m-%dT%H:%M:%S%z` "packed storage2_storage (blobstorage-storage2)" >> /sample-buildout/var/log/pack.log

创建一个带有 packall-symlink-directory 选项的 buildout

>>> write('buildout.cfg',
... """
... [buildout]
... develop = plone.recipe.zope2instance plone.recipe.zeoserver collective.recipe.filestorage
... parts = instance1 zeo deployment
...
... [instance1]
... recipe = plone.recipe.zope2instance
...
... [zeo]
... recipe = plone.recipe.zeoserver
...
... [deployment]
... recipe = ftw.recipe.deployment
... packall-symlink-directory = etc/zodbpack.d
... """)

运行buildout给我们

>>> print system(buildout)
Develop: '/sample-buildout/plone.recipe.zope2instance'
Develop: '/sample-buildout/plone.recipe.zeoserver'
Develop: '/sample-buildout/collective.recipe.filestorage'
Uninstalling deployment.
Uninstalling filestorage.
Updating instance1.
Updating zeo.
Installing deployment.
<BLANKLINE>

现在我们应该在指定的目录中有一个符号链接

>>> ls(sample_buildout, 'etc', 'zodbpack.d')
l  sample-buildout

创建一个带有启动/关闭目录选项的 buildout

>>> write('buildout.cfg',
... """
... [buildout]
... develop = plone.recipe.zope2instance plone.recipe.zeoserver collective.recipe.supervisor
... parts = instance1 zeo supervisor deployment
...
... [instance1]
... recipe = plone.recipe.zope2instance
...
... [zeo]
... recipe = plone.recipe.zeoserver
...
... [supervisor]
... recipe = collective.recipe.supervisor
...
... [deployment]
... recipe = ftw.recipe.deployment
... startup-directory = etc/startup.d
... shutdown-directory = etc/shutdown.d
... """)

运行buildout给我们

>>> print system(buildout)
Develop: '/sample-buildout/plone.recipe.zope2instance'
Develop: '/sample-buildout/plone.recipe.zeoserver'
Develop: '/sample-buildout/collective.recipe.supervisor'
Uninstalling deployment.
Updating instance1.
Updating zeo.
Installing supervisor.
Installing deployment.

验证启动脚本

>>> cat(sample_buildout, 'etc', 'startup.d', 'sample-buildout')
#!/bin/sh
/sample-buildout/bin/supervisord

验证关闭脚本

>>> cat(sample_buildout, 'etc', 'shutdown.d', 'sample-buildout')
#!/bin/sh
/sample-buildout/bin/supervisorctl shutdown

项目详细信息


下载文件

下载您平台上的文件。如果您不确定选择哪一个,请了解更多关于 安装包 的信息。

源分布

ftw.recipe.deployment-1.4.3.tar.gz (25.8 kB 查看散列)

上传时间

由以下支持

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