Chef Resources
Common Functionality
* [Refer Here](https://docs.chef.io/resources/) for official docs
* Common Functionalities are available for all resources
- Actions: The action :nothing
service 'apache2' do
action :nothing
end
- Properties:
- ignore_failure: If this property is set to true chef will not stop executing on failure
- retries: The number of attempts to catch exceptions and retry
- retry_delay: The retry delay in seconds
- sensitive:
- Example with common properties
apt_update 'ubuntu packages' do
ignore_failure true
action :update
end
chef generate -b lampstack
- Now make changes to kitchen.yaml file to create two platforms
- Now execute
berks install
kitchen create
kitchen list
- Now lets create a recipe for apache & php packages call this as lamp
chef generate recipe . lamp
- Now add an attribute file default
chef generate attribute . default
- Make changes to attributes\default.rb with
if platform?('ubuntu')
default['lampstack']['apache']['package'] = 'apache2'
default['lampstack']['apache']['php_package'] = %w(php libapache2-mod-php php-mysql php-cli)
elsif platform?('redhat')
default['lampstack']['apache']['package'] = 'httpd'
default['lampstack']['apache']['php_package'] = %w(php php-mysqlnd php-fpm)
end
- Make changes to recipes\lamp.rb
#
# Cookbook:: .
# Recipe:: lamp
#
# Copyright:: 2020, The Authors, All Rights Reserved.
apache_package = node['lampstack']['apache']['package']
php_packages = node['lampstack']['apache']['php_package']
apt_update 'ubuntu package update' do
ignore_failure true
action :update
only_if { platform?('ubuntu') }
end
package apache_package do
action :install
end
service apache_package do
action :enable
end
package php_packages do
action :install
end
service 'restart apache' do
service_name apache_package
action :restart
end
- Now make changes to recipes\default.rb
if platform?('ubuntu') || platform?('redhat')
include_recipe 'lampstack::lamp'
else
Chef::Application.fatal!('This cookbook supports redhat and ubuntu platforms')
end
- Now lets converge our resources using kitchen
kitchen converge
- Now execute
kitchen list
- Now the problem in the current recipe is we are writing the same resource service twice
- Chef has a concept of Notifications.
Chef Notifications
- Notification is a property on resource that listens to other resources in resource collection & takes action based on notification type.
- Two kinds of notifications
- Refer Here
- Now implementing notifications in lamp.rb will help to reuse service resource
#
# Cookbook:: .
# Recipe:: lamp
#
# Copyright:: 2020, The Authors, All Rights Reserved.
apache_package = node['lampstack']['apache']['package']
php_packages = node['lampstack']['apache']['php_package']
apt_update 'ubuntu package update' do
ignore_failure true
action :update
only_if { platform?('ubuntu') }
end
package apache_package do
action :install
notifies :enable, "service[#{apache_package}]"
end
service apache_package do
action :nothing
end
package php_packages do
action :install
notifies :restart, "service[#{apache_package}]", :immediately
end
- Lets add the last step of creating a file with below content in /var/www/html/info.php
<?php
phpinfo();
?>
- Now the recipe will look like
#
# Cookbook:: .
# Recipe:: lamp
#
# Copyright:: 2020, The Authors, All Rights Reserved.
apache_package = node['lampstack']['apache']['package']
php_packages = node['lampstack']['apache']['php_package']
apt_update 'ubuntu package update' do
ignore_failure true
action :update
only_if { platform?('ubuntu') }
end
package apache_package do
action :install
notifies :enable, "service[#{apache_package}]"
end
service apache_package do
action :nothing
end
package php_packages do
action :install
notifies :restart, "service[#{apache_package}]"
end
file '/var/www/html/info.php' do
content '<?php phpinfo(); ?>'
action :create
notifies :restart, "service[#{apache_package}]", :immediately
end
- Now converge and verify info.php at
http://public-ip/info.php

- Since cookbook is working now upload cookbook to chef server
berks upload
- Destroy the test kitchen instances
kitchen destroy