我是 Puppet 的新手,我想知道我是否能够正确地使用 Puppet 部署应用程序。
应用程序位于 tar.gz 文件中,该文件包含一个带有版本号的文件。因此,我执行此操作进行部署(我进入服务器并重新启动客户端以获取新的 tarball):
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"] ],
}
但是,当我想升级时,我不知道该告诉 Puppet 删除旧目录吗?例如,如果我想将版本 56 升级到 57:我必须删除 56 的版本目录。
我听说过 Capristrano,似乎最好使用 Puppet 来管理包、配置文件并使用 Capristrano 来部署应用程序,不是吗?
谢谢。
答案1
我想知道我是否以正确的方式使用 Puppet 部署应用程序。
不,你不是。
您应该使用操作系统上提供的包管理。如果您的软件是tar.gz
格式,您应该在本地将其重新打包为.deb
,.rpm
或其他格式。
如果该软件是本地开发的,则应该使用任何可用的构建/部署工具。
答案2
你可能想尝试使用平均流量来制作 tarball 的 RPM 或 DEB;它使用起来非常简单,而且您不需要了解任何您不想了解的软件包格式。
回答你最初的问题,使用 Puppet 部署应用程序的正确方法是让 Puppet 做尽可能少的工作;exec
下载和提取 tarball 的任何复杂资源都注定会非常非常脆弱,而yum install
从长远来看,将 Puppet 变成一个包会更健康。
答案3
我会尽力将应用程序打包为 RPM 或 .deb 包,并构建 yum 或 apt 存储库来保存这些包。将 tarball 或 zip 文件打包到目录中非常简单(但应该是一个单独的问题)。这种方式提供的打包可以很好地跟踪版本,并处理各种仅打开 tarball 无法处理的问题。
如果我真的无法构建合适的包,我会做这样的事情:
节点.pp:
node 'server1.domain.com' inherits basenode {
apps { apps:
version => 56,
oldversion => 55,
apps_name => "apps_tarball.tgz",
}
init.pp(模块):
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}] ];
}
另一种选择是简单地使用递归木偶资源,如:
file {
"/usr/local/apps/path/":
source => "puppet:///modules/modulename/apps/path",
ensure => directory,
replace => true,
purge => true,
recurse => true;
}
(您已经在 Puppet Master 上正确解压了内容。可能还需要运行该服务的包并通知它正在用完的服务)。
答案4
我当然赞成打包 tarball(RPM 或其他),但有几点提示:
要删除旧版本,只需删除除正在安装的版本之外的所有版本即可。使用足够新的 bash 并启用 extglob,您可以rm -r /usr/local/apps/path/apps-version-!(${version})
。小心清除配置文件等。您可以创建exec
refreshonly => true
,然后notify
从安装执行程序中执行。
您可以使用creates
属性代替unless => 'test -f ...'
.A 但更容易理解。