[chef] Re: chef powershell cookbook won't update the hostname


Chronological Thread 
  • From: Seth Chisamore < >
  • To:
  • Subject: [chef] Re: chef powershell cookbook won't update the hostname
  • Date: Fri, 28 Oct 2011 00:48:42 -0400

This is most likely a case of not running chef-client with elevated 
privileges.  This can be accomplished in a number of ways:

# *nix

* run chef-client under the root account..ie login as root or su to root.
* run chef-client with 'sudo'

# windows

* login into the Administrator account (NOTE - this is different than an 
account in the Administrators group)
* run the chef-client process from the Administrator account while being 
logged into another account (you will be prompted for your Administrator 
password.):

runas /user:Administrator "cmd /C chef-client -c c:/chef/client.rb"

* Open a Windows command prompt using UAC [0][1], run chef-client in this 
command prompt

As an FYI I was able to make a simplified version [2] of your code work on 
Windows Server 2003 and Windows Server 2008.

Hope that helps! 

-- 
Seth Chisamore
Software Design Engineer, Opscode, Inc.
IRC, Skype, Twitter, Github: schisamo

[0] http://en.wikipedia.org/wiki/User_Account_Control
[1] 
https://s3.amazonaws.com/uploads.hipchat.com/7557/16329/j8tfcvx8yd57uua/Windows%20Server%202008%20R2%20x64%20Standard-2_thumb.jpg
[2] https://gist.github.com/761eae49a1145aa3133e


On Wednesday, October 19, 2011 at 12:52 AM, 

 wrote:

> 
> 
> hello. this still isn't working for me: updating Windows hostname using
> powershell via chef isn't working. can anyone lend a hand?
> 
> debug output of the initial chef-client run on a newly launched
> windows ec2 instance can be seen here:
> http://groknaut.net/chef-windows-rehostname.txt
> 
> in that output, i notice how it's invoked and that it ran successfully:
> [Tue, 18 Oct 2011 21:22:54 -0700] INFO: powershell[update-hostname] 
> sh(c:/windows/system32/WindowsPowershell/v1.0/powers
> hell.exe -ExecutionPolicy RemoteSigned -Command "& { 
> C:\DOCUME~1\ops\LOCALS~1\Temp\1\chef-script20111018-2940-1y3pd5y-0.ps1 }")
> [Tue, 18 Oct 2011 21:22:55 -0700] INFO: powershell[update-hostname] ran 
> successfully
> 
> 
> if it would help reveal what's going on, how could i run that by hand?
> this file is no longer present:
> C:\DOCUME~1\ops\LOCALS~1\Temp\1\chef-script20111018-2940-1y3pd5y-0.ps1
> i wonder if i can tell chef-client to leave that temp file in place so
> i can try to invoke it. if i had that file, how do i run it by hand? some
> kind of ruby/chef-client/shell_out handwave handwave..?
> 
> 
> 
> details:
> 
> using the powershell cookbook, i'm trying to cause a newly launched
> ec2 instance to update its hostname based on userdata, but it's not
> working. (i *did* use ec2configservice to allow hostname updates.)
> 
> when i run the powershell script within powershell it works. i reboot
> the host, and indeed it comes back up with the new name. but when i try
> to run this powershell script via chef, the instance reboots, but it
> doesn't come back with the new name.
> 
> below i show my recipe and the powershell script itself. any advice?
> 
> 
> notice in the recipe i've tried to call the powershell script using
> 2 different methods (one is commented out in the recipe). neither
> are working. are both invocations valid?
> 
> i also tried removing parts of the script that would write to STDOUT,
> in case that was making chef unhappy. didn't seem to help.
> 
> 
> 
> node info:
> ###################################################################
> [cheftain01]$ knife node show ip-DEADBEEF.ec2.internal
> Node Name: ip-DEADBEEF.ec2.internal
> Environment: _default
> FQDN: ip-DEADBEEF.ec2.internal
> IP: 50.17.113.175
> Run List: role[winpower]
> Roles: winpower
> Recipes: windows::default, windows::reboot_handler, powershell::default, 
> powershell::rehostname
> Platform: windows 5.2.3790
> 
> 
> recipe:
> ###################################################################
> # Cookbook Name:: powershell
> # Recipe:: rehostname
> #
> 
> windows_reboot 300 do
> reason 'Because chef said so'
> action :nothing
> end
> windows_reboot 30 do
> action :cancel
> end
> 
> powershell "update-hostname" do
> powershell_script = <<'POWERSHELL_SCRIPT'
> $webclient = new-object system.net.webclient
> $awsurl = "http://169.254.169.254/latest/user-data";
> $userdata ="c:\Local\Chef\userdata.txt"
> $webClient.DownloadFile("$awsurl","$userdata")
> # -r foo -h sous-chef-win -e trex -c trex
> $namefromuserdata = Get-Content $userdata | %{ $_.Split(' ')[3]; }
> $computername = Get-Content env:computername
> Write-Host -ForegroundColor Yellow "userdata: $namefromuserdata...."
> Write-Host -ForegroundColor Yellow "computername: $computername...."
> if ( $namefromuserdata -ine $computername )
> {
> Write-Host -ForegroundColor Green "renaming $computername to 
> $namefromuserdata."
> $sysInfo = Get-WmiObject -Class Win32_ComputerSystem
> $result = $sysInfo.Rename($namefromuserdata)
> switch($result.ReturnValue)
> {
> 0 { Write-Host -ForegroundColor Green "Success: renamed $computername to 
> $namefromuserdata." }
> 5 { Write-Host -ForegroundColor Red "This cmdlet must be execute with 
> administrative privileges" }
> default { Write-Host -ForegroundColor Red "Error" } 
> } 
> }
> else { Write-Host -ForegroundColor Green "NOT renaming $computername to 
> $namefromuserdata." }
> POWERSHELL_SCRIPT
> notifies :request, 'windows_reboot[300]'
> #notifies :create, "ruby_block[remove_rehostname]", :immediately
> creates "C:\\Local\\Chef\\hostname-updated.txt"
> end
> 
> =begin
> powershell "update-hostname" do
> command "C:\\Local\\bin\\update-hostname.ps1"
> action :run
> notifies :request, 'windows_reboot[30]'
> end
> =end
> 
> # not working yet:
> ruby_block "remove_rehostname" do
> block do
> Chef::Log.info (http://Log.info)("Recipe rehostname completed, removing the 
> destructive recipe[powershell::rehostname]")
> node.run_list.remove("recipe[powershell::rehostname]") if 
> node.run_list.include?("recipe[powershell::rehostname]")
> end
> action :nothing
> end
> 
> 
> 
> update-hostname.ps1:
> ###################################################################
> $webclient = new-object system.net.webclient
> $awsurl = "http://169.254.169.254/latest/user-data";
> $userdata ="c:\Local\Chef\userdata.txt"
> $webClient.DownloadFile("$awsurl","$userdata")
> # in our userdata, hostname is the 4th element in array:
> $namefromuserdata = Get-Content $userdata | %{ $_.Split(' ')[3]; }
> $computername = Get-Content env:computername
> Write-Host -ForegroundColor Yellow "userdata: $namefromuserdata...."
> Write-Host -ForegroundColor Yellow "computername: $computername...."
> if ( $namefromuserdata -ine $computername )
> {
> Write-Host -ForegroundColor Green "renaming $computername to 
> $namefromuserdata."
> $sysInfo = Get-WmiObject -Class Win32_ComputerSystem
> $result = $sysInfo.Rename($namefromuserdata)
> switch($result.ReturnValue)
> { 
> 0 { Write-Host -ForegroundColor Green "Success: renamed $computername to 
> $namefromuserdata." }
> 5 { Write-Host -ForegroundColor Red "This cmdlet must be execute with 
> administrative privileges" }
> default { Write-Host -ForegroundColor Red "Error" }
> }
> 
> else { Write-Host -ForegroundColor Green "NOT renaming $computername to 
> $namefromuserdata." }
> 
> 
> 
> thanks,
> kallen






Archive powered by MHonArc 2.6.16.

§