previous = Chef::Config[:http_proxy]
Chef::Config[:http_proxy] = 'http://proxy.example.net:8080'

remote_file '/var/tmp/package.zip' do
  source 'https://downloads.example.net/package.zip'
end

Chef::Config[:http_proxy] = previous

Временное значение исчезает ещё до того, как этот обычный ресурс что-либо скачает:

  1. Compile: Ruby верхнего уровня сохраняет значение, задаёт временный прокси, объявляет remote_file и восстанавливает значение.
  2. Converge: ресурс выполняет своё действие с конфигурацией, доступной на тот момент.

Стабильный клиентский прокси с подходящими внутренними исключениями позволяет избежать этой проблемы с таймингом. Используйте документированный синтаксис исключений установленного клиента, а не предполагайте правила shell wildcard. Для самостоятельной загрузки публичного артефакта по разрешённому публичному маршруту запись из списка HTTP-прокси может дать стабильную конечную точку HTTP, если у клиента Chef нет настроенной или сохранённой учётной записи прокси. Сохраняйте его внутренние исключения; выбор адреса не меняет того, когда compile и converge его используют.

Если одной операции нужен особый маршрут, поместите изменение её конфигурации и выполнение в одну область. Собственный ресурс с подходящим поведением unified-mode — один из вариантов, но Chef::Config остаётся глобальным. Восстанавливайте его, когда загрузка завершается неудачно и когда файл уже актуален. Уведомление об обновлении не срабатывает безусловно, а более поздний ресурс очистки может никогда не выполниться после исключения.

Свойство lazy source откладывает вычисление этого свойства, а не окружающие присваивания Ruby. Выполнение ресурсов во время compile — отдельный поддерживаемый вариант, когда загрузка должна происходить именно тогда; он также меняет тайминг зависимостей и уведомлений. Выбирайте по тому, когда HTTP-клиент использует свою настройку прокси, а не рассчитывайте, что порядок объявлений даст изоляцию.

Похожие статьи