![Puppet 使用嵌套哈希和数组](https://linux22.com/image/649886/Puppet%20%E4%BD%BF%E7%94%A8%E5%B5%8C%E5%A5%97%E5%93%88%E5%B8%8C%E5%92%8C%E6%95%B0%E7%BB%84.png)
我想要检出几个 SVN 项目并且我需要能够为每个分支或主干选择目录名称。
现在我想检出文件夹 service_dir 中名为 svn_name 的 SVN 项目,并在该文件夹中创建一个 trunk 文件夹和一个包含所有分支的 branch 文件夹。
---SVN文件夹
--------分支
--------------- 分支 1 名称
--------------- 分支 2_名称
------- 中继名称
我的哈希具有以下结构
$hash = {
'svn_name' => {
service_dir => 'directory_name',
branch => [ { branch => '0.1', branch_dir => 'branch1_name'},
{ branch => '0.2', branch_dir => 'branch2_name'} ],
trunk => { service_dir => 'trunk_name'},
}
}
现在我使用带有哈希和我定义的类型的 create_resources 来创建必要的文件夹并检出工作副本。
问题是我无法遍历我的分支数组,我不知道如何访问哈希内的值。
define test (
$service_dir,
$branch,
$trunk
){
file { "/xxx/${service_dir}/branches/${branch[branch_dir]}":
ensure => present
}
}
我如何访问变量?或者有更简单的方法来实现这一点?我不想使用 vcsrepo 或类似的模块,因为我对 Puppet 还不熟悉,需要练习。
编辑 1:我可能不需要 trunk 的哈希,对吧? trunk => 'trunk_name' 应该足够了
答案1
为了帮助你更快地实现目标,我强烈建议使用回购PuppetLabs 提供的类型github或者木偶锻造。这包含大多数常见的 VCS 工具,包括 subversion。只是为了防止您重新发明轮子。
关于你的木偶语法问题,我改编了手动的稍微适合你的问题:
$foo = "key"
$myhash = [ { key => "some value 0",
other_key => "some other value 0" },
{ key => "some value 1",
other_key => "some other value 1" } ]
notice( $myhash[0][$foo] )
notice( $myhash[1][$foo] )
测试:
% puppet apply foo.pp
Notice: Scope(Class[main]): some value 0
Notice: Scope(Class[main]): some value 1
Notice: Finished catalog run in 0.08 seconds
答案2
您可以使用 each 函数(我认为它是在 puppet 4.6 中实现的)来遍历哈希和数组来定义资源。
$hash = {
'svn_name' => {
service_dir => 'directory_name',
branch => [
{ branch => '0.1', branch_dir => 'branch1_name'},
{ branch => '0.2', branch_dir => 'branch2_name'} ],
trunk => { service_dir => 'trunk_name'},
}
}
$hash['svn_name']['branch'].each | $branch | {
notify { "TestNotify ${branch[branch]}\\${branch[branch_dir]}" : }
}
我只展示了执行一个“each”函数,但是你在每个函数内部执行了一个each函数,但这对你的场景来说没有意义。