我试图为我的Web应用程序实现一个基于Puppet的部署系统。
该应用程序包含几个服务(几个Web服务器:基于Django和Tornado的以及基于Celery的工作者)。 他们住在不同的git仓库,在github上托pipe。
我已经使用厨师为我以前的项目。 在厨师的情况下,部署这样的事情会很容易:我只是使用git资源为这个特定的节点检出必要的代码,并设置其他的东西。
但是,我不明白它是如何在Puppet中完成的。 我没有在文档中findgittypes。 我尝试过使用谷歌search,但从我发现似乎检查和更新从木偶git代码是不是一个平常的任务。
显然,我假设的工作stream对于Puppet来说有点不寻常。 我可以尝试别的。 使用Puppet部署这些应用程序的自然方式是什么?
我会使用结构来部署Python代码 – 事实上,我是这样做的。 但是,如果你想要的只是git的东西,下面是使用vcsrepo模块的木偶configuration示例:
vcsrepo { '/var/www/gitorious': ensure => present, owner => 'git', source => 'git://gitorious.org/gitorious/mainline.git', revision => 'v2.2.1', provider => git, }
一般来说,当你想在一个紧凑的时间框架内完成工作时,Puppet并不是一个好工具。 傀儡解决这些任务是MCollective ,我已经使用和不喜欢。
确实在Puppet中没有原生的git资源types,但我不会把它称为“不寻常的任务”。
有各种各样的解决scheme用于实现这个你自己使用define 。 我们正在使用一个git类来定义一个像这样的git::repository资源types:
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', } }
每次Puppet运行时,它都会执行git pull操作,除非将pull设置为false 。
请注意,我没有对这个解决scheme的正确性或健壮性提出任何要求。 这是我们正在使用的,它适用于我们,但可能有更多function丰富的解决scheme。
你可以在这里find我们的代码。
快速和肮脏的方式是使用exec:
exec { 'install abcd': path => ['/bin', '/usr/bin'], cwd => '/usr/local', command => 'git clone http:/.../abcd', creates => '/usr/local/abcd', }
创build自己的git资源也不难:
define git ($package, $source) { exec {...} }
不过,我认为干净的方法是将所有正在使用的软件打包到软件包(deb或yum或任何操作系统使用的软件)中,然后将其上传到Puppet master。 然后,当一个服务器正在安装,它会find所需的东西,而不是需要连接到各种git仓库(和pip仓库和mercurial仓库,因为如果你开始做这个git的技巧,我也会这么做)。 然后,安装将会更可靠(git / pip / hg连接之一可能暂时closures,或者可能已经移动),并且使用更less的带宽,特别是在许多服务器上安装软件时。 如果您没有时间去创build软件包,那么创build.tar.gz软件包是一个中间解决scheme。 当然这也需要时间,我知道; 当我匆匆忙忙的时候,我也会用这种快捷方式。