Назад | Перейти на главную страницу

Есть каталог на марионетке

Я хочу проверить условие "существует ли каталог" с помощью марионетки, как это делается здесь Как сделать, чтобы файл / каталог существовал условно в 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 позволяет устанавливать свойства, такие как режим, в той же команде.


Самый простой способ создать родительские каталоги - связать files:

file { '/test':
  ensure  => directory,
  mode    => '0644',
} ->
file { '/test/123':
  ensure  => directory,
  mode    => '0644',
}

Семантика вашего кода просто требует exec для "создания" (то есть запуска) перед дочерний каталог создан. Это не подразумевает необязательности - true будет работать, если /test существует, иначе true делает не запустить.