web-dev-qa-db-ja.com

Puppetでシェル組み込みコマンドを実行できますか?

が欲しいです ~/.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

これを行うための回避策はありますか?

5
quanta

新しいsourceingを実行しても意味がありません.bashrc Puppet内で実行されます。サブシェルで実行され、変更が現在のシェルに反映されないためです(つまり、あなたがしようとしていることです)。あなたがやりたいこと(私が思う)はできません。

7
womble

コマンドの前に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"], 
}
4
John Sellens

技術的には、以下を使用できます。

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を再実行しますが、少しリソースを消費しているようです。私はこれを試したことはありませんが、うまくいくと思います。

4
freiheit