### Knife now prefers to use `config.rb` rather than `knife.rb`
Knife will now look for `config.rb` in preference to `knife.rb` for its
configuration file. The syntax and configuration options available in
`config.rb` are identical to `knife.rb`. Also, the search path for
configuration files is unchanged.
At this time, it is _recommended_ that users use `config.rb` instead of
`knife.rb`, but `knife.rb` is not deprecated; no warning will be emitted
when using `knife.rb`. Once third-party application developers have had
sufficient time to adapt to the change, `knife.rb` will become
deprecated and config.rb will be preferred.
### value_for_platform Method
- where "platform"
can be a comma-separated list, each specifying a platform, such as Red Hat, openSUSE, or Fedora, version
specifies the version of that platform, and value
specifies the value that will be used if the node's platform matches the value_for_platform
method. If each value only has a single platform, then the syntax is like the following:
+ where platform
can be a comma-separated list, each specifying a platform, such as Red Hat, openSUSE, or Fedora, version
specifies either the exact version of that platform, or a constraint to match the platform's version against. The following rules apply to constraint matches:
+ * Exact matches take precedence no matter what, and should never throw exceptions.
+ * Matching multiple constraints raises a RuntimeError
.
+ * The following constraints are allowed: <,<=,>,>=,~>
.
+
+ The following is an example of using the method with constraints:
+
+ ```ruby
+ value_for_platform(
+ "os1" => {
+ "< 1.0" => "less than 1.0",
+ "~> 2.0" => "version 2.x",
+ ">= 3.0" => "version 3.0",
+ "3.0.1" => "3.0.1 will always use this value" }
+ )
+ ```
+ If each value only has a single platform, then the syntax is like the following:
### environment attribute to git provider
Similar to other environment options:
```
environment Hash of environment variables in the form of {"ENV_VARIABLE" => "VALUE"}.
```
Also the `user` attribute should mention the setting of the HOME env var:
```
user The system user that is responsible for the checked-out code. The HOME environment variable will automatically be
set to the home directory of this user when using this option.
```
### Metadata `name` Attribute is Required.
Current documentation states:
> The name of the cookbook. This field is inferred unless specified.
This is no longer correct as of 12.0. The `name` field is required; if
it is not specified, an error will be raised if it is not specified.
### chef-zero port ranges
- to avoid crashes, by default, Chef will now scan a port range and take the first available port from 8889-9999.
- to change this behavior, you can pass --chef-zero-port=PORT_RANGE (for example, 10,20,30 or 10000-20000) or modify Chef::Config.chef_zero.port to be a po
rt string, an enumerable of ports, or a single port number.
### Encrypted Data Bags Version 3
Encrypted Data Bag version 3 uses [GCM](http://en.wikipedia.org/wiki/Galois/Counter_Mode) internally. Ruby 2 and OpenSSL version 1.0.1 or higher are required to use it.
### New windows_service resource
The windows_service resource inherits from the service resource and has all the same options but adds an action and attribute.
action :configure_startup - sets the startup type on the resource to the value of the `startup_type` attribute
attribute startup_type - the value as a symbol that the startup type should be set to on the service, valid options :automatic, :manual, :disabled
Note that the service resource will also continue to set the startup type to automatic or disabled, respectively, when the enabled or disabled actions are used.
### Fetch encrypted data bag items with dsl method
DSL method `data_bag_item` now takes an optional String parameter `secret`, which is used to interact with encrypted data bag items.
If the data bag item being fetched is encrypted and no `secret` is provided, Chef looks for a secret at `Chef::Config[:encrypted_data_bag_secret]`.
If `secret` is provided, but the data bag item is not encrypted, then a regular data bag item is returned (no decryption is attempted).
### Enhanced search functionality: result filtering
#### Use in recipes
`Chef::Search::Query#search` can take an optional `:filter_result` argument which returns search data in the form of the Hash specified. Suppose your data looks like
```json
{"languages": {
"c": {
"gcc": {
"version": "4.6.3",
"description": "gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) "
}
},
"ruby": {
"platform": "x86_64-linux",
"version": "1.9.3",
"release_date": "2013-11-22"
},
"perl": {
"version": "5.14.2",
"archname": "x86_64-linux-gnu-thread-multi"
},
"python": {
"version": "2.7.3",
"builddate": "Feb 27 2014, 19:58:35"
}
}}
```
for a node running Ubuntu named `node01`, and you want to get back only information on which versions of c and ruby you have. In a recipe you would write
```ruby
search(:node, "platform:ubuntu", :filter_result => {"c_version" => ["languages", "c", "gcc", "version"],
"ruby_version" => ["languages", "ruby", "version"]})
```
and receive
```ruby
[
{"url" => "https://api.opscode.com/organization/YOUR_ORG/nodes/node01",
"data" => {"c_version" => "4.6.3", "ruby_version" => "1.9.3"},
# snip other Ubuntu nodes
]
```
If instead you wanted all the languages data (remember, `"languages"` is only one tiny piece of information the Chef Server stores about your node), you would have `:filter_result => {"languages" => ["laguages"]}` in your search query.
For backwards compatibility, a `partial_search` method has been added to `Chef::Search::Query` which can be used in the same way as the `partial_search` method from the [partial_search cookbook](https://supermarket.getchef.com/cookbooks/partial_search). Note that this method has been deprecated and will be removed in future versions of Chef.
#### Use in knife
Search results can likewise be filtered by adding the `--filter-result` (or `-f`) option. Considering the node data above, you can use `knife search` with filtering to extract the c and ruby versions on your Ubuntu platforms:
```bash
$ knife search node "platform:ubuntu" --filter-result "c_version:languages.c.gcc.version, ruby_version:languages.ruby.version"
1 items found
:
c_version: 4.6.3
ruby_version: 1.9.3
$
```