gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:47:09 25 4
gpt4 key购买 nike

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

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']).

最佳答案

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

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

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

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

关于linux - 使用命令 mkdir -p 的 Puppet exec 不会失败但不会创建文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35672784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com