Как вы можете использовать рецепт Chef для установки переменной среды?

Как вы можете использовать рецепт Chef для установки переменной среды?

Мне нужно установить переменную среды, используя рецепт Chef. Можете ли вы привести пример того, как это сделать?


person Brandon    schedule 08.06.2011    source источник
comment
Каков контекст для переменной среды, которую вы хотите установить?   -  person Eric Dennis    schedule 12.07.2011
comment
Можете ли вы расширить свой вопрос? Похоже, что на него ответили, если вы не поделитесь дополнительной информацией или не дадите нам отзыв.   -  person Till    schedule 03.11.2011


Ответы (5)


Если вам нужен env var, установленный строго внутри процесса Chef, вы можете использовать ENV['foo'] = 'bar', так как это ruby-процесс.

Если вам нужно установить его для поставщика выполнения, Chef предоставляет хэш среды:

execute 'Bootstrap the database' do 
  cwd "#{app_dir}/current"
  command "#{env_cmd} rake db:drop db:create db:schema:load RAILS_ENV=#{rails_env}"
  environment 'HOME' => "/home/#{app_user}"
  user app_user
  action :run
  not_if %[psql -U postgres -c "\\l" | grep #{db_name}]
end

Если вы хотите установить постоянную переменную среды, возможно, вы захотите, чтобы Chef редактировал /etc/profile.d/chef.sh, /etc/environment, профиль пользователя и т. д.

person jodell    schedule 18.10.2011
comment
Не могли бы вы объяснить, как установить переменную среды на постоянной основе через шеф-повара - person Prats; 08.04.2014
comment
@Prats — ознакомьтесь с magic_shell кулинарной книгой — community.opscode.com/cookbooks/magic_shell - person Kevin Meredith; 08.05.2014

Если вы хотите установить его в системе с помощью Chef, ознакомьтесь с поваренной книгой magic_shell.

magic_shell_environment 'RAILS_ENV' do
  value 'production'
end
person sethvargo    schedule 17.02.2013
comment
Просто примечание для тех, кто гуглит: magic_shell_environment — это фантастика, но с одним нюансом. Любая команда, вызванная с помощью system(/new/process/to/call) из скрипта ruby, не будет автоматически извлекаться из /etc/profile.d/* - person matt; 25.04.2013
comment
@matt, вы можете заставить это произойти, запустив интерактивный вход в систему и / или используя источник /etc/profile в сценарии Ruby. - person sethvargo; 28.04.2013
comment
спасибо, @sethvargo. Чтобы обновить переменную среды, например $PATH, как мне использовать поваренную книгу magic_shell? - person Kevin Meredith; 24.03.2014
comment
magic_shell_environment 'ПУТЬ' сделать значение '$ПУТЬ: что угодно' конец - person sethvargo; 24.03.2014
comment
@matt - решает мою проблему (stackoverflow.com /questions/22618960/) показать конкретный пример потенциальной проблемы, которую вы упомянули? - person Kevin Meredith; 24.03.2014
comment
Если вы пытаетесь развернуть свой собственный установщик, вы можете вместо этого проверить Ark. - person Zook; 12.07.2014
comment
@sethvargo Я хочу использовать переменную сразу после ее установки, но она пуста. в следующий раз запускаю рецепты, все нормально...!? Я делаю что-то неправильно? - person Philipp Kyeck; 24.02.2015
comment
@pkyeck нет, именно так работает загрузка оболочки. Вам нужно будет перезагрузить оболочку после установки envar. - person sethvargo; 24.02.2015
comment
@sethvargo Есть ли способ source файл профиля во время выполнения рецепта. execute 'source /etc/profile' определенно не работает, так как source недоступен в оболочке ruby, и в любом случае он работает во вспомогательной оболочке. - person Cristian Vrabie; 09.02.2016

Если вы хотите установить его на системном уровне в /etc/environment, вы можете сделать это непосредственно в следующем примере, не добавляя дополнительный рецепт (это добавляет две переменные env для Java):

sys_env_file = Chef::Util::FileEdit.new('/etc/environment')
{
  'JAVA_HOME' => '/usr/lib/jvm/java-1.7.0-openjdk-amd64',
  'LD_LIBRARY_PATH' => '/usr/lib/jvm/java-1.7.0-openjdk-amd64/lib'
}.each do |name, val|
  sys_env_file.insert_line_if_no_match /^#{name}\=/, "#{name}=\"#{val}\""
  sys_env_file.write_file
end
person Kent Mewhort    schedule 27.04.2016

Способ сделать это отличается в Windows и Linux. Самый простой способ:

Windows

Используйте ресурс windows_env для создания системной переменной среды:

windows_env 'CHEF_LICENSE' do
  value 'accept'
end

Линукс

Если вам это нужно только для запуска поваренной книги и ее дочерних элементов, используйте ресурс Ruby ENV. Это НЕ будет постоянным:

ENV['CHEF_LICENSE'] = 'accept'

Если вам нужно, чтобы он был постоянным (и используйте bash):

Создайте скрипт в /etc/profile.d:

  1. Создайте сценарий шаблона (например, chef.sh.erb)
  2. Заполните шаблон сценария:

    #!/bin/bash export CHEF_LICENSE='accept' # Needed for Chef Infra Client 15

  3. Поместите ресурс шаблона в свой рецепт (вы можете установить атрибуты и настройки владельца/группы, я хотел, чтобы этот пример был простым)

    template '/etc/profile.d/chef.sh' do source 'chef.sh.erb' end

Вот некоторые дополнительные ресурсы, чтобы прочитать о различных ресурсах, упомянутых здесь:

ресурс шаблона
ресурс windows_env

person Taegost    schedule 14.05.2019
comment
Часть Linux была чрезвычайно полезной и работала отлично. Большое спасибо! - person Arijit; 08.07.2019

Для Linux лучший способ сделать это — использовать

ENV['Var'] = 'Value'

Когда вы используете эту команду, каждый подпроцесс, запускаемый рецептом, будет использовать это значение ENV. Вы можете проверить это, используя ресурс bash и повторив значение Var.

person Sourav Biswas    schedule 14.11.2019