Могу ли я запустить встроенную команду оболочки с 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

Есть ли обходной путь для этого?

3 ответа

Решение

Там нет смысла повторноsourceновый .bashrc в Puppet, потому что он будет работать в подоболочке, и изменения не будут распространяться на вашу текущую оболочку (что, я полагаю, то, что вы пытаетесь сделать). Вы не можете делать то, что (я думаю) вы хотите сделать.

Вы также можете часто предварять вашу команду true && или использовать provider => shell,

Смотрите это и это для дополнительного обсуждения.

Это должно быть:

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 каждый раз, когда в любых запущенных в данный момент интерактивных оболочках отображается приглашение, но это кажется немного ресурсоемким. Я никогда не пробовал это, но я думаю, что это сработает.

Другие вопросы по тегам