É possível usar o Puppet para garantir a presença de vários arquivos em um diretório sem definir todos eles?

8

Eu tenho algumas centenas de servidores pontuais que têm arquivos de configuração diferentes que precisam estar presentes em um diretório. Cópias dos arquivos residem no mestre de marionetes.

Dentro de uma de minhas classes, eu tenho um conjunto padrão de configurações que são sempre enviadas para o nó, da seguinte maneira:

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

O que eu gostaria de ter é algo como isto:

$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",
}
)

Não estou muito familiarizado com as marionetes, mas estou tendo a impressão de que não há como fazer isso.

Freshy
fonte
1
Você ficaria bem em gerenciar recursivamente o diretório em que residem ( recurse => trueno filetipo), em vez de declarar cada arquivo como um recurso separado?
Shane Madden

Respostas:

8

Você pode fazer o que está tentando com isso:

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

Isso copiará todos os arquivos em $ fqdn para / etc / someprogram / config, substituindo se eles já existirem.

carne
fonte
1
Verifique também recurse => remotese o diretório em questão terá arquivos locais que não são enviados pelo servidor fantoche.
Zoredache
Essa é uma boa dica, eu não sabia que isso havia sido adicionado à especificação, original editado para refletir isso.
meatflag
3

Se você deseja definir vários arquivos em um diretório sem precisar recursar o diretório inteiro, pode usar uma matriz - assim:

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

Obviamente, com caminhos longos para "/ my / dir" ou muitos arquivos, seria um pouco complicado, portanto, nesse caso, seria melhor criar uma definição que incluísse o caminho do diretório e passar a matriz de nomes de arquivos para ele.

Paul Gear
fonte
Esta, infelizmente, não funciona quando você tem um aliasset no arquivo: /
cweiske
1
Parece que você tem um erro de digitação $ myfiles -> $ files
Fabrizio Regini 14/10
1
Isso não vai funcionar. Você não pode fazer referência $nameaqui. Isso só funciona se for um tipo definido.
faker #
1

Aqui está um exemplo de como eu faço isso:

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',
}

No exemplo acima, estou atribuindo o agendador de E / S de prazo final a cada um dos discos em um determinado servidor através do Puppet.

Sam Caldwell
fonte