使用命令mkdir -p的Puppet exec不会失败但不会创建文件夹

时间:2016-02-27 17:12:37

标签: linux puppet

我在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以root身份运行,因此不太可能是权限问题
  • Puppet版本是3.7.2

请告知此处可能存在的问题,或者 - 如果还有其他方法可以使用Puppet创建任意数量的任意深度文件夹结构 - 我很乐意用等效的任何内容替换exec命令。我没有使用puppet的file资源,因为它无法自动创建必要的父目录(参见here

编辑:我特别感兴趣的是一种方法,可以让我将每个文件夹的任何编码作为从根目录(例如['/data', '/data/disk1', '/data/disk1/user1'])后面的层次结构的文件夹数组。

2 个答案:

答案 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>