用于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 |