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

Puppet exec with command mkdir -p does not fail but does not create folder

我 运行 在 Ubuntu 14.04 机器上使用这个简单的人偶代码,根据逗号分隔的路径列表创建文件夹:

define local_dirs ($comma_separated_dirs) {
    $folders = split($comma_separated_dirs, ',')

    exec { $folders:
       command => "mkdir -p ${name} && chmod 0777 ${name}"
    }
}

此资源定义使用如下(在本例中 - 只是一个文件夹,没有逗号,其他模块确实需要此 "split" 逻辑):

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

但是,该文件夹从未创建,运行ning ls -la /data 显示没有这样的文件夹。

还有一些值得注意的事实:

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

编辑:我特别感兴趣的是一种方法,它可以避免将每个文件夹编码为从根目录开始的层次结构中的文件夹数组(例如 ['/data', '/data/disk1', '/data/disk1/user1']).

不使用 exec,而是使用 puppets 文件资源。先把你要创建的目录做成一个数组,然后用这个数组作为文件资源标题。

$folders = [ '/example', '/example/folder2', '/example/folder2/folder3' ]

file { "$folders" :
  ensure => directory,
  owner  => 'root',
  group  => 'root',
  mode   =>  '0777',
}

您对 $name 变量的值有错误的期望。您假设在资源声明中使用它时 ...

exec { $folders:
   command => "mkdir -p ${name} && chmod 0777 ${name}"
}

...表示所声明资源的名称。不是这种情况。它在声明内部和外部的含义相同:正在评估声明的已定义类型实例的名称/标题(local_dirs 实例,其名称显然是 'create-dirs') .因此,mkdir 在 Puppet 的工作目录中创建了一个同名目录。

您可以通过插入另一个级别的定义类型来包装您的 Exec 来解决问题。但是,如果您愿意启用未来的解析器,那么 forward-looking 方向将是使用新的 each() 函数而不是数组标题来声明您的多个 Exec 资源。