Setting Environment Variables

How do I go about setting environment variables in chef? I've tried several
methods such as adding them to a template and then sourcing it. Adding them
to attributes. I'm out of ideas...

## Problem

The JENKINS_HOME environment variable doesn't get set. It should however be

set using the template "default_jenkins.erb"
whenever I go into the instance and echo $JENKINS_HOME it does not return
anything

## Current status

Currently it successfully takes the jenkins war from the remote location and

places it into the webapps directory of Tomcat. When I go to the
http://PublicDNS:8080/jenkins Jenkins is running. (It does however
complain about not being able to create .jenkins directory, AKA Jenkins
Home, and suggests that there is a problem with its permissions)

## default recipe

Setting local variables

jenkinsWar = node[:jenkins][:war]

webapp_dir = node["tomcat"]["webapp_dir"]
tomcat_user = node["tomcat"]["user"]
tomcat_group = node["tomcat"]["group"]

Getting the Jenkins.war and putting it into the tomcat webapps directory

remote_file "/#{webapp_dir}/#{jenkinsWar}" do
source "#{node[:jenkins][:url]}"
mode "0644"
owner "root"
group "root"
end

Setting Jenkins configuration

template "/etc/default/jenkins" do
source "default_jenkins.erb"
owner "root"
group "root"
mode "0644"
notifies :restart, resources(:service => "tomcat")
end

## default_jenkins.erb

Set Jenkins home variable. This will tell Jenkins where to find it's

jobs/plugins/etc
JENKINS_HOME=<%= node[:jenkins][:home] %>

## default attribute

default[:jenkins][:war] = "jenkins.war"

default[:jenkins][:home] = "/var/lib/jenkins"
default[:jenkins][:url] = "
https://s3.amazonaws.com/cookbook-resources/#{node[:jenkins][:war]}"

It's got to go into the init.d script you install/generate to start your program.

-J

Sent via iPhone

Is your email Premiere?

On Aug 20, 2011, at 11:09, Brian Jakovich b.jakovich@gmail.com wrote:

How do I go about setting environment variables in chef? I've tried several methods such as adding them to a template and then sourcing it. Adding them to attributes. I'm out of ideas...

Problem

The JENKINS_HOME environment variable doesn't get set. It should however be set using the template "default_jenkins.erb"
whenever I go into the instance and echo $JENKINS_HOME it does not return anything

Current status

Currently it successfully takes the jenkins war from the remote location and places it into the webapps directory of Tomcat. When I go to the http://PublicDNS:8080/jenkins Jenkins is running. (It does however complain about not being able to create .jenkins directory, AKA Jenkins Home, and suggests that there is a problem with its permissions)

default recipe

Setting local variables

jenkinsWar = node[:jenkins][:war]
webapp_dir = node["tomcat"]["webapp_dir"]
tomcat_user = node["tomcat"]["user"]
tomcat_group = node["tomcat"]["group"]

Getting the Jenkins.war and putting it into the tomcat webapps directory

remote_file "/#{webapp_dir}/#{jenkinsWar}" do
source "#{node[:jenkins][:url]}"
mode "0644"
owner "root"
group "root"
end

Setting Jenkins configuration

template "/etc/default/jenkins" do
source "default_jenkins.erb"
owner "root"
group "root"
mode "0644"
notifies :restart, resources(:service => "tomcat")
end

default_jenkins.erb

Set Jenkins home variable. This will tell Jenkins where to find it's jobs/plugins/etc

JENKINS_HOME=<%= node[:jenkins][:home] %>

default attribute

default[:jenkins][:war] = "jenkins.war"
default[:jenkins][:home] = "/var/lib/jenkins"
default[:jenkins][:url] = "https://s3.amazonaws.com/cookbook-resources/#{node[:jenkins][:war]}"

On Saturday, August 20, 2011 at 10:44 AM, Jason J. W. Williams wrote:

It's got to go into the init.d script you install/generate to start your program.

-J

Sent via iPhone

Is your email Premiere?

On Aug 20, 2011, at 11:09, Brian Jakovich <b.jakovich@gmail.com (mailto:b.jakovich@gmail.com)> wrote:

How do I go about setting environment variables in chef? I've tried several methods such as adding them to a template and then sourcing it. Adding them to attributes. I'm out of ideas...

Problem

The JENKINS_HOME environment variable doesn't get set. It should however be set using the template "default_jenkins.erb"
whenever I go into the instance and echo $JENKINS_HOME it does not return anything

Current status

Currently it successfully takes the jenkins war from the remote location and places it into the webapps directory of Tomcat. When I go to the http://PublicDNS:8080/jenkins Jenkins is running. (It does however complain about not being able to create .jenkins directory, AKA Jenkins Home, and suggests that there is a problem with its permissions)

default recipe

Setting local variables

jenkinsWar = node[:jenkins][:war]
webapp_dir = node["tomcat"]["webapp_dir"]
tomcat_user = node["tomcat"]["user"]
tomcat_group = node["tomcat"]["group"]

Getting the Jenkins.war and putting it into the tomcat webapps directory

remote_file "/#{webapp_dir}/#{jenkinsWar}" do
source "#{node[:jenkins][:url]}"
mode "0644"
owner "root"
group "root"
end

Setting Jenkins configuration

template "/etc/default/jenkins" do
source "default_jenkins.erb"
owner "root"
group "root"
mode "0644"
notifies :restart, resources(:service => "tomcat")
end

default_jenkins.erb

Set Jenkins home variable. This will tell Jenkins where to find it's jobs/plugins/etc

JENKINS_HOME=<%= node[:jenkins][:home] %>

default attribute

default[:jenkins][:war] = "jenkins.war"
default[:jenkins][:home] = "/var/lib/jenkins"
default[:jenkins][:url] = "https://s3.amazonaws.com/cookbook-resources/#{node[:jenkins][:war]}"

This comes up frequently enough that it's worth going over in a bit of detail:

In UNIX, new processes are created by fork/exec, and environment variables are inherited from the program that you forked from. Processes can modify their environments; in Ruby, you do this:

ENV["JAVA_HOME"] = '/path/to/java_home'

If you use code like the above in a cookbook, this environment variable will be available to any processes that Chef creates (eg, any "shell" command that it executes). However, this environment variable won't be set when you log in via ssh; that's what your shell's initialization routines (in particular, loading your profile and rc scripts) are for.

As Jason says, your best bet in this use case is to set the environment in your init script for jenkins. As long as you always start/stop/restart jenkins via the init script, it will have the correct environment.

--
Dan DeLeo

Ok now I'm doing this in my attributes file:

set["tomcat"]["java_options"] = "$JAVA_OPTS

-DJENKINS_HOME=#{node[:jenkins][:home]}"

It seems to work.When I issue a restart on tomcat, it works correctly and
Jenkins reloads with the correct home, but is this the correct way to be
doing things?

Thanks a lot for the detailed answers.

On Sat, Aug 20, 2011 at 2:54 PM, Daniel DeLeo dan@kallistec.com wrote:

On Saturday, August 20, 2011 at 10:44 AM, Jason J. W. Williams wrote:

It's got to go into the init.d script you install/generate to start your
program.

-J

Sent via iPhone

Is your email Premiere?

On Aug 20, 2011, at 11:09, Brian Jakovich <b.jakovich@gmail.com (mailto:
b.jakovich@gmail.com)> wrote:

How do I go about setting environment variables in chef? I've tried
several methods such as adding them to a template and then sourcing it.
Adding them to attributes. I'm out of ideas...

Problem

The JENKINS_HOME environment variable doesn't get set. It should
however be set using the template "default_jenkins.erb"
whenever I go into the instance and echo $JENKINS_HOME it does not
return anything

Current status

Currently it successfully takes the jenkins war from the remote
location and places it into the webapps directory of Tomcat. When I go to
the http://PublicDNS:8080/jenkins Jenkins is running. (It does however
complain about not being able to create .jenkins directory, AKA Jenkins
Home, and suggests that there is a problem with its permissions)

default recipe

Setting local variables

jenkinsWar = node[:jenkins][:war]
webapp_dir = node["tomcat"]["webapp_dir"]
tomcat_user = node["tomcat"]["user"]
tomcat_group = node["tomcat"]["group"]

Getting the Jenkins.war and putting it into the tomcat webapps

directory

remote_file "/#{webapp_dir}/#{jenkinsWar}" do
source "#{node[:jenkins][:url]}"
mode "0644"
owner "root"
group "root"
end

Setting Jenkins configuration

template "/etc/default/jenkins" do
source "default_jenkins.erb"
owner "root"
group "root"
mode "0644"
notifies :restart, resources(:service => "tomcat")
end

default_jenkins.erb

Set Jenkins home variable. This will tell Jenkins where to find

it's jobs/plugins/etc

JENKINS_HOME=<%= node[:jenkins][:home] %>

default attribute

default[:jenkins][:war] = "jenkins.war"
default[:jenkins][:home] = "/var/lib/jenkins"
default[:jenkins][:url] = "
https://s3.amazonaws.com/cookbook-resources/#{node[:jenkins][:war]}"

This comes up frequently enough that it's worth going over in a bit of
detail:

In UNIX, new processes are created by fork/exec, and environment variables
are inherited from the program that you forked from. Processes can modify
their environments; in Ruby, you do this:

ENV["JAVA_HOME"] = '/path/to/java_home'

If you use code like the above in a cookbook, this environment variable
will be available to any processes that Chef creates (eg, any "shell"
command that it executes). However, this environment variable won't be set
when you log in via ssh; that's what your shell's initialization routines
(in particular, loading your profile and rc scripts) are for.

As Jason says, your best bet in this use case is to set the environment in
your init script for jenkins. As long as you always start/stop/restart
jenkins via the init script, it will have the correct environment.

--
Dan DeLeo