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


11

我是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用于managinig程序包,配置文件和使用Capristrano来部署应用程序,不是吗?

谢谢。


我使用forge.puppetlabs.com模块来管理下载/解压缩/放置只能作为tarball使用的东西。效果很好。
jrjohnson 2014年

Answers:


0

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

不,你不是。

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

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


10
在一个理想的世界中,管理员将花时间从tarball创建软件包。在现实世界中,我的经验表明这不会发生。我们的客户从tar包安装了许​​多应用程序,有时是非常大的应用程序,无意更改此设置。
EmmEff

4
@EmmEff完美世界与现实世界之间没有区别。这与“我们固守旧方法,不准备进行自动配置管理”和配置管理工作的地方之间是有区别的。我看到了两者-甚至看到后者随着管理员的变化而变成了前者。
Daniel C. Sobral 2015年

5
您有权提出自己的意见。我在现实世界中的观察结果与此不同。
EmmEff

13

您可能想尝试使用fpm来制作压缩包的RPM或DEB。它真的很简单,而且您不需要了解关于软件包格式的任何信息。

为了回答您的原始问题,使用Puppet部署应用程序的正确方法是使Puppet尽可能少地工作。任何exec下载和解压缩tarball的复杂资源都将非常非常脆弱,而将Puppet yum install打包成一个软件包从长远来看更健康。


我知道我在做什么很错。但是rpm的建立总是让我害怕。fpm是我的救恩。谢谢Handyman5。是的。
8None1年

很棒的评论。您没有讲“使用rpm”,而是提供了一个简单的“使用伪造的rpm并使用此简单工具来实现”。
安德烈·德·米兰达

6

我会非常努力地将应用程序打包为RPM或.deb软件包,并构建一个yum或apt存储库来容纳这些软件包。将您刚刚打开的tarball或zip打包到目录中非常容易(但应该是一个单独的问题)。可用的包装方式可以很好地跟踪版本,并可以处理打开tarball不能很好处理的各种事情。

如果我真的无法构建合适的程序包,则可以执行以下操作:

nodes.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上正确解开了东西。可能还需要运行该服务的任何程序包,并通知其服务即将耗尽的任何服务)。


0
file { "/usr/local/apps/path/apps-version-${old-version}":
    ensure => absent
}

顺便说一句,以高管人员的身份做事很丑陋,当事情开始破裂时可能很难进行故障排除。如果可以,也许将应用程序文件的提取版本保留在人偶服务器上,并使用递归file资源进行检索?


0

我当然喜欢打包tarball(RPM或其他东西),但有一些提示:

要删除旧版本,您可以简单地删除除您要安装的版本以外的所有版本。使用最新的bash和extglob可以启用rm -r /usr/local/apps/path/apps-version-!(${version})。当心清除配置文件等。您可以先从安装执行程序制作exec refreshonly => true,然后再进行制作notify

您可以使用creates属性代替unless => 'test -f ...'。一个但更容易理解的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.