Я хочу проверить условие "существует ли каталог" с помощью марионетки, как это делается здесь Как сделать, чтобы файл / каталог существовал условно в 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
, а марионетка всегда пытается создать / 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
UPD Я не хочу создавать /test
! Я хочу создать /test/123
ТОЛЬКО если / test уже существует!
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',
}
}
Если вы не хотите создавать / тестировать себя, я считаю, что вам придется сделать обе вещи в exec
:
exec { '/usr/bin/install /test/123':
onlyif => "/usr/bin/test -d /test"
}
С помощью install
скорее, чем mkdir
позволяет устанавливать свойства, такие как режим, в той же команде.
Самый простой способ создать родительские каталоги - связать file
s:
file { '/test':
ensure => directory,
mode => '0644',
} ->
file { '/test/123':
ensure => directory,
mode => '0644',
}
Семантика вашего кода просто требует exec
для "создания" (то есть запуска) перед дочерний каталог создан. Это не подразумевает необязательности - true
будет работать, если /test
существует, иначе true
делает не запустить.