implementando código Python com o Puppet

6

Estou tentando implementar um sistema de implantação para meu aplicativo da web, com base no Puppet.

O aplicativo consiste em vários serviços (alguns servidores da Web: baseados no Django e no Tornado e um funcionário baseado no Celery). Eles vivem em diferentes repositórios git , hospedados no github.

Eu usei o Chef para meus projetos anteriores. No caso do Chef, a implementação de tal coisa seria fácil: eu usaria apenas o recurso git para verificar o código necessário para esse nó em particular e definir tudo mais.

No entanto, não entendo como isso é feito no Puppet. Eu não encontrei um tipo git na documentação. Eu tentei pesquisá-lo, mas pelo que descobri parece que fazer check-out e atualizar o código git do Puppet não é uma tarefa comum.

Claramente, meu fluxo de trabalho assumido é um tanto incomum para o Puppet. Eu poderia tentar outra coisa. Qual é a maneira natural de implantar esses aplicativos com o Puppet?

    
por valya 25.05.2012 / 14:57

4 respostas

1

Eu usaria fabric para implantar o código Python - na verdade, eu uso. Mas se tudo o que você quer é o material do git, aqui está um exemplo das minhas configurações de fantoches usando o módulo vcsrepo :

vcsrepo { '/var/www/gitorious':
    ensure   => present,
    owner    => 'git',
    source   => 'git://gitorious.org/gitorious/mainline.git',
    revision => 'v2.2.1',
    provider => git,
}   
De um modo geral, Puppet não é uma boa ferramenta quando você quer que as coisas sejam feitas em um prazo apertado. A solução da Puppetlabs para essas tarefas é MCollective , que eu usei e não gostei.

    
por 25.05.2012 / 19:59
3

É verdade que não existe um tipo de recurso nativo git no Puppet, mas eu não chamaria isso de "tarefa incomum".

Há uma variedade de soluções para implementar você mesmo usando define . Estamos usando uma classe git que define um tipo de recurso git::repository da seguinte forma:

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',
      }
    }
  }
}

Nós o usamos, por exemplo, assim:

class openstack::controller::novnc {
  include git

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

Executa uma operação git pull toda vez que o Puppet é executado, a menos que você defina pull para false .

Note que não estou fazendo nenhuma reivindicação quanto à correção ou robustez desta solução; é o que estamos usando e funciona para nós, mas pode haver soluções mais completas por aí.

Você pode encontrar nosso código on-line aqui .

    
por 25.05.2012 / 15:28
2

A maneira rápida e suja é usar exec:

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

Também não é difícil criar seu próprio recurso git, com base nisso:

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

No entanto, acho que a maneira mais limpa é empacotar todos os softwares que você está usando em pacotes (deb ou yum ou qualquer que seja o sistema operacional que você usa), e enviá-lo para o mestre Puppet. Então, quando um servidor estiver sendo instalado, ele encontrará tudo o que precisa no mestre do Puppet, em vez de precisar se conectar a vários repositórios git (e repositórios de pip e repositórios mercurial, já que se você começar a fazer esse truque para git, você Vou fazer isso por pip também). Em seguida, a instalação será muito mais confiável (uma das conexões git / pip / hg pode estar temporariamente inativa ou pode ter sido movida) e usará menos largura de banda, especialmente se você estiver instalando o software em muitos servidores. Se você não tem tempo de sobra para criar pacotes, criar pacotes .tar.gz é uma solução intermediária. Claro que isso também leva tempo, eu sei; Eu também uso a maneira rápida e suja quando estou com pressa.

    
por 25.05.2012 / 15:31
0

Para implantar código Python em um ambiente de produção, você deve considerar virtualenv .

Se você estiver implantando via Puppet, deve procurar no módulo python-puppet . Ele permite orquestrar tudo o que você precisa em um ambiente Python de produção, incluindo virtualenvs.

    
por 29.11.2017 / 07:35