Как установить переменную среды в crontab с помощью Chef?

У меня есть рецепт, который устанавливает задания для запуска из crontab экземпляра EC2. Вот пример рецепта, который я запускаю:

cron "examplejob" do
 minute "0"
 hour "2"
 command "job"
 user "job"
end

Это прекрасно работает. В дополнение к этому заданию cron я также хочу установить несколько переменных среды в crontab. Читая это, кажется, что это возможно с использованием "пути" атрибут. Однако я не могу найти конкретный пример того, как это реализовать.

Я старался:

cron "env" do
 path "MY_VAR=/path/for/variable"
end

Но это не работает. Как я могу установить переменные среды в верхней части crontab? Любое понимание ценится! Спасибо.


person Girish Rao    schedule 17.10.2012    source источник


Ответы (2)


Я считаю, что ответ, который вы ищете, - это атрибут environment, который ожидает объект Hash.

См. http://docs.opscode.com/chef/resources.html#arguments и https://github.com/opscode/chef/commit/96ef7d770a7d898fdce097c7fda9039abf7bf485

Чтобы установить пользовательскую переменную среды, вы должны написать следующее

my_env_vars = {"env1" => "val1", "env2" => "val2"}    

cron "env" do
 environment my_env_vars
 command "/path/to/job -someoption"
end

Chef будет перебирать ваш хэш, и вы должны увидеть следующее в sudo crontab -e

# Chef Name: env
env1=val1
env2=val2
* * * * * /path/to/job -someoption

Краткое примечание: на моей машине с Chef 10.16.2 передача хэша непосредственно в строфе cron вернет синтаксическую ошибку. syntax error, unexpected tASSOC, expecting '}' Не то чтобы вы все равно передавали хеш напрямую, но я подумал, что стоит упомянуть об этом, поскольку кто-то другой может повторить мою ошибку. Как только вы бросаете хэш в переменную, все работает как положено.

person Sergio    schedule 25.02.2013
comment
Я прочитал ваш ответ, просмотрел вашу заметку, а затем сразу же сделал ту же ошибку, передав хэш напрямую. Это также работает, если вы заключаете синтаксис хэша в круглые скобки, например: environment({'env1' => 'val1'}) - person AndrewF; 26.04.2013

Пакеты данных с ключом верхнего уровня, соответствующим вашей среде. На вики Opscode есть краткое и точное описание того, как вы можете это сделать. Data Bags and Environments В соответствии с вашим более ранний пример:

cron "[node.chef_environment]" do
 path "bag_item[node.chef_environment]["path_for_variable"]"
end

В качестве альтернативы, если вы хотите проявить фантазию, вы можете использовать Шаблоны с вашими пакеты данных и просто вызовите шаблон в рецепте. Это применимо, когда у вас есть crontab, вызывающий ту же функцию, только с другой переменной. Таким образом, вы можете редактировать шаблон, когда вам нужно, и он будет отражаться в разных средах.

person ellisera    schedule 17.10.2012
comment
Вы объединяете концепцию среды Chef с концепцией среды оболочки. OP хочет установить переменные среды, как вы это сделали бы в верхней части crontab, а не использовать атрибуты среды Chef в ресурсе cron. - person Justin Force; 13.02.2013