我想用 Puppet 检查“目录是否存在”的情况,这里是如何做到的如何在 Puppet 中确定文件/目录是否存在条件?但如果我写
exec { 'check_presence':
command => "true",
path => ["/usr/bin","/usr/sbin", "/bin"],
onlyif => "test -d /test"
}
file { '/test/123':
ensure => directory,
mode => '0644',
require => Exec['check_presence']
}
我总是exec
得到true
,而 puppet 总是尝试创建 /test/123
Debug: Exec[check_presence](provider=posix): Executing check 'test -e /test'
Debug: Executing 'test -e /test'
Error: Cannot create /test/123; parent directory /test does not exist
Error: /Stage[main]/tst::test/File[/test]/ensure: change from absent to directory failed: Cannot create /test/123; parent directory /test does not exist
他为什么这么做?!我该如何检查父目录是否存在?!
我的傀儡是3.8
更新型多巴胺我不想创造/test
!我想创造/test/123
仅有的如果/test 已经存在!
答案1
puppet 没有针对此问题的本机函数,唯一的解决方法是:
mkdir -p your_module_path/lib/puppet/parser/functions/
现在您需要directory_exists.rb
使用此代码创建此文件:
require 'puppet'
module Puppet::Parser::Functions
newfunction(:directory_exists, :type => :rvalue) do |args|
if File.directory?(args[0])
return true
else
return false
end
end
end
现在,在你的傀儡代码中,你可以使用该函数:
if directory_exists('/test') {
file { '/test/123':
ensure => directory,
mode => '0644',
owner => 'root',
group => 'root',
}
}
答案2
如果您不想创建 /test 本身,我相信您必须同时做两件事exec
:
exec { '/usr/bin/install /test/123':
onlyif => "/usr/bin/test -d /test"
}
使用install
而不是mkdir
可以在同一命令中设置模式等属性。
创建父目录的最简单方法是链接file
:
file { '/test':
ensure => directory,
mode => '0644',
} ->
file { '/test/123':
ensure => directory,
mode => '0644',
}
代码的语义仅仅要求exec
“被实例化”(即运行)前子目录已创建。这没有任何可选性 -true
如果存在则运行/test
,true
否则不是跑步。