在 Chef 中使用字符串变量的中间

Use middle of a string variable in Chef

我在 Chef 中有这样的代码

{
  'home/user1/folder/file.erb'=>'/home/user1/folder/file',
  'home/user2/folder/file.erb'=>'/home/user2/folder/file',
  'home/user3/folder/file.erb'=>'/home/user3/folder/file',
  'home/user4/folder/file.erb'=>'/home/user4/folder/file',

}.each do |s,d|
  template d do
    source s
    owner user
    group user
    mode '600'
  end
end

如何用变量 d 中的 user1、user2、user3...替换所有者和组的值?

谢谢!

/

上拆分您的哈希值

当然还有其他方法可以做到这一点,但给定您的示例,一个简单的技巧就是将用户的目录从每个哈希值中获取到每个循环顶部的块局部变量中,然后您可以重复使用如所须。例如:

{
  'home/user1/folder/file.erb' => '/home/user1/folder/file',
  'home/user2/folder/file.erb' => '/home/user2/folder/file',
  'home/user3/folder/file.erb' => '/home/user3/folder/file',
  'home/user4/folder/file.erb' => '/home/user4/folder/file',
}.each do |src, dst|

  # capture username for use as owner & group
  usr = dst.split(?/)[2]

  template dest do
    source src
    owner  usr
    group  usr
    mode   '600'
  end
end

Using String#split 通过使用 / 作为分隔符将字符串分解为元素数组来工作。使用 [2] 对数组进行索引会为您提供第三个元素,即用户名,您显然也将其用于组。

它是第三个元素而不是第二个元素这一事实并不直观。但是,当您在示例代码中使用 #split 时,您会得到如下结果:

'/home/user4/folder/file'.split ?/
#=> ["", "home", "user4", "folder", "file"]

由于#split 的工作方式,您的输入将产生一个空字符串作为每个目标数组的第一个元素。由于 Ruby 数组是零索引的,因此您想要的元素是每个样本值中的第三个元素(例如 [2])。

当然还有其他方法可以做到这一点,但这是一种无需对代码进行重大更改即可执行所需操作的简单方法。记住 Chef(和 Puppet!)实际上只是构建在 Ruby 之上的 DSL 通常会有所帮助,因此您通常可以使用标准 Ruby 方法来完成工作。