我是Puppet的初学者,我想知道我是否正确地使用Puppet部署应用程序。
应用程序位于tar.gz文件中,其中包含具有版本号的文件。 所以,我这样做来部署(我去服务器上,并重新启动客户端拿起新的压缩包):
nodes.pp node 'server1.domain.com' inherits basenode { apps { apps: version => 56, apps_name => "apps_tarball.tgz", } init.pp (modules) exec {"apps_wget": command => "/usr/bin/wget http://web_server/${version}-${apps_name} -O /tmp/${container_zip_name}", unless => "test -f /tmp/${version}-${apps_name}", require => [ Package["wget"] ], } exec {"apps_unzip": cwd => "/usr/local/apps/path", command => "/usr/bin/unzip /tmp/${version}-${apps_name}", unless => "test -f /usr/local/apps/path/apps-version-${version}", require => [ Package["unzip"], Exec["container_wget"] ], }
但是,当我想升级的时候,我不知道要说木偶删除旧的目录吗? 例如,如果我想升级版本56到57:我必须删除56的版本目录。
我听说过Capristrano,使用Puppet来pipe理软件包,configuration文件和使用Capristrano部署应用程序似乎更好,不是吗?
谢谢。
我想知道我是否正确地使用Puppet部署应用程序。
不,你不是。
您应该使用操作系统上可用的软件包pipe理。 如果你的软件是tar.gz格式的,你应该把它重新打包成.deb , .rpm或者其他格式。
如果软件是本地开发的东西,那么应该使用可用的构build/部署工具。
您可能想尝试使用fpm来制作tarballs的RPM或DEB; 使用起来非常简单,而且您不必了解任何有关您不想要的软件包格式的信息。
为了回答你原来的问题,用Puppet部署应用程序的正确方法是让Puppet尽可能less地工作。 任何下载和解压缩tar包的复杂exec资源都是非常非常脆弱的,只要yum install一个软件包,长期运行会更健康。
我会尽力将应用程序捆绑为RPM或.deb包,并构build一个yum或apt存储库来存放包。 打包到一个目录中的压缩包或压缩包的打包非常容易(但应该是一个单独的问题)。 可用的包装很好地跟踪版本,并处理各种事情,只是打开一个tarball将无法处理好。
如果我真的不能build立一个合适的包,我会做这样的事情:
node 'server1.domain.com' inherits basenode { apps { apps: version => 56, oldversion => 55, apps_name => "apps_tarball.tgz", }
file { [ "/usr/local/apps/path/apps-version-${oldversion}", "/tmp/${oldversion}-${apps_name}" ]: recurse => true, ensure => absent; } exec { "apps_wget_${apps_name}": command => "/usr/bin/wget http://web_server/${version}-${apps_name} -O /tmp/${container_zip_name}", logoutput => on_failure, creates => "/tmp/${version}-${apps_name}", require => [ Package["wget"] ]; "apps_unzip_${apps_name}": cwd => "/usr/local/apps/path", command => "/usr/bin/unzip /tmp/${version}-${apps_name}", creates => "/usr/local/apps/path/apps-version-${version}", require => [ Package["unzip"], Exec["container_wget"], Exec["apps_wget_${apps_name}] ]; }
另一种select是简单地使用recursionpuppet资源,如:
file { "/usr/local/apps/path/": source => "puppet:///modules/modulename/apps/path", ensure => directory, replace => true, purge => true, recurse => true; }
(你已经在木偶大师身上解开了正确的东西,可能还需要任何包裹运行服务,并通知任何服务没有了)。
file { "/usr/local/apps/path/apps-version-${old-version}": ensure => absent }
顺便说一句,做任何事情都是丑陋的,当事情破裂的时候很难排除故障; 如果可以的话,也许保留在puppet服务器上的应用程序文件的提取版本,并使用recursion的file资源来检索?
我当然更喜欢打包压缩包(RPM或其他),但有一些提示:
要删除旧版本,只需删除所有版本,而不是正在安装的版本。 使用最近足够的bash和extglob启用你可以rm -r /usr/local/apps/path/apps-version-!(${version}) 。 小心擦除configuration文件等。 您可以使exec refreshonly => true ,然后从安装exec中notify它。
您可以使用creates属性,而不是使用unless => 'test -f ...' 。 但更容易理解。