Install ViMbAdmin with Chef
Two years ago I wrote a tutorial to install a complete Postfix mail server with Dovecot, SpamAssassin and ViMbAdmin. At the moment I am automating this tutorial for CentOS 7 with Chef. For ViMbAdmin I created a recipe that clones the ViMbAdmin repository from Github, puts the configuration files from templates, creates the database, tables and inserts an admin user into the database. I thought it would be nice to share my vimbadmin recipe:
vimbadmin.rb
chef_gem 'bcrypt'
require 'bcrypt'
# Clone ViMbAdmin files
git node['my-mailserver']['vimbadmin']['dir'] do
repository node['my-mailserver']['vimbadmin']['repo']['url']
reference node['my-mailserver']['vimbadmin']['repo']['reference']
action :sync
end
# Put configuration
template "#{node['my-mailserver']['vimbadmin']['dir']}/application/configs/application.ini" do
source 'vimbadmin/application.ini.erb'
owner node['my-webserver']['user']
group node['my-webserver']['group']
mode '0440'
end
# Put .htaccess
template "#{node['my-mailserver']['vimbadmin']['dir']}/public/.htaccess" do
source 'vimbadmin/.htaccess.erb'
owner 'root'
group 'root'
mode '0644'
end
# Install composer vendors
composer_project node['my-mailserver']['vimbadmin']['dir'] do
dev true
quiet false
prefer_dist true
action :install
end
# Make the var directory writable for the web server
bash 'vimbadmin file permissions' do
cwd '/tmp'
code <<-EOH
find #{node['my-mailserver']['vimbadmin']['dir']}/var ! -user #{node['my-webserver']['user']} -exec chown #{node['my-webserver']['user']}: {} \\;
EOH
end
include_recipe 'my-dbserver::common'
# Set mysql connection info
mysql_connection_info = {
:host => node['my-mailserver']['vimbadmin']['db']['host'],
:username => 'root',
:password => node['mariadb']['server_root_password']
}
# Grant all privileges the vimbadmin database from localhost and %
%w(localhost %).each do |host|
mysql_database_user node['my-mailserver']['vimbadmin']['db']['username'] do
connection mysql_connection_info
password node['my-mailserver']['vimbadmin']['db']['password']
host host
database_name node['my-mailserver']['vimbadmin']['db']['name']
privileges [:all]
action :grant
end
end
# Create tables
execute 'vimbadmin-create-tables' do
cwd node['my-mailserver']['vimbadmin']['dir']
command './bin/doctrine2-cli.php orm:schema-tool:create'
action :nothing
end
encrypted_password = BCrypt::Password.create(
node['my-mailserver']['vimbadmin']['admin']['password'],
:cost => node['my-mailserver']['vimbadmin']['admin']['password_cost']
)
date_time = Time.now.strftime("%Y-%m-%d %H:%M:%S")
# Insert admin
mysql_database "#{node['my-mailserver']['vimbadmin']['db']['name']}_insert-admin" do
connection mysql_connection_info
database_name node['my-mailserver']['vimbadmin']['db']['name']
sql "INSERT INTO admin (id, username, password, super, active, created, modified) "\
"VALUES (1, '#{node['my-mailserver']['vimbadmin']['admin']['email']}', '#{encrypted_password}', "\
"1, 1, '#{date_time}', '#{date_time}');"
action :nothing
end
# Gather dbversion variables
dbversion = {
'name' => nil,
'number' => nil
}
if File.exist?("#{node['vogentis-mailserver']['vimbadmin']['dir']}/library/ViMbAdmin/Version.php")
File.readlines("#{node['my-mailserver']['vimbadmin']['dir']}/library/ViMbAdmin/Version.php").select do |line|
if line =~ / DBVERSION_NAME /
dbversion['name'] = /'([^']*)'/.match(line).to_s.gsub("'", '')
Chef::Log.debug "Found DBVERSION_NAME: #{dbversion['name']}"
end
if line =~ / DBVERSION /
dbversion['number'] = line.gsub(/\D/, '')
Chef::Log.debug "Found DBVERSION: #{dbversion['number']}"
end
end
end
# Insert dbversion
mysql_database "#{node['my-mailserver']['vimbadmin']['db']['name']}_insert-dbversion" do
connection mysql_connection_info
database_name node['my-mailserver']['vimbadmin']['db']['name']
sql "INSERT INTO dbversion (id, version, name, applied_on) VALUES (1, #{dbversion['number']}, '#{dbversion['name']}', '#{date_time}');"
action :nothing
end
# Create database
mysql_database node['my-mailserver']['vimbadmin']['db']['name'] do
connection mysql_connection_info
action :create
notifies :run, 'execute[vimbadmin-create-tables]', :immediately
notifies :query, "mysql_database[#{node['my-mailserver']['vimbadmin']['db']['name']}_insert-admin]", :immediately
notifies :query, "mysql_database[#{node['my-mailserver']['vimbadmin']['db']['name']}_insert-dbversion]", :immediately
end
require 'bcrypt'
# Clone ViMbAdmin files
git node['my-mailserver']['vimbadmin']['dir'] do
repository node['my-mailserver']['vimbadmin']['repo']['url']
reference node['my-mailserver']['vimbadmin']['repo']['reference']
action :sync
end
# Put configuration
template "#{node['my-mailserver']['vimbadmin']['dir']}/application/configs/application.ini" do
source 'vimbadmin/application.ini.erb'
owner node['my-webserver']['user']
group node['my-webserver']['group']
mode '0440'
end
# Put .htaccess
template "#{node['my-mailserver']['vimbadmin']['dir']}/public/.htaccess" do
source 'vimbadmin/.htaccess.erb'
owner 'root'
group 'root'
mode '0644'
end
# Install composer vendors
composer_project node['my-mailserver']['vimbadmin']['dir'] do
dev true
quiet false
prefer_dist true
action :install
end
# Make the var directory writable for the web server
bash 'vimbadmin file permissions' do
cwd '/tmp'
code <<-EOH
find #{node['my-mailserver']['vimbadmin']['dir']}/var ! -user #{node['my-webserver']['user']} -exec chown #{node['my-webserver']['user']}: {} \\;
EOH
end
include_recipe 'my-dbserver::common'
# Set mysql connection info
mysql_connection_info = {
:host => node['my-mailserver']['vimbadmin']['db']['host'],
:username => 'root',
:password => node['mariadb']['server_root_password']
}
# Grant all privileges the vimbadmin database from localhost and %
%w(localhost %).each do |host|
mysql_database_user node['my-mailserver']['vimbadmin']['db']['username'] do
connection mysql_connection_info
password node['my-mailserver']['vimbadmin']['db']['password']
host host
database_name node['my-mailserver']['vimbadmin']['db']['name']
privileges [:all]
action :grant
end
end
# Create tables
execute 'vimbadmin-create-tables' do
cwd node['my-mailserver']['vimbadmin']['dir']
command './bin/doctrine2-cli.php orm:schema-tool:create'
action :nothing
end
encrypted_password = BCrypt::Password.create(
node['my-mailserver']['vimbadmin']['admin']['password'],
:cost => node['my-mailserver']['vimbadmin']['admin']['password_cost']
)
date_time = Time.now.strftime("%Y-%m-%d %H:%M:%S")
# Insert admin
mysql_database "#{node['my-mailserver']['vimbadmin']['db']['name']}_insert-admin" do
connection mysql_connection_info
database_name node['my-mailserver']['vimbadmin']['db']['name']
sql "INSERT INTO admin (id, username, password, super, active, created, modified) "\
"VALUES (1, '#{node['my-mailserver']['vimbadmin']['admin']['email']}', '#{encrypted_password}', "\
"1, 1, '#{date_time}', '#{date_time}');"
action :nothing
end
# Gather dbversion variables
dbversion = {
'name' => nil,
'number' => nil
}
if File.exist?("#{node['vogentis-mailserver']['vimbadmin']['dir']}/library/ViMbAdmin/Version.php")
File.readlines("#{node['my-mailserver']['vimbadmin']['dir']}/library/ViMbAdmin/Version.php").select do |line|
if line =~ / DBVERSION_NAME /
dbversion['name'] = /'([^']*)'/.match(line).to_s.gsub("'", '')
Chef::Log.debug "Found DBVERSION_NAME: #{dbversion['name']}"
end
if line =~ / DBVERSION /
dbversion['number'] = line.gsub(/\D/, '')
Chef::Log.debug "Found DBVERSION: #{dbversion['number']}"
end
end
end
# Insert dbversion
mysql_database "#{node['my-mailserver']['vimbadmin']['db']['name']}_insert-dbversion" do
connection mysql_connection_info
database_name node['my-mailserver']['vimbadmin']['db']['name']
sql "INSERT INTO dbversion (id, version, name, applied_on) VALUES (1, #{dbversion['number']}, '#{dbversion['name']}', '#{date_time}');"
action :nothing
end
# Create database
mysql_database node['my-mailserver']['vimbadmin']['db']['name'] do
connection mysql_connection_info
action :create
notifies :run, 'execute[vimbadmin-create-tables]', :immediately
notifies :query, "mysql_database[#{node['my-mailserver']['vimbadmin']['db']['name']}_insert-admin]", :immediately
notifies :query, "mysql_database[#{node['my-mailserver']['vimbadmin']['db']['name']}_insert-dbversion]", :immediately
end