Shell

我可以使用 Puppet 執行 shell 內置命令嗎?

  • January 14, 2016

我希望~/.bashrc將在source任何時候更改其內容。我用這樣的東西創建了一個 bashrc 類:

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

但如您所知,source它是一個 shell 內置命令,因此在執行代理時出現以下錯誤:

# 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

有什麼解決方法可以做到這一點嗎?

source在 Puppet 中重新生成一個新的沒有意義.bashrc,因為它會在一個子 shell 中執行,並且更改不會傳播到您目前的 shell(我假設這就是您正在嘗試做的事情)。你不能做(我認為)你想做的事。

從技術上講,您可以使用:

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

然而,正如@womble 已經指出的那樣,像這樣採購 .bashrc 是沒有意義的。它只影響在該命令中執行的 bash shell,而不影響目前正在執行的任何 bash shell。

您可以設置PROMPT_COMMAND="source /root/.bashrc"為每次在目前正在執行的互動式 shell 中顯示提示時重新執行 .bashrc,但這似乎有點佔用資源。我從未嘗試過,但我認為它會起作用。

引用自:https://serverfault.com/questions/293711