
Chef Infrastructure Automation Cookbook Second Edition
By :

Having separate environments for development, testing, and production are good ways to be able to develop and test cookbook updates and other configuration changes in isolation. Chef enables you to group your nodes into separate environments so as to support an ordered development flow.
For the following examples, I assume that you have a node named server
in the _default
environment and that you have at least one cookbook (I'll use the ntp
cookbook) registered with your Chef server.
Let's see how to manipulate environments using knife.
This is only a good idea if you want to play around. For serious work, please create files describing your environments and put them under version control as described in the There's more... section of this recipe.
Make sure you've set your EDITOR
environment variable to your preferred one.
mma@laptop:~/chef-repo $ knife environment create book
{ "name": "book", "description": "", "cookbook_versions": { }, "json_class": "Chef::Environment", "chef_type": "environment", "default_attributes": { }, "override_attributes": { } } Created book
mma@laptop:~/chef-repo $ knife environment list
_default book
mma@laptop:~/chef-repo $ knife node list
server
server
is not in the book
environment yet by listing nodes in the book
environment only:mma@laptop:~/chef-repo $ knife node list -E book mma@laptop:~/chef-repo $
server
to book
using knife:mma@laptop:~/chef-repo $ knife node environment set server book
server: chef_environment: book
book
environment again:mma@laptop:~/chef-repo $ knife node list -E book
server
mma@laptop:~/chef-repo $ knife environment edit book
{ "name": "book", "description": "", "cookbook_versions": { "ntp": "1.6.8" }, "json_class": "Chef::Environment", "chef_type": "environment", "default_attributes": { }, "override_attributes": { "ntp": { "servers": ["0.europe.pool.ntp.org", "1.europe.pool.ntp.org", "2.europe.pool.ntp.org", "3.europe.pool.ntp.org"] } } } Saved book
A common use of environments is to promote cookbook updates from development to staging and then into production. Additionally, they enable you to use different cookbook versions on separate sets of nodes and environment-specific attributes. You might have nodes with lesser memory in your staging environment as in your production environment. By using environment-specific default attributes, you can, for example, configure your MySQL service to consume lesser memory on staging than on production.
The Chef server always has an environment called _default
, which cannot be edited or deleted. All the nodes go in there if you don't specify any other environment.
Be aware that roles are not environment-specific. You may use environment-specific run lists, though.
The node's environment can be queried using the node.chef_environment
method inside your cookbooks.
If you want your environments to be under version control (and you should), a better way to create a new environment is to create a new Ruby file in the environments
directory inside your Chef repository:
mma@laptop:~/chef-repo $ cd environments mma@laptop:~/chef-repo $ subl book.rb name "book"
You should add, commit, and push your new environment file to GitHub:
mma@laptop:~/chef-repo $ git add environments/book.rb mma@laptop:~/chef-repo $ git commit -a -m "the book env" mma@laptop:~/chef-repo $ git push
Now, can create the environment on the Chef server from the newly created file using knife:
mma@laptop:~/chef-repo $ knife environment from file book.rb Created Environment book
You have to deal with two artifact storages here. You have to use your version control system and knife / Berkshelf to sync your local changes to your Chef server. The Chef server is not aware of any changes that you do when using your version control system and vice versa.
There is a way to migrate all the nodes from one environment to another by using knife exec
:
mma@laptop:~/chef-repo $ knife exec -E 'nodes.transform("chef_environment:_default") { |n| n.chef_environment("book")
You can limit your search for nodes in a specific environment:
mma@laptop:~/chef-repo $ knife search node "chef_environment:book"
1 item found
Change the font size
Change margin width
Change background colour