Newali
Newali

Reputation: 43

How do you update an environment variable using Ruby and Chef?

I know how to set the variables for both user and machine. The problem arises when I try to add to the PATH. Currently my code will overwrite what is in the PATH.

execute 'set java_home2' do
command "setx -m PATH2 \"D:\\Home"
*only_if {"PATH2" == " "}*
end

This currently ensures that the PATH will only run if there is no PATH. When the only_if is removed the problem of overwriting arises.

EDIT: I am now able to modify the system variable but cannot work out how to do the same with the user variables

env 'path addition' do
key_name "PATH"
value (ENV["PATH"] + ";D:\\Home\\Apps\\variable")
:modify
end

Upvotes: 2

Views: 2891

Answers (3)

Newali
Newali

Reputation: 43

I found the answer:

   #Append notepad to user PATH variable
registry_key "HKEY_CURRENT_USER\\Environment" do
  $path_name = ""
  subkey_array = registry_get_values("HKEY_CURRENT_USER\\Environment", :x86_64)
  subkey_array.each{ |val|
    case val[:name].include?("PATH")
    when true
        $path_name = val[:data]
        print "\n The User PATH is: #{$path_name}"
        break
    when false
      print ':'
    end
  }
    values [{
      :name => "PATH",
      :type => :string,
      :data => "#{$path_name};D:\\Home\\Apps\\Notepad++\\Notepad++"
      }]
  action :create
  #add a guard to prevent duplicates
  not_if {
      $path_name.include?("D:\\Home\\Apps\\Notepad++\\Notepad++")
  }
end

This code when ran from the CMD line will print the current User PATH variables, then it will append D:/Home/Apps/Notepad++/Notepad++ IF it is not currently in the PATH. If it already exists then this will be skipped.

Upvotes: 0

Mrigesh Priyadarshi
Mrigesh Priyadarshi

Reputation: 948

From the question, it looks like you are trying to add PATH on windows server. In that case you can use windows cookbook resource called windows_path for such operation:

windows_path 'C:\Sysinternals' do
  action :add
end

https://github.com/chef-cookbooks/windows

https://supermarket.chef.io/cookbooks/windows

Upvotes: 1

eiko
eiko

Reputation: 5345

I can't speak for specifics in chef, but in ruby, you can access environment variables with the ENV hash. So for PATH, you could do the following:

ENV["PATH"] = ENV["PATH"].split(":").push("/my/new/path").join(":")

That will update your PATH for the duration of the program's execution. Keep in mind that:

  1. This will only update PATH for your ruby script, and only temporarily. Permanently changing your PATH is more complicated and dependent on OS.
  2. This code assumes you're using linux. In windows, the PATH delimiter is ; instead of :, so you should update the code accordingly.

Upvotes: 1

Related Questions