我在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
使用String#split的工作原理是使用/
作为分隔符将字符串分成元素数组。使用[2]
索引到数组中将为您提供第三个元素,即用户名,您显然也将其用于该组。
它是第三个元素而不是第二个元素的事实并不直观。但是,在示例代码上使用#split时,会得到如下结果:
'/home/user4/folder/file'.split ?/
#=> ["", "home", "user4", "folder", "file"]
由于#split的工作方式,您的输入将产生一个空字符串作为每个目标数组的第一个元素。由于Ruby数组的索引为零,因此所需的元素是每个示例值中的第三个元素(例如[2]
)。
当然,还有其他方法可以执行此操作,但这是一种简单的方法,可以在不对代码进行重大更改的情况下完成所需的操作。经常记住,Chef(和Puppet!)实际上只是建立在Ruby之上的DSL,因此您经常可以使用标准的Ruby方法来完成工作。