が欲しいです ~/.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
はシェルの組み込みコマンドであるため、エージェントの実行時に次のエラーが発生します。
# 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
ingを実行しても意味がありません.bashrc
Puppet内で実行されます。サブシェルで実行され、変更が現在のシェルに反映されないためです(つまり、あなたがしようとしていることです)。あなたがやりたいこと(私が思う)はできません。
コマンドの前にtrue &&
を付けたり、provider => Shell
を使用したりすることもできます。
詳細については this および this を参照してください。
これは次のようになります:
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"],
}
技術的には、以下を使用できます。
exec { "root_bashrc":
command => "bash -c 'source /root/.bashrc'",
subscribe => File["/root/.bashrc"],
refreshonly => true,
}
ただし、 @ wombleすでに指摘されている であるため、.bashrcをそのように調達しても意味がありません。そのコマンドで実行されるbashシェルにのみ影響し、現在実行中のbashシェルには影響しません。
Prompt_COMMAND="source /root/.bashrc"
は、現在実行中の対話型シェルでプロンプトが表示されるたびに.bashrcを再実行しますが、少しリソースを消費しているようです。私はこれを試したことはありませんが、うまくいくと思います。