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

Ric*_*chy 11 deployment puppet

我是 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"] ],
    }
Run Code Online (Sandbox Code Playgroud)

但是,当我要升级时,我不知道说Puppet删除旧目录?例如,如果我想将版本 56 升级到 57:我必须删除 56 的版本目录。

我听说过 Capristrano,使用 Puppet 来管理包、配置文件和使用 Capristrano 部署应用程序似乎更好,不是吗?

谢谢。

Han*_*an5 13

您可能想尝试使用fpm来制作 tarball 的 RPM 或 DEB;它使用起来非常简单,您无需了解有关您不想要的包格式的任何信息。

为了回答你最初的问题,使用 Puppet 部署应用程序的正确方法是让 Puppet 做尽可能少的工作;任何exec下载和提取 tarball 的复杂资源都必然非常非常脆弱,从yum install长远来看,让 Puppet 只是一个包更健康。


fre*_*eit 6

我会非常努力地将应用程序捆绑为 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",
    }
Run Code Online (Sandbox Code Playgroud)

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}] ];
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是简单地使用递归木偶资源,如:

file {
    "/usr/local/apps/path/":
      source => "puppet:///modules/modulename/apps/path",
      ensure => directory,
      replace => true,
      purge   => true,
      recurse => true;
}
Run Code Online (Sandbox Code Playgroud)

(您已经在 puppet master 上正确解压了东西。可能还需要任何正在运行该服务的包并通知它正在运行的任何服务)。


Dan*_*ral 0

我想知道我是否采用正确的方式使用 Puppet 部署应用程序。

不,你不是。

您应该使用操作系统上可用的包管理。如果您的软件是tar.gz格式化的,您应该在本地将其重新打包为.deb.rpm或其他形式。

如果该软件是本地开发的,您应该使用任何可用的构建/部署工具。

  • 在完美的世界中,管理员会花时间从 tarball 创建包。在现实世界中,我的经验表明这种情况不会发生。我们的客户从 tarball 安装许多应用程序,有时甚至是非常大的应用程序,并且无意更改这一点。 (11认同)
  • @EmmEff 这不是完美世界和现实世界之间的区别。这是“我们坚持旧的方式,还没有准备好自动配置管理”的地方和配置管理确实起作用的地方之间的区别。我见过这两种情况——甚至还看到随着管理员的更迭,后者变成了前者。 (5认同)
  • 您有权发表自己的意见。我对现实世界的观察与此不同。 (5认同)