Куда среда Марионетки прибывает из?

[1122257] ARM огромный для Линукса. Кроме Rasberry Pi и других любителей ARM SoC у вас есть все Android телефоны и планшеты, а также многие Chromebooks под управлением Linux на ARM. Я не смог найти никаких жестких чисел на всех используемых устройствах, но общее число активаций андроидов число где-то к северу от 1 миллиарда. Chromebooks являются самыми продаваемыми ноутбуками Amazon, хотя не все из них основаны на ARM, и я не уверен, что разбивка продаж. Излишне говорить, что ARM является одной из Linux больших архитектур, как далеко пользователи заходят. [1122258]
2
22.12.2014, 18:17
1 ответ

Документация немного сбивает с толку по этому поводу:

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 .

1
27.01.2020, 22:21

Теги

Похожие вопросы