我有一个基于 Linux 的 Web 基础设施,它由 15 个虚拟机和 50 多种服务组成。它完全由 Chef 控制。大多数服务都是在内部开发的。
基本上,当前的部署过程是由 shell 脚本触发的。构建系统(Python 和 shell 脚本的混合)将服务打包为.deb
文件并将这些包放入存储库中。它apt-get update
在所有 15 个节点上运行,因为标准的 Chef apt
cookbookapt-get
每天只运行一次,我们绝对不希望apt-get update
在每次chef-client
唤醒时无条件运行。构建系统chef-client
最终在所有 15 个节点上重新启动守护进程(我们需要这一步,因为 pull Chef 性质)。
目前的流程有许多我们想要解决的缺点。首先,它是异步的,因为部署脚本在重启后不检查chef-client
日志,所以我们甚至不知道部署是否成功。它甚至不等待 Chef 客户端完成循环。其次,我们绝对不想chef-client
在所有节点上强制重启,因为我们通常只部署少量的包。第三,我不太确定chef-client
用于部署是否合法,可能我们从一开始就做错了。请分享您的想法/经验。
我认为您不需要重新启动客户端 - 'chef-client --once' 就足够了。另外,如果我是你,我将制作一个数据包,其中标记了需要部署的包,并使 apt-get 运行基于该包的数据。
就成功/失败报告而言,您需要的是一个Chef 处理程序,它将成功/失败报告回某个聚合中心点。