Puppet 使用嵌套哈希和数组

Puppet 使用嵌套哈希和数组

我想要检出几个 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函数,但这对你的场景来说没有意义。

相关内容