Я пытаюсь заполнить некоторые файлы конфигурации из modules/apt_config/files
используя определенный ресурс и массив файлов для установки.
define aptfile($file) {
file { $file: source => "puppet:///modules/${module_name}/etc/apt/${file}", }
}
aptfile{ [ 'apt.conf', 'sources.list', ]: }
В соответствии с этот отчет об ошибке, $ имя_модуля должен быть доступен. Эта часть меня не огорчает. Кажется, что сломано то, что $ файл не заполняется, когда я вызываю ресурс; вместо этого я получаю следующую ошибку:
Необходимо передать файл в Apt_config :: Aptfile [apt.conf] в /tmp/vagrant-puppet/modules-0/apt_config/manifests/init.pp:10 на узле vagrant.home
Обратите внимание, что строка 10 - это строка, содержащая define aptfile
определение.
Синтаксис немного запутан. Итак, на всякий случай, если я указывал путь к файлу в обратном порядке, я также попробовал это:
define aptfile($file) {
file { "/etc/apt/${file}":
source => "puppet:///modules/${module_name}/${file}",
}
}
aptfile{ [ 'apt.conf', 'sources.list', ]: }
с идентичными результатами. Я знаю, что могу указать каждый файл индивидуально, но что мне нужно сделать, чтобы этот цикл работал правильно?
$ file - это атрибут. Если вы хотите использовать имя экземпляра определения (один из элементов массива, который вы используете при объявлении aptfile), вы должны использовать $ name.
Итак, если вы сохраните все как есть, вы бы сделали что-то вроде этого:
aptfile {'somename':
file => ['apt.conf', 'sources.list'],
}
Однако то, что вы, вероятно, ищете, выглядит примерно так:
define aptfile(
$base_path = '/etc/apt',
) {
file {"${base_path}/${name}":
source => "puppet:///modules/${module_name}/files/${name}",
}
}
Обратите внимание, что $ name происходит от заголовка / имени ресурса (define, по сути, является своего рода настраиваемым ресурсом), когда вы его объявляете. Применяется ко всем ресурсам. Когда вы используете массив при объявлении файла ресурсов {['f1.txt', 'f2.txt']:}, вы просто уплотняете объявление нескольких файловых ресурсов ... file {'f1.txt':}, file {'f2.txt':}. $ name внутри тела - это имя объявления ресурса в игре, пока оно анализируется / обрабатывается.
Тогда назовите это так, как вы были:
aptfile {['apt.conf', 'sources.list']: }
Я обнаружил, что просто использую шаблоны с content => template ('modulename / somefile.erb'), даже если мне не нужна функциональность шаблона только потому, что путь более разумный (с минимальными дополнительными накладными расходами, как мне кажется). С нетерпением жду source => принятия такого же более разумного использования пути.
отметка