A knife.rb file is used to specify the chef-repo-specific configuration details for knife.
A knife.rb file:
~/chef-repo/.chef/knife.rb
(UNIX and Linux platforms) or c:\Users\username\.chef
(Microsoft Windows platform, starting with Chef development kit version 0.7.0); use the --config
option from the command line to change this location--config
optionNote
When running Microsoft Windows, the knife.rb file is located at %HOMEDRIVE%:%HOMEPATH%\chef-repo\.chef
(e.g. c:\Users\<username>\chef-repo\.chef
). If this path needs to be scripted, use %USERPROFILE%\chef-repo\.chef
.
This configuration file has the following settings:
bootstrap_template
chef_server_url
The URL for the Chef server. For example:
chef_server_url 'https://localhost/organizations/ORG_NAME'
chef_zero.enabled
Enable chef-zero. This setting requires local_mode
to be set to true
. Default value: false
. For example:
chef_zero.enabled true
chef_zero[:port]
The port on which chef-zero is to listen. Default value: 8889
. For example:
chef_zero[:port] 8889
client_key
The location of the file that contains the client key. Default value: /etc/chef/client.pem
. For example:
client_key '/etc/chef/client.pem'
cookbook_copyright
cookbook_email
cookbook_license
apachev2
, gplv2
, gplv3
, mit
, or none
(default). This option places the appropriate license notice in the pre-created files: Apache v2.0
(for apachev2
), GPL v2
(for gplv2
), GPL v3
(for gplv3
), MIT
(for mit
), or license 'Proprietary - All Rights Reserved
(for none
). Be aware of the licenses for files inside of a cookbook and be sure to follow any restrictions they describe.cookbook_path
The sub-directory for cookbooks on the chef-client. This value can be a string or an array of file system locations, processed in the specified order. The last cookbook is considered to override local modifications. For example:
cookbook_path [ '/var/chef/cookbooks', '/var/chef/site-cookbooks' ]
data_bag_encrypt_version
The minimum required version of data bag encryption. Possible values: 1
or 2
. When all of the machines in an organization are running chef-client version 11.6 (or higher), it is recommended that this value be set to 2
. For example:
data_bag_encrypt_version 2
fips
true
to enable FIPS-validated security.local_mode
Run the chef-client in local mode. This allows all commands that work against the Chef server to also work against the local chef-repo. For example:
local_mode true
node_name
The name of the node. This may be a username with permission to authenticate to the Chef server or it may be the name of the machine from which knife is run. For example:
node_name 'user_name'
or:
node_name 'machine_name'
no_proxy
A comma-separated list of URLs that do not need a proxy. Default value: nil
. For example:
no_proxy 'localhost, 10.*, *.example.com, *.dev.example.com'
ssh_timeout
ssl_verify_mode
Set the verify mode for HTTPS requests.
:verify_none
to do no validation of SSL certificates.:verify_peer
to do validation of all SSL certificates, including the Chef server connections, S3 connections, and any HTTPS remote_file resource URLs used in the chef-client run. This is the recommended setting.Depending on how OpenSSL is configured, the ssl_ca_path
may need to be specified. Default value: :verify_peer
.
syntax_check_cache_path
tmux_split
false
.validation_client_name
The name of the chef-validator key that is used by the chef-client to access the Chef server during the initial chef-client run. For example:
validation_client_name 'chef-validator'
validation_key
The location of the file that contains the key used when a chef-client is registered with a Chef server. A validation key is signed using the validation_client_name
for authentication. Default value: /etc/chef/validation.pem
. For example:
validation_key '/etc/chef/validation.pem'
verify_api_cert
true
, the chef-client always verifies the SSL certificate. When false
, the chef-client uses the value of ssl_verify_mode
to determine if the SSL certificate requires verification. Default value: false
.versioned_cookbooks
Append cookbook versions to cookbooks. Set to false
to hide cookbook versions: cookbooks/apache
. Set to true
to show cookbook versions: cookbooks/apache-1.0.0
and/or cookbooks/apache-1.0.1
. When this setting is true
, knife download
downloads ALL cookbook versions, which can be useful if a full-fidelity backup of data on the Chef server is required. For example:
versioned_cookbooks true
In certain situations the proxy used by the Chef server requires authentication. In this situation, three settings must be added to the configuration file. Which settings to add depends on the protocol used to access the Chef server: HTTP or HTTPS.
If the Chef server is configured to use HTTP, add the following settings:
http_proxy
The proxy server for HTTP connections. Default value: nil
. For example:
http_proxy 'http://proxy.vmware.com:3128'
http_proxy_user
nil
.http_proxy_pass
nil
.If the Chef server is configured to use HTTPS (such as the hosted Chef server), add the following settings:
https_proxy
nil
.https_proxy_user
nil
.https_proxy_pass
nil
.Use the following setting to specify URLs that do not need a proxy:
no_proxy
nil
.In addition to the default settings in a knife.rb file, there are other subcommand-specific settings that can be added. When a subcommand is run, knife will use:
A value passed via the command line will override a value in the knife.rb file; a value in a knife.rb file will override a default value.
Before adding any settings to the knife.rb file:
Also note that:
To add settings to the knife.rb file, use the following syntax:
knife[:setting_name] = value
where value
may require quotation marks (‘ ‘) if that value is a string. For example:
knife[:ssh_port] = 22 knife[:bootstrap_template] = 'ubuntu14.04-gems' knife[:bootstrap_version] = '' knife[:bootstrap_proxy] = ''
Some of the optional knife.rb settings are used often, such as the template file used in a bootstrap operation. The frequency of use of any option varies from organization to organization, so even though the following settings are often added to a knife.rb file, they may not be the right settings to add for every organization:
knife[:bootstrap_proxy]
knife[:bootstrap_template]
knife[:bootstrap_version]
knife[:editor]
knife[:ssh_gateway]
knife[:ssh_port]
Other SSH-related settings that are sometimes helpful when added to the knife.rb file:
knife[:forward_agent]
knife[:ssh_attribute]
knife[:ssh_password]
knife[:ssh_user]
Some organizations choose to have all data bags use the same secret and secret file, rather than have a unique secret and secret file for each data bag. To use the same secret and secret file for all data bags, add the following to knife.rb:
knife[:secret]
knife[:secret_file]
Some settings are better left to Ohai, which will get the value at the start of the chef-client run:
knife[:server_name]
node_name
When working with chef-container, add the following setting:
knife[:dockerfiles_path]
/var/chef/dockerfiles
.Warning
Review the full list of optional settings that can be added to the knife.rb file. Many of these optional settings should not be added to the knife.rb file. The reasons for not adding them can vary. For example, using --yes
as a default in the knife.rb file will cause knife to always assume that “Y” is the response to any prompt, which may lead to undesirable outcomes. Other settings, such as --hide-healthy
(used only with the knife status
subcommand) or --bare-directories
(used only with the knife list
subcommand) probably aren’t used often enough (and in the same exact way) to justify adding them to the knife.rb file. In general, if the optional settings are not listed on the main knife.rb topic, then add settings only after careful consideration. Do not use optional settings in a production environment until after the setting’s performance has been validated in a safe testing environment.
It is possible for multiple users to access the Chef server using the same knife.rb file. (A user can even access multiple organizations if, for example, each instance of the chef-repo contained the same copy of the knife.rb file.) This can be done by adding the knife.rb file to the chef-repo, and then using environment variables to handle the user-specific credential details and/or sensitive values. For example:
current_dir = File.dirname(__FILE__) user = ENV['OPSCODE_USER'] || ENV['USER'] node_name user client_key "#{ENV['HOME']}/chef-repo/.chef/#{user}.pem" validation_client_name "#{ENV['ORGNAME']}-validator" validation_key "#{ENV['HOME']}/chef-repo/.chef/#{ENV['ORGNAME']}-validator.pem" chef_server_url "https://api.opscode.com/organizations/#{ENV['ORGNAME']}" syntax_check_cache_path "#{ENV['HOME']}/chef-repo/.chef/syntax_check_cache" cookbook_path ["#{current_dir}/../cookbooks"] cookbook_copyright "Your Company, Inc." cookbook_license "apachev2" cookbook_email "[email protected]" # Amazon AWS knife[:aws_access_key_id] = ENV['AWS_ACCESS_KEY_ID'] knife[:aws_secret_access_key] = ENV['AWS_SECRET_ACCESS_KEY'] # Rackspace Cloud knife[:rackspace_api_username] = ENV['RACKSPACE_USERNAME'] knife[:rackspace_api_key] = ENV['RACKSPACE_API_KEY']
© Chef Software, Inc.
Licensed under the Creative Commons Attribution 3.0 Unported License.
The Chef™ Mark and Chef Logo are either registered trademarks/service marks or trademarks/servicemarks of Chef, in the United States and other countries and are used with Chef Inc's permission.
We are not affiliated with, endorsed or sponsored by Chef Inc.
https://docs-archive.chef.io/release/12-13/config_rb_knife.html