Документация немного сбивает с толку по этому поводу:
Providers
posix
Выполняет внешние двоичные файлы напрямую, без прохождения через оболочку или выполнения какой-либо интерполяции. Это более безопасный и более предсказуемый способ выполнения большинства команд, но он предотвращает использование подстановок и встроенных команд оболочки (включая логику управления, такую как операторы «for» и «if»).
По умолчанию для
функция
==posix
.shell
Передает предоставленную команду через
/ bin / sh
; доступно только в системах POSIX. Это позволяет использовать подстановку оболочки и встроенные функции и не требует, чтобы путь к команде был полностью определен. Хотя это может быть более удобным, чем поставщикposix
, это также означает, что вам нужно быть более осторожным с экранированием; как всегда, приходит большая мощность и т. д. и т. д.Этот провайдер очень напоминает поведение типа
exec
в Puppet 0.25.x.
Таким образом, если вы используете поставщик оболочки
, вы сможете использовать перенаправление, но по умолчанию используется posix
, что является прямым выполнением, поэтому, если вы не указали shell
, чего вы не сделали ...
В любом случае документация мало что говорит о среде. Необходимо изучить код :
begin
# Do our chdir
Dir.chdir(dir) do
environment = {}
environment[:PATH] = resource[:path].join(File::PATH_SEPARATOR) if resource[:path]
Похоже, он пуст, а затем заполняется любыми настройками, которые мы предоставляем с помощью поля environment
, и поэтому каждый раз повторно инициализируется.
Однако, если мы проследим за хлебными крошками, мы придем к вызову функции , которая выполняет ее:
output = Puppet::Util::Execution.execute(command, :failonfail => false, :combine => true,
:uid => resource[:user], :gid => resource[:group],
:override_locale => false,
:custom_environment => environment)
Execution.execute
вызывает execute_posix
, который, в свою очередь, делает :
command = [command].flatten
...
options[:custom_environment] ||= {}
Puppet::Util.withenv(options[:custom_environment]) do
Kernel.exec(*command)
Я не знаю Ruby, я бы сказал, что если вы не укажете команду и ее аргументы в виде массива явно, а не дадите только строку типа "/ bin / echo boop >> / tmp / outputFile "
, то командная строка передается как есть в Kernel.exec
, для которого:
строка принимается как командная строка, которая подчиняется оболочке расширение перед выполнением.
Вот почему вы можете использовать перенаправление без установки оболочки
в качестве провайдера. Далее, если посмотреть на с v
, массив окружения
, установленный выше, просто используется как набор переопределений. Если поле среды
не указано , ничего не отменяется. Следовательно, среда должна быть унаследована от Puppet. Теперь, в какой среде Puppet получит, я не уверен, но если он запущен как служба в системе Upstart-as-init, такой как Ubuntu, то доступны по крайней мере TERM
и PATH
.