Shell
我可以使用 Puppet 執行 shell 內置命令嗎?
我希望
~/.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,但這似乎有點佔用資源。我從未嘗試過,但我認為它會起作用。