Можно ли использовать Puppet для обеспечения наличия нескольких файлов в каталоге без определения их всех?

8

У меня есть пара сотен одноразовых серверов, которые имеют разные файлы конфигурации, которые должны присутствовать в каталоге. Копии файлов находятся на хозяине кукол.

В одном из моих классов у меня есть набор конфигураций по умолчанию, которые всегда передаются на узел, например:

file { "/etc/someprogram/config/000-default":
  ensure => "present",
  owner => "root",
  group => "root",
  mode =>  0764,
  source => "puppet:///modules/someprogram/000-default",
}

То, что я хотел бы иметь что-то вроде этого:

$filearray = directory listing of /etc/puppet/modules/someprogram/files/$fqdn
with each file as an element into array

$filearray.each(
file { "/etc/someprogram/config/$filename":
  ensure => "present",
  owner => "root",
  group => "root",
  mode =>  0764,
  source => "puppet:///modules/someprogram/files/$fqdn/$filename",
}
)

Я не очень знаком с марионеткой, но у меня складывается впечатление, что нет способа сделать это.

Freshy
источник
1
Вы бы согласились с рекурсивным управлением каталогом, в котором они находятся ( recurse => trueпо fileтипу), вместо объявления каждого файла как отдельного ресурса?
Шейн Мэдден

Ответы:

8

Вы можете сделать то, что вы пытаетесь с этим:

file { "/etc/someprogram/config":
    ensure => directory,
    recurse => remote,
    source => "puppet:///modules/someprogram/files/$fqdn"
    #Other options
}

Это скопирует все файлы в $ fqdn в / etc / someprogram / config, перезаписав, если они уже существуют.

meatflag
источник
1
Также обратите внимание, будут recurse => remoteли в указанном каталоге локальные файлы, которые не отправляются марионеточным сервером.
Zoredache
Это хороший совет, я не знал, что это было добавлено в спецификацию, отредактировал оригинал, чтобы отразить это.
мясной флаг
3

Если вы хотите определить несколько файлов в каталоге без повторения всего каталога, вы можете использовать массив - например, так:

$myfiles = [ "/my/dir/file1", "/my/dir/file2", ]
file { $myfiles:
    ensure => "present",
    owner  => "root",
    group  => "root",
    mode   =>  0644,
    source => "puppet:///modules/someprogram/$fqdn/$name",
}

Конечно, с длинными путями к «/ my / dir» или большим количеством файлов это будет немного громоздким, поэтому в этом случае вам лучше создать определение, которое включает путь к каталогу, и просто передать массив имена файлов к нему.

Пол Гир
источник
к сожалению, это не работает, если у вас есть aliasнабор файлов: /
cweiske
1
Похоже, у вас есть опечатка $ myfiles -> $ files
Фабрицио Реджини
1
Так не пойдет. Вы не можете ссылаться $nameздесь. Это работает только если это определенный тип.
Факер
1

Вот пример того, как я это делаю:

file {
        [
        '/sys/block/sda/queue/scheduler',
        '/sys/block/sdb/queue/scheduler',
        '/sys/block/sdc/queue/scheduler',
        '/sys/block/sdd/queue/scheduler',
        '/sys/block/sde/queue/scheduler',
        '/sys/block/sdf/queue/scheduler'
        ]:
  ensure  => 'file',
  content => 'deadline',
  group   => '0',
  mode    => '644',
  owner   => '0',
  type    => 'file',
}

В приведенном выше примере я назначаю планировщик ввода-вывода крайнего срока для каждого из дисков на данном сервере через Puppet.

Сэм Колдуэлл
источник