matrizes em fantoches

matrizes em fantoches

Estou me perguntando como resolver o seguinte problema de marionetes: Quero criar vários arquivos baseados em uma matriz de strings. A complicação é que quero criar vários diretórios com os arquivos:

dir1/
    fileA
    fileB
dir2/
    fileA
    fileB
    fileC

O problema é que os títulos dos recursos dos arquivos devem ser exclusivos. Portanto, se eu mantiver os nomes dos arquivos em uma matriz, precisarei iterar sobre a matriz de uma maneira personalizada para poder corrigir os nomes dos arquivos com o nome do diretório:

$file_names = ['fileA', 'fileB']
$file_names_2 = [$file_names, 'fileC']

file {'dir1': ensure => directory }
file {'dir2': ensure => directory }

file { $file_names: path = 'dir1', ensure =>present, }
file { $file_names_2: path = 'dir2', ensure =>present, }

Isso não funcionará porque os títulos dos recursos dos arquivos são conflitantes. Portanto, preciso acrescentar, por exemplo, o nome do diretório ao título do arquivo; no entanto, isso fará com que a matriz de arquivos seja concatenada e não tratada como vários arquivos...

argh..

file { "${file_names}-dir1": path = 'dir1', ensure =>present, }
file { "${file_names_2}-dir2": path = 'dir1', ensure =>present, }

Como resolver este problema sem a necessidade de repetir o próprio recurso do arquivo. Obrigado

Responder1

Você pode usar regsubst()a função para modificar um array de strings e retornar um array. VerReferência da função fantoche.

$filenames = ['fileA', 'fileB', 'fileC']
$filepaths_dir1 = regsubst($filenames, '^', '/path/to/dir1/')

file {$filepaths_dir1:
    ensure => present,
}

Lembre-se de que fileo título do recurso precisa ser um caminho totalmente qualificado ou o caminho completo deve ser especificado com pathparâmetro. Especificar path => 'dir1'os arquivos provavelmente não faz o que você deseja.

Responder2

Já faz um tempo que não uso isso, mas uma definição deve lidar com o que você deseja.

define myfiles::config ($directory_name, $file_name) {
  ; add command to create directories if needed

  file { "myfiles/conf.d/$directory_name/$file_name":
    ensure  => present,
    ...
  }

}

$directory_name= <from array>
$file_name= <from array>
; loop the following statement 
myfiles::config { "$directory_name-$file_name":
  directory_name => 'dir1',
  file_name   => 'file',
}

informação relacionada