É 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 .