2 votes

La ressource Puppet "file" a vidé un répertoire

Je me trouve dans la situation quelque peu embarrassante d'avoir supprimé involontairement plusieurs To de données importantes via Puppet, et j'essaie de comprendre pourquoi cela a pu se produire.

Premièrement, je suis presque sûr que la raison pour laquelle il a disparu (comme dans irrécupérable sauf via les sauvegardes) est.. :

File { backup => false }

dans mon site.pp. Les noeuds ont été configurés pour monter en dur quelque chose via NFS, donc un point de montage /mount, et une ligne dans fstab comme ceci :

nfsserver:/mount   /mount  nfs   <options> 0 0

Je voulais me débarrasser du montage et le remplacer par un lien symbolique vers le même emplacement éventuel (mais avec un chemin différent).

Mon manifeste de marionnettes ressemblait à ça :

class symlinks::linkdirtest ( ) { 
        file { '/mount':
            ensure => "link",
            target => "/anotherdir/mount",
        }
        mount { "/mount":
            ensure => "absent",
        }
}

Cela a donné le résultat suivant lors de l'exécution de Puppet :

notice: /Stage[main]/Symlinks::Linkdirtest/File[/mount]: Not removing directory; use 'force' to override

J'ai donc dûment (ou stupidement) ajouté :

class symlinks::linkdirtest ( ) { 
        file { '/mount':
            ensure => "link",
            target => "/anotherdir/mount",
                    force => "true",
        }
....

Et voilà, Puppet a procédé à la mise aux oubliettes du contenu du montage si important, alors que le point de montage lui-même est resté.

Une idée de la raison pour laquelle cela a pu se produire ?

Merci

3voto

clay richardson Points 46

Il a remplacé ce répertoire par un lien : Documentation

Sous "force" :

"Remplacer les répertoires par des fichiers ou des liens"

Pour référence future, vous pouvez essayer d'exécuter en mode noop pour voir quels changements seront effectués :

puppet agent --test --debug --noop --show-diff

0 votes

Merci, ça a du sens. Je m'attendais à ce qu'il remplace le répertoire par un lien. Ce à quoi je ne m'attendais pas, c'est qu'il vide le contenu de ce répertoire avant cela :) Je me souviendrai certainement de la ligne ci-dessus, si je suis à nouveau autorisé à m'approcher de Puppet :)

2voto

Vincent Points 191

En plus de tester les exécutions de Puppet avant de les appliquer, vous devez également vous rappeler que l'ordre dans lequel vous écrivez votre code Puppet n'est pas toujours l'ordre dans lequel Puppet s'exécute. Dans ce cas, vous auriez dû définir l'ordre. Vous devez d'abord faire un umount avant de faire le lien symbolique. Vous auriez pu le faire comme suit :

class symlinks::linkdirtest ( ) { 
    file { '/mount':
        ensure => "link",
        target => "/anotherdir/mount",
    }
    mount { "/mount":
        ensure => "absent",
        before => File['/mount'],
    }
}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X