Я пытаюсь создать функцию, каталог / файл которой будет создан только тогда, когда существует первый каталог, а не его нужно пропустить из-за неудачной зависимости.
я пробовал это обходное решение "только если", но, к сожалению, это не работает с моей функцией.
$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? Или какой-то параметр? Спасибо.
Вы должны просто использовать 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"],
}
Это гарантирует, что каталог будет создан перед файлом.
Идея ответа @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'
(НЕПРОВЕРЕНО).
Если вы передаете эти элементы в качестве параметров классу, есть хитрый способ получить доступ к значениям параметров класса через in-puppet-how-can-i-access-a-переменная-атрибут-внутри-определенного-типа.