这就是我所使用的:
vcsrepo { "$base_dir":
ensure => latest,
provider => git,
source => 'ssh://git@example.com:7999/EXAMPLE/example.git',
require => File["$base_dir"],
revision => $branch,
}
当我应用puppet清单时,这会导致一个错误:
Error: Could not create repository (non-repository at path)
Error: /Stage[main]/MyServer::Server/Vcsrepo[/usr/service/myserver]/ensure: change from absent to latest failed: Could not create repository (non-repository at path)
当我这样做:
git clone ssh://git@example.com:7999/EXAMPLE/example.git
它起作用了。
有什么想法吗?
5条答案
按热度按时间50pmv0ei1#
你可能不想使用强制手段,因为这会导致git repo在每次应用manifest时被删除和克隆,或者只是删除一个包含不相关文件的目录,而这些文件可能是不可替换的!相反,我建议你看看git提供程序的源代码,在那里你可以清楚地看到正在做什么来确定repo是否存在。具体来说,
working_copy_exists?
方法。在我的例子中,失败的原因是我和您一样指定了
ssh://
url-但是现有的存储库已经被克隆了这意味着当working_copy_exists?
方法检查repo中的.git/config
以查找具有ssh://
的地址时,它找不到它!这会导致vcsrepo假设目录内容是不相关的,并且会自动失败。URL检查只是该方法中的几个检查之一,所以如果这不是它不能正确识别工作副本的原因,那么它可能是其他检查之一。
5jdjgkvh2#
如果目标目录以非空的形式存在,请为克隆存储库添加force选项。
来源:vcsrepo: git clone doesn't work if destination path already exists.
quhf5bfb3#
基于此讨论https://groups.google.com/d/msg/puppet-users/ke5Nk1qwGGs/37dFA3tr5rIJ以及个人经验,
vcsrepo要创建目录。
因此,如果$base_dir是/tmp/foo/bar/baz,则应该只存在/tmp/foo/bar目录。
另外,要使ssh正常工作(https://github.com/puppetlabs/puppetlabs-vcsrepo/blob/master/README.GIT.markdown#for-sources-that-use-ssh-eg-usernameserver),您必须向vcsrepo添加一个用户属性,以便它获取正确的ssh密钥(这很麻烦,因为它还假定您希望该用户拥有新克隆的repo)。
umuewwlo4#
我认为参数"safe_directory =〉true"是您的朋友。
我在hiera中做了这个,然后,如果目录存在,puppet做一个git pull。
未放入"safe_directory"时出错:真的"。(我在hiera)
我得到了错误:
然后我把参数"safe_directory:真"
对git repository的新更改一切正常
因为模块在/root/. gitconfig中添加了下一个指令:
如果我再次执行,模块不会执行任何东西,因为我的git仓库中没有任何更改。
希望这能有所帮助
gj3fmq9x5#
你不需要完整的
ssh://
路径来结账,这个模块会帮你处理的。这是从their examples中提取的:
你的看起来像: