使用 Puppet 部署 Python 代码

使用 Puppet 部署 Python 代码

我正在尝试基于 Puppet 为我的 Web 应用程序实现部署系统。

该应用程序由几项服务组成(几个 Web 服务器:基于 Django 和 Tornado 以及基于 Celery 的工作程序)。它们位于不同的git存储库中,托管在 GitHub 上。

我之前的项目都用过 Chef。如果用 Chef,部署起来会很简单:我只需要使用git资源签出这个特定节点所需的代码,然后设置好其他一切。

但是,我不明白在 Puppet 中如何做到这一点。我git在文档中没有找到类型。我尝试过谷歌搜索,但从我发现的情况来看,从 Puppet 中签出和更新git代码似乎不是一项常见的任务。

显然,我假设的工作流程对于 Puppet 来说有些不寻常。我可以尝试其他方法。使用 Puppet 部署此类应用程序的自然方法是什么?

答案1

我会用织物部署 Python 代码——事实上,我确实这么做了。但如果你想要的只是 git 内容,这里有一个来自我的 puppet 配置的示例,使用vcsrepo 模块

vcsrepo { '/var/www/gitorious':
    ensure   => present,
    owner    => 'git',
    source   => 'git://gitorious.org/gitorious/mainline.git',
    revision => 'v2.2.1',
    provider => git,
}   

一般来说,当你想在紧迫的时间内完成任务时,Puppet 不是一个好工具。Puppetlabs 对这些任务的解决方案是集体,我用过但不喜欢。

答案2

确实,gitPuppet 中没有原生的资源类型,但我不会称之为“不寻常的任务”。

有多种解决方案可以自己使用来实现这一点define。我们使用一个git定义git::repository资源类型的类,如下所示:

class git {
  define repository (
    $url,
    $workdir=undef,
    $branch=undef,
    $recursive=undef,
    $pull=true
  ) {
    if $workdir {
      $r_workdir = $workdir
    } else {
      $r_workdir = $name
    }

    if $branch {
      $branch_arg = "--branch $branch"
    }

    if $recursive {
      $recursive_arg = '--recursive'
    }

    exec { "clone-gitrepo-$name":
      creates => "$r_workdir",
      command => "/usr/bin/git clone $branch_arg $recursive_arg $url $r_workdir",
    }

    # This is here so other things can depend on
    # File[/path/to/working/directory].
    file { $r_workdir:
      ensure  => directory,
      require => Exec["clone-gitrepo-$name"],
    }

    if $pull {
      exec { "update-gitrepo-$name":
        require => Exec["clone-gitrepo-$name"],
        cwd     => "$r_workdir",
        command => '/usr/bin/git pull',
      }
    }
  }
}

例如,我们可以像这样使用它:

class openstack::controller::novnc {
  include git

  git::repository { '/opt/noVNC':
    url => 'git://github.com/cloudbuilders/noVNC.git',
  }
}

git pull它在每次 Puppet 运行时执行一个操作,除非您设置pullfalse

请注意,我没有对该解决方案的正确性或稳健性做出任何声明;它是我们正在使用的并且对我们有用,但可能还有更多功能齐全的解决方案。

您可以在线找到我们的代码这里

答案3

快捷而简单的方法是使用 exec:

exec { 'install abcd':
  path    => ['/bin', '/usr/bin'],
  cwd     => '/usr/local',
  command => 'git clone http:/.../abcd',
  creates => '/usr/local/abcd',
}

创建自己的 git 资源也不难,基于以下内容:

define git ($package, $source) {
  exec {...}
}

但是,我认为最简洁的方法是将您使用的所有软件打包成包(deb 或 yum 或您的操作系统使用的任何包),然后将其上传到 Puppet Master。然后,在安装服务器时,它会在 Puppet Master 上找到所需的一切,而不需要连接到各种 git 存储库(以及 pip 存储库和 mercurial 存储库,因为如果您开始对 git 使用此技巧,您也会对 pip 这样做)。然后,安装将更加可靠(git/pip/hg 连接之一可能暂时关闭,或者它可能已移动),并且将使用更少的带宽,特别是如果您在许多服务器上安装软件。如果您没有多余的时间来创建包,创建 .tar.gz 包是一种折中解决方案。当然,我知道这也需要时间;当我着急时,我也会使用快速而粗糙的方法。

答案4

要在生产环境中部署 Python 代码,您应该强烈考虑使用虚拟环境

如果你通过 Puppet 进行部署,你应该查看python-puppet模块。它允许您协调生产 Python 环境中所需的一切,包括虚拟环境。

相关内容