web-dev-qa-db-fra.com

faire récursivement une arborescence de répertoires dans la marionnette sans purge

Je veux créer la structure de répertoire /var/www/apps/example/current/public si elle n'existe pas avec marionnette. S'il existe déjà, je ne veux pas purger le contenu des répertoires. Comment puis-je faire cela? Ci-dessous ce que j'ai jusqu'ici:

file { "/var/www/apps/example/current/public":
  owner => 'deploy',
  group => 'users',
  ensure => "directory",
  purge => false,
  recurse => true
}

Cela me donne

 Cannot create /var/www/apps/example/current/public; parent directory /var/www/apps/example/current does not exist
14
Kyle Decot

Le paramètre recurse ne vous permet pas de créer des répertoires parent. Il est utilisé pour appliquer de manière récursive des valeurs de propriété telles que owner, mode etc. sur le contenu du répertoire et les sous-répertoires.

file { '/var/www':
    owner   => 'www-data',
    recurse => true,
}

En fait, Puppet ne peut actuellement pas créer automatiquement tous les répertoires parents. Vous devez plutôt ajouter tous les répertoires pertinents en tant que ressources.

file { [ '/var/www/apps',
         '/var/www/apps/example',
         '/var/www/apps/example/current',
         '/var/www/apps/example/current/public', ]:
           ensure => directory,
           ...
}

Le contenu existant restera inchangé. Il n'est pas nécessaire de passer le paramètre purge.

18
Felix Frank
  exec { "Create ${mydir}":
    creates => $mydir,
    command => "mkdir -p ${mydir}",
    path => $::path
  } -> file { $mydir : }

La dernière ligne permet aux autres ressources (par exemple, les fichiers à créer à l'intérieur de $mydir) de dépendre de File[$mydir] comme s'il était possible de le créer avec un ancien bloc file {} simple, ce qui devrait vraiment .

10
DomQ

J'ai essayé de trouver une bonne solution mais j'ai échoué. Alors j'ai trouvé un chemin moi-même. J'espère que c'est utile pour d'autres personnes.

La fonction suivante va générer la liste des répertoires parents, nous pouvons ensuite utiliser la liste pour créer des dossiers parents. Le premier argument est le chemin utilisé comme point de départ pour la recherche dans les répertoires parents. le deuxième argument est optionnel et sert de point final (exclusif) pour arrêter de chercher:

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

Voici un exemple d'utilisation:

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

Les codes ci-dessus garantissent les dossiers '/ var/www/apps/example' et '/ var/www/apps/example/current' créés avant la création de '/ var/www/apps/example/current/public' tant que '/ var/www/apps/exemple 'et ci-dessus ne sont pas touchés.

Je l'ai seulement testé sous Windows. Mais cela devrait fonctionner dans un environnement Linux.

Ce n'est pas idéal. Mais c'est mieux que de lister manuellement tous les parents.

0
AnthonyY

Si vous utilisez "define", vous pouvez avoir quelque chose comme ceci:

mymodule::recursive_dir { "My Directory" :
   drive => "C:",
   path  => "/path/to/folder",
}

Où je définis le "définir" dans mymodule.rb:

define mymodule::recursive_dir ($drive, $path) {
  $folders = split($path, "/")
  $folders.each |$index, $folder| {
    $calculated_folder = inline_template("<%= @folders[0, @index + 1].join('/') %>")
    $full_path = "${drive}${calculated_folder}"
    if (! defined(File[$full_path]) and $full_path != $drive) {
      file { $full_path :
        ensure => directory,
      }
    }
  }
}

Cela divise le chemin et crée chaque répertoire au fur et à mesure qu'il le rassemble, en veillant à ne pas essayer de créer le lecteur lui-même.

0
NickRamirez

Il est vrai que marionnette ne créera pas de répertoires parents pour vous, mais vous pouvez facilement créer un fournisseur de type fichier qui le fait. A titre d'exemple, j'ai créé un type et un fournisseur personnalisés pour exécuter essentiellement 'mkdir -p' sur les systèmes POSIX: https://docs.puppetlabs.com/puppet/latest/reference/lang_namespaces.html

Il y a une très bonne raison, cependant, que Puppet ne le fasse pas par défaut. En effet, Puppet ne veut pas être responsable de vos autorisations sur plusieurs répertoires, car l'agent est exécuté en tant que root. Cela pourrait être mauvais si vous approvisionnez/var/www ou quelque chose du genre. 

Le paramètre recuse file est vraiment destiné à gérer les paramètres de l’arborescence de répertoires: https://docs.puppetlabs.com/references/latest/type.html#file-attribute-recurse

Vous pouvez créer votre arborescence de répertoires et la servir à l'aide du code source => 'puppet: ///' uri, par exemple, définissez recurse sur true et utilisera tous les modes de fichiers définis dans l'arborescence de répertoires servie. 

0
Jeff Malnick