用于Plone部署的zc.buildout配方,配置各种Unix系统服务。
项目描述
简介
此配方提供在buildout中部署Plone/Zope2时配置各种Unix服务的支持。
目前提供以下功能:
为所有Zope 2实例和ZEO部分以及ftw.structlog日志文件创建Logrotate配置。
创建类似RedHat的运行控制脚本。
创建打包所有存储的packall脚本。
为ftw.structlog和ftw.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.zeoserver 或 plone.recipe.zope2zeoserver 配方的部分。
- packall-symlink-directory
在给定的目录中创建对packall脚本的符号链接。可用于自动化多个部署的打包。
- create-filebeat-config
布尔值指示是否应为此部署创建filebeat配置。默认为true。设置为 false 以抑制filebeat配置的创建。
链接
问题: https://github.com/4teamwork/ftw.recipe.deployment/issues
持续集成: https://jenkins.4teamwork.ch/search?q=ftw.recipe.deployment
版权
本软件包由 4teamwork 拥有版权。
ftw.recipe.deployment 在GNU通用公共许可证,版本2下授权。
变更日志
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 的散列
| 算法 | 散列摘要 | |
|---|---|---|
| SHA256 | aedb81d58ab9c08717bbffc01fe4b7aedb0a1db9168862e827ca184ff372f464 |
|
| MD5 | 5e4a48e2177aab70f25ee420632ddfe9 |
|
| BLAKE2b-256 | 387f251461864d6acb8fb17feae690e1723995534eaff0b6e199ec0dd32c0169 |