Question Puis-je exécuter une commande intégrée du shell avec Puppet?


Je voudrais ~/.bashrc sera source à chaque changement de contenu. J'ai créé une classe bashrc avec quelque chose comme:

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 du shell, j'ai donc eu 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 at-il une solution de contournement pour faire cela?


5
2017-07-25 04:29


origine


Aidez-nous à comprendre ce que vous demandez. voulez-vous dire que vous voulez que Puppet inclue le contenu de "/root/.bashrc" chaque fois qu'il utilise la exec ressource pour faire des changements? Je pense que vous devez ajouter plus de détails sur l'objectif global que vous essayez d'atteindre. la façon dont vous allez maintenant ne va probablement pas au travail. - Handyman5
+1 pour ce que dit le bricoleur5 - Mike
Désolé si mon message n'est pas assez clair. Je veux dire que je veux courir source ~/.bashrc lorsque son contenu est modifié (tout comme lorsqu'un fichier de configuration est mis à jour, vous souhaitez redémarrer le service correspondant). - quanta
Cela n'a aucun sens de faire cela - vous devrez de toute façon redémarrer le service qui utilise l'environnement (car son environnement est déjà chargé avec l'ancien système bashrc) - filipenf


Réponses:


Il n'y a aucun point en resourceun nouveau .bashrc dans Puppet, car il fonctionnera dans un sous-shell et les modifications ne seront pas propagées dans votre shell actuel (ce qui, je suppose, est ce que vous essayez de faire). Vous ne pouvez pas faire ce que je veux faire.


7
2017-07-25 06:03





Techniquement, vous pourriez utiliser:

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

Cependant, comme @womble  déjà souligné, inutile de se procurer des fichiers .bashrc comme ça; cela affecte uniquement le shell bash exécuté dans cette commande, pas les shell bash en cours d'exécution.

Vous pourriez éventuellement définir PROMPT_COMMAND="source /root/.bashrc" pour réexécuter le fichier .bashrc chaque fois qu'une invite est affichée dans les shells interactifs en cours d'exécution, mais cela semble un peu gourmand en ressources. Je n'ai jamais essayé cela, mais je pensais que ça marcherait.


4
2017-07-25 15:22





Vous pouvez aussi souvent préfacer votre commande avec true && Ou utiliser provider => shell.

Voir ce et ce pour discussion supplémentaire.

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"], 
}

4
2018-01-04 19:32



provider => 'shell' `ressemble de loin à la meilleure réponse. Mais rappelez-vous que sh n'est pas bash donc nous devrions utiliser . au lieu de source. - Felipe Almeida
voici le problème qui a résolu ce problème, je pense: projects.puppetlabs.com/issues/4288#note-23 - Felipe Almeida