我正在尝试基于 Puppet 为我的 Web 应用程序实现部署系统。
该应用程序由几项服务组成(几个 Web 服务器:基于 Django 和 Tornado 以及基于 Celery 的工作程序)。它们位于不同的git
存储库中,托管在 GitHub 上。
我之前的项目都用过 Chef。如果用 Chef,部署起来会很简单:我只需要使用git
资源签出这个特定节点所需的代码,然后设置好其他一切。
但是,我不明白在 Puppet 中如何做到这一点。我git
在文档中没有找到类型。我尝试过谷歌搜索,但从我发现的情况来看,从 Puppet 中签出和更新git
代码似乎不是一项常见的任务。
显然,我假设的工作流程对于 Puppet 来说有些不寻常。我可以尝试其他方法。使用 Puppet 部署此类应用程序的自然方法是什么?
答案1
我会用织物部署 Python 代码——事实上,我确实这么做了。但如果你想要的只是 git 内容,这里有一个来自我的 puppet 配置的示例,使用vcsrepo 模块:
vcsrepo { '/var/www/gitorious':
ensure => present,
owner => 'git',
source => 'git://gitorious.org/gitorious/mainline.git',
revision => 'v2.2.1',
provider => git,
}
一般来说,当你想在紧迫的时间内完成任务时,Puppet 不是一个好工具。Puppetlabs 对这些任务的解决方案是集体,我用过但不喜欢。
答案2
确实,git
Puppet 中没有原生的资源类型,但我不会称之为“不寻常的任务”。
有多种解决方案可以自己使用来实现这一点define
。我们使用一个git
定义git::repository
资源类型的类,如下所示:
class git {
define repository (
$url,
$workdir=undef,
$branch=undef,
$recursive=undef,
$pull=true
) {
if $workdir {
$r_workdir = $workdir
} else {
$r_workdir = $name
}
if $branch {
$branch_arg = "--branch $branch"
}
if $recursive {
$recursive_arg = '--recursive'
}
exec { "clone-gitrepo-$name":
creates => "$r_workdir",
command => "/usr/bin/git clone $branch_arg $recursive_arg $url $r_workdir",
}
# This is here so other things can depend on
# File[/path/to/working/directory].
file { $r_workdir:
ensure => directory,
require => Exec["clone-gitrepo-$name"],
}
if $pull {
exec { "update-gitrepo-$name":
require => Exec["clone-gitrepo-$name"],
cwd => "$r_workdir",
command => '/usr/bin/git pull',
}
}
}
}
例如,我们可以像这样使用它:
class openstack::controller::novnc {
include git
git::repository { '/opt/noVNC':
url => 'git://github.com/cloudbuilders/noVNC.git',
}
}
git pull
它在每次 Puppet 运行时执行一个操作,除非您设置pull
为false
。
请注意,我没有对该解决方案的正确性或稳健性做出任何声明;它是我们正在使用的并且对我们有用,但可能还有更多功能齐全的解决方案。
您可以在线找到我们的代码这里。
答案3
快捷而简单的方法是使用 exec:
exec { 'install abcd':
path => ['/bin', '/usr/bin'],
cwd => '/usr/local',
command => 'git clone http:/.../abcd',
creates => '/usr/local/abcd',
}
创建自己的 git 资源也不难,基于以下内容:
define git ($package, $source) {
exec {...}
}
但是,我认为最简洁的方法是将您使用的所有软件打包成包(deb 或 yum 或您的操作系统使用的任何包),然后将其上传到 Puppet Master。然后,在安装服务器时,它会在 Puppet Master 上找到所需的一切,而不需要连接到各种 git 存储库(以及 pip 存储库和 mercurial 存储库,因为如果您开始对 git 使用此技巧,您也会对 pip 这样做)。然后,安装将更加可靠(git/pip/hg 连接之一可能暂时关闭,或者它可能已移动),并且将使用更少的带宽,特别是如果您在许多服务器上安装软件。如果您没有多余的时间来创建包,创建 .tar.gz 包是一种折中解决方案。当然,我知道这也需要时间;当我着急时,我也会使用快速而粗糙的方法。
答案4
要在生产环境中部署 Python 代码,您应该强烈考虑使用虚拟环境。
如果你通过 Puppet 进行部署,你应该查看python-puppet模块。它允许您协调生产 Python 环境中所需的一切,包括虚拟环境。