Puppet递归目录创建

4
我正在尝试递归创建具有相同结构的目录: 我有以下目录: /some-1 /some-2 /some-3 /some-4 在它们的每个目录中,我想创建相同的结构,称之为pool: /some-1/pool /some-2/pool /some-3/pool /some-4/pool 正如Albert建议的那样,一种优雅的解决方案可以通过puppet的“define”方法实现。
define create_pool {
file { "/some-$title/pool":
    ensure => "directory",
    recurse => "true",
 }
}   

create_pool { [1,2,3,4]: }

幸运的是,这个解决方案正在“循环”遍历列表:


1
我发现你必须显式地创建每个图层,我猜这是设计师原则问题。但我很想了解其他情况。 - slim
https://dev59.com/GWw15IYBdhLWcg3wxuvL 展示了解决方案,但我认为可以找到一种方法来迭代 $i。 - DrFalk3n
3个回答

4
您可以先手动创建需要的目录数组,或者:
$directories = split('/some/path/to/somewhere', '/')

然后在循环中创建它们:

each($directories) |$directory| {
  if ! defined (File[$directory]) {
    file { $directory: ensure => directory }
  }
}

我使用if not defined来确保不同的模块/类之间重复使用路径的冲突问题。

编辑: 您可能需要在puppet.conf中添加parser=future才能使循环工作。


2
define create_pool {
  file { "/some-$title":
    ensure => "directory"
  }
  file { "/some-$title/pool":
    ensure => "directory"
  }
}

create_pool { ["a", "b", "c", "d"]: }

一个定义自动循环遍历其“参数” :)

如上所述,传递这样的列表是行不通的,因为会创建错误的树:Create_pool[3]/File[/some-1234/pool]/ensure: change from absent to directory failed: Cannot create /some-1234/pool; parent directory /some-1234 does not exists。我需要的是/some-1/pool、/some-2/pool、/some-3/pool、/some-4/pool。 - DrFalk3n
这是对示例代码的一个简单而明显的更改..只需首先添加父目录的创建..在同一定义中..问题是循环,而不是文件或目录的创建..或者我错过了什么?无论如何,我已编辑以先创建父目录,谢谢。 - drAlberT
毫无疑问,你的解决方案非常优雅(;)像往常一样),但是你有时间尝试吗?我将编辑问题,包括你的提议,不幸的是它也没有“循环”。它试图创建的是类似于/some-1234/pool而不仅仅是4个不同的目录。这就是问题存在的原因,确实不太明显,我怀疑这个任务有点超出了Puppet的范围/哲学。 - DrFalk3n
1
我现在没有试验的方法,但它应该可行..你确定问题不是数字的使用吗?尝试使用4个字符串创建池 { ["one", "two", "three", "four"]: }顺便说一下,https://dev59.com/zGcs5IYBdhLWcg3wTyNl 确认了我的方法。 - drAlberT
好的,数字来自第三方应用程序且未经验证!因此,感谢您最后的评论,我解决了这个问题...还有什么其他的事情...向更大的目标迈进!下次见! - DrFalk3n

0

到目前为止,我发现并且它有效的方法来自于这个SO问题,我可以通过这种方式在每个目录中创建并确保文件存在,但我希望找到一种循环遍历[some-1,some-2,some-3,some-4]的方法。

file{[ "/some-1/pool" , "/some-2/pool" , "/some-3/pool" , "/some-4/pool" ] :
    ensure   => "directory",
    recurse  => "true",
     [ "/some-1/pool/setup" , "/some-2/pool/setup" , "/some-3/pool/setup" , "/some-4/pool/setup" ] :
    ensure   => "present",
    content  => template("some/setupPool.erb");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接