7 votes

Est-ce que je peux exécuter une commande intégrée à l'interpréteur de commandes avec Puppet?

Je veux que ~/.bashrc soit source à chaque fois que son contenu change. J'ai créé une classe bashrc avec quelque chose comme ceci :

file { "/root/.bashrc":
    ensure  => present,
    owner   => root,
    group   => root,
    mode    => 0644,
    source  => "puppet:///bashrc/root/.bashrc"
}

exec { "root_bashrc":
    command     => "source /root/.bashrc",
    subscribe   => File["/root/.bashrc"],
}

mais comme vous le savez, source est une commande intégrée au shell, c'est pourquoi j'ai reçu l'erreur suivante lors de l'exécution de l'agent :

# puppet agent --no-daemonize --verbose
notice: Starting Puppet client version 2.7.1
info: Caching catalog for svr051-4170
info: Applying configuration version '1311563901'
err: /Stage[main]/Bashrc/Exec[root_bashrc]/returns: change from notrun to 0 failed: Could not find command 'source'
notice: Finished catalog run in 2.28 seconds
notice: Caught INT; calling stop

Y a-t-il une solution de contournement pour cela ?

2 votes

Veuillez nous aider à comprendre ce que vous demandez; est-ce que vous voulez que Puppet inclue le contenu de "/root/.bashrc" chaque fois qu'il utilise la ressource exec pour effectuer des changements? Je pense que vous devez ajouter plus de détails sur l'objectif global que vous essayez d'accomplir; la manière dont vous procédez actuellement ne va probablement pas fonctionner.

0 votes

+1 pour ce que dit handyman5

0 votes

Désolé si mon message n'est pas assez clair. Je veux dire que je veux exécuter source ~/.bashrc lorsque son contenu est modifié (comme lorsque un fichier de configuration est mis à jour, vous voulez redémarrer le service correspondant).

7voto

Ryan Sampson Points 2898

Il est inutile de re-sourcer un nouveau .bashrc dans Puppet, car il s'exécutera dans un sous-shell et les modifications ne se propageront pas dans votre shell actuel (ce que vous essayez probablement de faire). Vous ne pouvez pas faire ce que vous voulez faire.

5voto

Denis Washington Points 193

Vous pouvez également souvent préfixer votre commande avec true && ou utiliser provider => shell.

Consultez ceci et cela pour des discussions supplémentaires.

Cela devrait être :

file { "/root/.bashrc":
    ensure  => present,
    owner   => root,
    group   => root,
    mode    => 0644,
    source  => "puppet:///bashrc/root/.bashrc" }

exec { "root_bashrc":
    command     => "source /root/.bashrc",
    provider => shell,
    subscribe   => File["/root/.bashrc"], 
}

3 votes

provider => 'shell' ressemble de loin la meilleure réponse. Mais il faut se rappeler que sh n'est pas bash donc nous devrions utiliser . au lieu de source.

0 votes

Voici le problème réel qui a été résolu, je pense : projects.puppetlabs.com/issues/4288#note-23

4voto

freiheit Points 14144

Techniquement, vous pourriez utiliser:

exec { "root_bashrc":
    command     => "bash -c 'source /root/.bashrc'",
    subscribe   => File["/root/.bashrc"],
    refreshonly => true,
}

Cependant, comme @womble l'a déjà souligné, il est inutile de sourcer .bashrc de cette manière; cela n'affecte que l'interpréteur de commandes bash qui est exécuté dans cette commande, et non les interpréteurs de commandes bash actuellement en cours d'exécution.

Vous pourriez éventuellement définir PROMPT_COMMAND="source /root/.bashrc" pour réexécuter le .bashrc chaque fois qu'un invite de commandes est affiché dans des interpréteurs de commandes interactifs actuellement en cours d'exécution, mais cela semble un peu intensif en ressources. Je n'ai jamais essayé cela, mais je pense que cela fonctionnerait.

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