Installing LAMP stack through Chef
Chef as we all know is a Configuration Management Tool. It enables Infrastructure as Code.
Recently I had to give a technical presentation on Chef in my current organization which helped me to get some insights into how Chef works & how it eases the deployment process.
In this article I would touch upon very basic entities associated with Chef & how to deploy a complete LAMP stack on Chef-solo.
Chef-solo behaves as a standalone system, it is in itself a client & a server.
Knife is the most important part of Chef as this is the command line tool for chef all the deployment from Chef server to Chef client happens via knife. In case we want to launch instances in cloud through Chef server we will make use of knife ec2 for AWS instances.
Without wasting any more time let’s move further with the installation steps. For this example I would be Ubuntu 12.04 as the OS
Installing Chef
We can download chef-solo from github.
root@ankush# curl -L https://www.opscode.com/chef/install.sh | bash root@ankush# chef-solo -v root@ankush# wget http://github.com/opscode/chef-repo/tarball/master root@ankush# tar -zxf master root@ankush# mv opscode-chef-repo* chef-repo root@ankush# rm master root@ankush# cd chef-repo root@ankush# ls
Now we would specify the cookbook path under .chef directory in knife.rb file.
root@ankush:~/chef-repo# mkdir .chef root@ankush:~/chef-repo# echo "cookbook_path [ '/root/chef-repo/cookbooks' ]" > .chef/knife.rb
Create any cookbook via knife e.g phpapp
root@ankush:~/chef-repo# knife cookbook create phpapp root@ankush:~/chef-repo# cd cookbooks/phpapp root@ankush:~/chef-repo/cookbooks/phpapp# ls root@ankush:~/chef-repo/cookbooks/phpapp# cd ..
Installing Apache
root@ankush:~/chef-repo/cookbooks# knife cookbook site download apache2 root@ankush:~/chef-repo/cookbooks# tar zxf apache2* root@ankush:~/chef-repo/cookbooks# rm apache2*.tar.gz root@ankush:~/chef-repo/cookbooks# knife cookbook site download apt root@ankush:~/chef-repo/cookbooks# tar zxf apt* root@ankush:~/chef-repo/cookbooks# rm apt*.tar.gzbelow line root@ankush:~/chef-repo/cookbooks# knife cookbook site download iptables root@ankush:~/chef-repo/cookbooks# tar zxf iptables* root@ankush:~/chef-repo/cookbooks# rm iptables*.tar.gz root@ankush:~/chef-repo/cookbooks# knife cookbook site download logrotate root@ankush:~/chef-repo/cookbooks# tar zxf logrotate* root@ankush:~/chef-repo/cookbooks# rm logrotate*.tar.gz root@ankush:~/chef-repo/cookbooks# knife cookbook site download pacman root@ankush:~/chef-repo/cookbooks# tar zxf pacman* root@ankush:~/chef-repo/cookbooks# rm pacman*.tar.gz root@ankush:~/chef-repo/cookbooks# cd phpapp
Open metadata.rb , add below line
depends “apache2″
Open recipes/default.rb , add below lines
include_recipe “apache2″
apache_site “default” do
enable true
end
root@ankush:~/chef-repo/cookbooks/phpapp# cd ../..
Create a new file called solo.rb in your text editor & make below entries
file_cache_path “/root/chef-solo”
cookbook_path “/root/chef-repo/cookbooks”
This file configures chef-solo, telling it where to keep its cache of files and where our cookbooks are.
Now create a file called web.json & add below lines
{
“run_list”: [ “recipe[apt]”, “recipe[phpapp]” ]
}
Why have we not included the apt cookbook inside our recipe as we did with the apache2 cookbook? It’s because our PHP application requires Apache to function but we don’t necessarily want to tie our cookbook to platforms that only support apt.
root@ankush#chef-solo -c solo.rb -j web.json
Now open the page in browser it will show default page for apache.
Installing mysql
root@ankush:~/chef-repo# cd cookbooks root@ankush:~/chef-repo/cookbooks# knife cookbook site download mysql root@ankush:~/chef-repo/cookbooks# tar zxf mysql* root@ankush:~/chef-repo/cookbooks# rm mysql-*.tar.gz root@ankush:~/chef-repo/cookbooks# cd mysql/recipes/ root@ankush:~/chef-repo/cookbooks/mysql/recipes# ls root@ankush:~/chef-repo/cookbooks/mysql/recipes# cd ../../phpapp
Open metadata.rb, add below lines
depends “mysql”
Open recipes/default.rb , add below lines
include_recipe “apache2″
include_recipe “mysql::client” —- This to be added
include_recipe “mysql::server” —- This to be added
apache_site “default” do
enable true
end
Run chef-solo again
root@ankush:~/chef-repo/cookbooks/phpapp# cd ../.. root@ankush:~/chef-repo# chef-solo -c solo.rb -j web.json
You will now get errors like
FATAL: Stacktrace dumped to /root/chef-solo/chef-stacktrace.out
FATAL: Chef::Exceptions::CookbookNotFound: Cookbook build-essential not found. If you’re loading build-essential from another cookbook, make sure you configure the dependency in your metadata
Open cookbooks/mysql/metadata.rb & specify the dependencies
depends “openssl”
depends “build-essential”
root@ankush:~/chef-repo# cd cookbooks root@ankush:~/chef-repo/cookbooks# knife cookbook site download openssl root@ankush:~/chef-repo/cookbooks# tar zxf openssl*.tar.gz root@ankush:~/chef-repo/cookbooks# rm openssl*.tar.gz root@ankush:~/chef-repo/cookbooks# knife cookbook site download build-essential root@ankush:~/chef-repo/cookbooks# tar zxf build-essential-*.tar.gz> root@ankush:~/chef-repo/cookbooks# rm build-essential-*.tar.gz
Now we’ve fulfilled those dependencies let’s try and re-run chef-solo!
root@ankush:~/chef-repo/cookbooks# cd .. root@ankush:~/chef-repo# chef-solo -c solo.rb -j web.json
Again we have an ERROR
FATAL: You must set node[‘mysql’][‘server_debian_password’], node[‘mysql’][‘server_root_password’], node[‘mysql’][‘server_repl_password’] in chef-solo mode. For more information, see https://github.com/opscode-cookbooks/mysql#chef-solo-note
Open web.json to specify the mysql root password
{
“mysql”: {“server_root_password”: “ankush”, “server_debian_password”: “ankush”, “server_repl_password”: “ankush”},
“run_list”: [ “recipe[apt]”, “recipe[phpapp]” ]
}
root@ankush:~/chef-repo# chef-solo -c solo.rb -j web.json
Now to install PHP
root@ankush:~/chef-repo# cd cookbooks/ root@ankush:~/chef-repo/cookbooks# knife cookbook site download php root@ankush:~/chef-repo/cookbooks# tar zxf php*.tar.gz root@ankush:~/chef-repo/cookbooks# rm php*.tar.gz
The php cookbook depends on the xml, yum-epel, windows, and iis cookbooks, so we’ll need those even though we won’t be using all of them. We’ll also have to install sub-dependencies yum (a dependency of yum-epel), chef_handler, and powershell (dependencies of windows).
root@ankush:~/chef-repo/cookbooks# knife cookbook site download xml root@ankush:~/chef-repo/cookbooks# tar zxf xml-*.tar.gz root@ankush:~/chef-repo/cookbooks# knife cookbook site download yum root@ankush:~/chef-repo/cookbooks# tar zxf yum-*.tar.gz root@ankush:~/chef-repo/cookbooks# knife cookbook site download yum-epel root@ankush:~/chef-repo/cookbooks# tar zxf yum-epel-*.tar.gz root@ankush:~/chef-repo/cookbooks# knife cookbook site download powershell root@ankush:~/chef-repo/cookbooks# tar zxf powershell-*.tar.gz root@ankush:~/chef-repo/cookbooks# knife cookbook site download iis root@ankush:~/chef-repo/cookbooks# tar zxf iis-*.tar.gz root@ankush:~/chef-repo/cookbooks# rm *.tar.gz
Let’s use the php cookbook in our cookbook.
root@ankush:~/chef-repo/cookbooks# cd phpapp
Open metadata.rb add below line
depends “php”
Open recipes/default.rb , add below lines
include_recipe “php”
include_recipe “php::module_mysql”
include_recipe “apache2::mod_php5″
Save the file and we’re good to run chef-solo again to install all of those things
root@ankush:~/chef-repo/cookbooks/phpapp# cd ../.. root@ankush:~/chef-repo# chef-solo -c solo.rb -j web.json
So that’s PHP installed. Let’s confirm that by creating a test page. Open /var/www/test.php in your editor.
<?php phpinfo(); ?>
Now goto http://yourserver/test.php , you will see the phpinfo page.
Hi
I tried to download mysql cookbook but in that cookbook their is no recipes for mysql.Also I am facing Permission issue in running apache2. Can anybody help me solving this problem
Lovely site! I am loving it!! Will come back again. I am taking your feeds also.
My spouse and I stumbled over here by a different web address and thought I may as well check things out. I like what I see so i am just following you. Look forward to going over your web page yet again.
Hi there, You’ve done an excellent job. I will definitely digg
it and personally suggest to my friends. I’m confident they will be benefited from this web
site.