Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
A Knife plugin to set node environment
## Knife plugin to set node environment
# See http://wiki.opscode.com/display/chef/Environments
#
## Install
# Place in .chef/plugins/knife/set_environment.rb
#
## Usage
# Nick-Stielaus-MacBook-Pro:chef-repo nstielau$ knife node set_environment mynode.net my_env
# Looking for mynode.net
# Setting environment to my_env
# 1 items found
#
# Node Name: mynode.net
# Environment: my_env
# FQDN: mynode.net
# IP: 66.111.39.46
# Run List: role[base], role[web_app]
# Roles: base, web_app
# Recipes timezone::default, hosts::default, sudo::default, web_app::default
# Platform: ubuntu 10.04
require 'chef/knife'
module SomeNamespace
class NodeSetEnvironment < Chef::Knife
deps do
require 'chef/search/query'
require 'chef/knife/search'
end
banner "knife node set_environment NODE ENVIRONMENT"
def run
unless @node_name = name_args[1]
ui.error "You need to specify a node"
exit 1
end
unless @environment = name_args[2]
ui.error "You need to specify an environment"
exit 1
end
puts "Looking for #{@node_name}"
searcher = Chef::Search::Query.new
result = searcher.search(:node, "name:#{@node_name}")
knife_search = Chef::Knife::Search.new
node = result.first.first
if node.nil?
puts "Could not find a node named #{@node_name}"
exit 1
end
puts "Setting environment to #{@environment}"
node.chef_environment(@environment)
node.save
knife_search = Chef::Knife::Search.new
knife_search.name_args = ['node', "name:#{@node_name}"]
knife_search.run
end
end
end
@mmzoo

This comment has been minimized.

Copy link

mmzoo commented Sep 28, 2011

What I don't understand is: when I run just "knife node" without your plugin, I get the help overview. With the plugin in place, I get "You need to specify a node". How can the plugin break the default behavior of knife? Should the plugin not react once the "set_environment" argument is given?

@nstielau

This comment has been minimized.

Copy link
Owner Author

nstielau commented Sep 28, 2011

It is a little magic how some of this works, but I think that was because the class name was 'Node'. Changing it should fix the issue.

@eherot

This comment has been minimized.

Copy link

eherot commented Dec 20, 2011

Not sure if it's something to do with my ruby version but I had to change name_args[1] and name_args[2] to name_args[0] and name_args[1] for this to work. Before I made this change, I would specify machine and environment and it would tell me:

ERROR: You need to specify an environment

$ knife -v
Chef: 0.10.6

$ ruby -v
ruby 1.8.7 (2010-01-10 patchlevel 249) [universal-darwin11.0]

@miketheman

This comment has been minimized.

Copy link

miketheman commented Dec 29, 2011

@eherot I did the same, and that's what worked. Here: https://gist.github.com/1534766

@ghost

This comment has been minimized.

Copy link

ghost commented Aug 16, 2012

EDITOR="sed -e 's/_default/Production/' -i " knife node edit $(hostname)

@simonmcc

This comment has been minimized.

Copy link

simonmcc commented Apr 3, 2013

Just incase you're running knife from OSX (I kept getting sed -i stdin errors):

EDITOR="perl -p -i -e 's/_default/your-env/'" knife node create $(HOSTNAME)

@paustin01

This comment has been minimized.

Copy link

paustin01 commented Apr 4, 2013

+1 on moving the name_args[] to 0 and 1

@pconerly

This comment has been minimized.

Copy link

pconerly commented Aug 13, 2014

+1 name_args[0] and name_args[1]. It's too bad we can't edit this.

@pconerly

This comment has been minimized.

Copy link

pconerly commented Aug 13, 2014

There's a bug with knife_search? I filed a ticket here: chef/chef#1822

@sacwin

This comment has been minimized.

Copy link

sacwin commented Sep 25, 2014

I think, there are few changes required in the script

unless @node_name = name_args[1] -> unless @node_name = name_args[0]

unless @node_name = name_args[2] -> unless @node_name = name_args[1]

node = result.first.first -> node = result.first[0]

Finally, Instead of the following group of lines:
knife_search = Chef::Knife::Search.new
knife_search.name_args = ['node', "name:#{@node_name}"]
knife_search.run

have these instead:
puts node.chef_environment
puts node.name

It Works perfectly now!!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.