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

Почему мой определенный ресурс отказывается копировать исходные файлы, перечисленные в массиве?

Я пытаюсь заполнить некоторые файлы конфигурации из 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 => принятия такого же более разумного использования пути.

отметка