如何使用 Puppet 部署应用程序(.tar.gz 格式)?

如何使用 Puppet 部署应用程序(.tar.gz 格式)?

我是 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 但更容易理解。

相关内容