我正在尝试创建一个函数,仅当第一个目录存在时才会创建目录/文件,否则由于依赖失败而必须跳过它。
我试过了此“onlyif”解决方法,但不幸的是它不适用于我的功能。
$check_directory = file("/path/to/directory")
if($check_directory != '') {
file{"/path/to/config":
ensure => directory,
mode => 0755,
}
file{"/path/to/config/a.conf":
ensure => file,
mode => 0755,
content => template("config_template.conf"),
}
}
我遇到一个错误:
Error: Is a directory - /path/to/directory
有没有办法执行其他 if 语句?或者任何参数?谢谢。
答案1
您应该能够require
在文件资源中简单地使用一个语句a.conf
:
file{"/path/to/directory":
ensure => directory,
mode => 0755,
}
file{"/path/to/config":
ensure => directory,
mode => 0755,
}
file{"/path/to/config/a.conf":
ensure => file,
mode => 0755,
content => template("config_template.conf"),
require => File["/path/to/directory"],
}
这将确保目录在文件之前创建。
答案2
@Sven 的回答是绝对正确的:你使用、、等在 Puppet 中设置资源依赖关系。before
我require
唯一notify
想改变的是,我将使用defined()
要测试的功能:
file { '/tmp/foo':
ensure => 'directory',
mode => '0755',
}
if defined(File['/tmp/foo']) {
notice("/tmp/foo is defined! making /tmp/bar/baz")
file { '/tmp/bar':
ensure => 'directory',
mode => '0755',
}
file { '/tmp/bar/baz':
ensure => 'present',
mode => '0755',
require => File['/tmp/bar'],
}
}
另外两个有用的信息:
如果您启用“未来解析器”在 Puppet 3.2+ 中,您可以像这样访问资源属性: 。这会将文件资源的属性
$a = File['/tmp/foo']['ensure']
值存储在变量中。如果您决定研究这一点,我会重写上述示例以使用(未经测试)。ensure
/tmp/foo
$a
if defined(File['/tmp/foo']) and File['/tmp/foo']['ensure'] == 'directory'
如果你将这些项作为参数传递给类,则可以通过以下方式访问类参数的值:在 Puppet 中如何访问定义类型内的变量属性。
答案3
编辑:如果你使用,下面的方法有效puppet apply
,但是不是否则,因为find_file
函数是在目录编制。 这意味着这种方法会检查用于编译目录的任何服务器上是否存在/path/to/directory/.
,而不是实际应用目录的主机。所以这可能不是普通用户想要的。在传统的 puppetmaster/client 架构中,目录不是在使用该目录的主机上编译的。
似乎工作得很好find_file
;帽子提示这篇博文这让我走上了正确的方向。
$check_directory = find_file("/path/to/directory/.")
if $check_directory {
file{"/path/to/config":
ensure => directory,
mode => 0755,
}
file{"/path/to/config/a.conf":
ensure => file,
mode => 0755,
content => template("config_template.conf"),
}
}
$check_directory
undef
如果目录不存在,则会计算为 false 。
/.
请注意,如果/path/to/directory
存在但是是文件而不是目录,则添加尾随会导致检查失败(并且代码不会运行)。