Назад | Перейти на главную страницу

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

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

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