我在Ubuntu 14.04计算机上运行这个简单的木偶代码,根据以逗号分隔的路径列表创建文件夹:
define local_dirs ($comma_separated_dirs) {
$folders = split($comma_separated_dirs, ',')
exec { $folders:
command => "mkdir -p ${name} && chmod 0777 ${name}"
}
}
此资源定义使用如下(在这种情况下 - 只有一个文件夹,没有逗号,其他模块确实需要这个“拆分”逻辑):
local_dirs { 'create-dir':
comma_separated_dirs => "/data/disk1"
}
当我运行它时,我看到以下日志行,表明实际执行了exec
命令:
Notice: /Stage[main]/My_module/Local_dirs[create-dir]/Exec[/data/disk1]/returns: executed successfully
但是,从未创建过该文件夹,运行ls -la /data
表示没有此类文件夹。
值得注意的更多事实:
请告知此处可能存在的问题,或者 - 如果还有其他方法可以使用Puppet创建任意数量的任意深度文件夹结构 - 我很乐意用等效的任何内容替换exec
命令。我没有使用puppet的file
资源,因为它无法自动创建必要的父目录(参见here)
编辑:我特别感兴趣的是一种方法,可以让我将每个文件夹的任何编码作为从根目录(例如['/data', '/data/disk1', '/data/disk1/user1']
)后面的层次结构的文件夹数组。
答案 0 :(得分:3)
使用puppets文件资源,而不是使用exec。首先创建一个您想要创建的目录数组,然后使用该数组作为文件资源标题。
@IBAction func loginButton(sender: AnyObject) {
self.performSegueWithIdentifier("dashboard", sender: self);
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if(segue.identifier == "dashboard")
{
let dutydash:dashboardController = segue.destinationViewController as! dashboardController;
dutydash.userId = self.userId;
dutydash.clanId = self.clanId;
}
}
答案 1 :(得分:3)
您对$name
变量的值有错误的期望。您假设在资源声明中使用它时...
exec { $folders: command => "mkdir -p ${name} && chmod 0777 ${name}" }
...它表示正在声明的资源的名称。不是这种情况。它在声明中的含义与在外部的含义相同:正在评估声明的已定义类型的实例的名称/标题(local_dirs
实例,其名称显然为'create-dirs'
) 。因此,mkdir
正在Puppet的工作目录中创建该名称的目录。
您可以通过插入另一个已定义类型级别来包装Exec
来解决问题。但是,如果您愿意启用未来的解析器,那么前瞻性的方向是使用新的each()
函数而不是数组标题来声明您的多个Exec
资源。 / p>