
Me pregunto cómo resolver el siguiente problema de títeres: quiero crear varios archivos basados en una serie de cadenas. La complicación es que quiero crear varios directorios con los archivos:
dir1/
fileA
fileB
dir2/
fileA
fileB
fileC
El problema es que los títulos de los recursos del archivo deben ser únicos. Entonces, si mantengo los nombres de los archivos en una matriz, necesito iterar sobre la matriz de una manera personalizada para poder postfijar los nombres de los archivos con el nombre del directorio:
$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, }
Esto no funcionará porque los títulos de los recursos del archivo chocan. Entonces necesito agregar, por ejemplo, el nombre del directorio al título del archivo; sin embargo, esto hará que la matriz de archivos se concatene y no se trate como archivos múltiples...
argh..
file { "${file_names}-dir1": path = 'dir1', ensure =>present, }
file { "${file_names_2}-dir2": path = 'dir1', ensure =>present, }
Cómo solucionar este problema sin la necesidad de repetir el recurso del archivo. Gracias
Respuesta1
Puede usar regsubst()
la función para modificar una matriz de cadenas y devolver una matriz. VerReferencia de función de marioneta.
$filenames = ['fileA', 'fileB', 'fileC']
$filepaths_dir1 = regsubst($filenames, '^', '/path/to/dir1/')
file {$filepaths_dir1:
ensure => present,
}
Tenga en cuenta que file
el título del recurso debe ser una ruta completa o la ruta completa debe especificarse con path
un parámetro. Especificar path => 'dir1'
los archivos probablemente no haga lo que desea.
Respuesta2
Ha pasado un tiempo desde que usé esto, pero una definición debería manejar lo que quieres.
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',
}