Ho provato a trovare una buona soluzione ma non ci sono riuscito. Così ho capito un modo anch'io. Spero sia utile ad altre persone.
La seguente funzione genera l'elenco delle directory madri, quindi è possibile utilizzare l'elenco per creare cartelle principali. Il primo argomento è il percorso che viene utilizzato come punto di partenza per cercare le directory principali; il secondo argomento è facoltativo e viene usato come il punto finale (esclusiva) per interrompere la ricerca:
module Puppet::Parser::Functions
newfunction(:parentdirs, :type => :rvalue, :doc => <<-EOS
Build a list of all its parent directories.
EOS
) do |arguments|
raise(Puppet::ParseError, "parentdirs(): Wrong number of arguments " +
"given (#{arguments.size} for 1)") if arguments.size < 1
$dir_until = arguments.size > 1 ? arguments[1] : nil
$cur = File.dirname(arguments[0])
$result = []
begin
$result.unshift($cur)
$last = $cur
$cur = File.dirname($cur)
end while $cur != $last and !$cur.end_with?('/') and $cur != $dir_until
return $result
end
end
Ecco un esempio di come usarlo:
$my_folder = '/var/www/apps/example/current/public'
$parent_dirs = parentdirs($my_folder, '/var/www/apps')
file { $parent_dirs:
ensure => 'directory',
owner => 'deploy',
group => 'users'
}
file { $my_folder:
ensure => 'directory',
owner => 'deploy',
group => 'anonymous'
}
I codici di cui sopra assicureranno cartelle '/var/www/apps/example 'e'/var/www/apps/example/current 'creati prima di creare'/var/www/apps/example/current/public 'mentre'/var/www/apps/example ' e sopra non rimangono toccati.
L'ho provato solo su Windows. Ma dovrebbe funzionare in ambiente Linux.
Questo non è l'ideale. Ma è meglio che elencare tutti i genitori uno per uno manualmente.