diff --git a/attributes/default.rb b/attributes/default.rb index 3f1493e..e799b60 100644 --- a/attributes/default.rb +++ b/attributes/default.rb @@ -6,7 +6,7 @@ default['zendserver']['basedirdeb'] = 'deb' default['zendserver']['basedirrpm'] = 'rpm' -default['zendserver']['version'] = '6.1' +default['zendserver']['version'] = '6.2' default['zendserver']['phpversion'] = '5.4' # GUI default passwords diff --git a/libraries/zendserver.rb b/libraries/zendserver.rb index f8463ec..6150603 100644 --- a/libraries/zendserver.rb +++ b/libraries/zendserver.rb @@ -11,9 +11,13 @@ def get_node_id_by_name(name, keyname, secret) end def is_server_bootstrapped(keyname, secret) - system_info = "#{node[:zendserver][:zsmanage]} system-info -N #{keyname} -K #{secret} -U http://#{node[:hostname]}:10081/ZendServer/" - p = shell_out(system_info) - !p.stderr.include? "Bootstrap is needed" + system_info = "#{node[:zendserver][:zsmanage]} system-info" + system_info << " -N #{keyname}" unless keyname.nil? || keyname.empty? + system_info << " -K #{secret}" unless secret.nil? || secret.empty? + system_info << " -U http://#{node[:hostname]}:10081/ZendServer/" unless node[:hostname].nil? || node[:hostname].empty? + + p = shell_out(system_info) + !p.stderr.include? "Bootstrap is needed" end def is_node_joined(keyname, secret) @@ -21,3 +25,11 @@ def is_node_joined(keyname, secret) p = shell_out(system_info) p.stdout.include? "ZendServerCluster" end + +CHARS = ('0'..'9').to_a + ('a'..'z').to_a + +def get_random_chef_admin_apikeyname () + apikeyname = "chef-admin-" + apikeyname << CHARS.sort_by { rand }.join[0...8] + apikeyname.to_s +end diff --git a/metadata.rb b/metadata.rb index 6974d38..4353a5f 100644 --- a/metadata.rb +++ b/metadata.rb @@ -4,7 +4,7 @@ license 'All rights reserved' description 'Installs/Configures zendserver' long_description IO.read(File.join(File.dirname(__FILE__), 'README.md')) -version '0.8.0' +version '0.9.0' depends "apt" depends "yum" @@ -135,4 +135,4 @@ :required => "optional", :recipes => [ "zendserver::joincluster" - ] \ No newline at end of file + ] diff --git a/recipes/bootstrapsingle.rb b/recipes/bootstrapsingle.rb index 473015e..3b9d00b 100644 --- a/recipes/bootstrapsingle.rb +++ b/recipes/bootstrapsingle.rb @@ -1,10 +1,23 @@ -# Recipe to bootstrap a single server - +node.default[:zendserver][:chef_admin_apikeyname] = "chef-admin-12345678" +node.default[:zendserver][:chef_admin_apikeysecret] = "00000" + +ruby_block "set chef admin api credentials" do + block do + node.set[:zendserver][:chef_admin_apikeyname] = get_random_chef_admin_apikeyname() + set_api = "#{node[:zendserver][:zsmanage]} api-keys-add-key -n #{node[:zendserver][:chef_admin_apikeyname]} -u admin" + p = Chef::Mixin::ShellOut.shell_out(set_api) + + node.set[:zendserver][:chef_admin_apikeysecret] = p.stdout.split(/\n/).grep(/KEY_HASH/)[0].split(/=/)[1].strip() + end + notifies :run, "execute[bootstrap-single-server]", :immediately + not_if { is_server_bootstrapped(node[:zendserver][:chef_admin_apikeyname], node[:zendserver][:chef_admin_apikeysecret]) } +end + include_recipe "zendserver::manage" - + admin_password = node[:zendserver][:adminpassword] order_number = node[:zendserver][:ordernumber] -license_key = node[:zendserver][:licensekey] +license_key = node[:zendserver][:licensekey] production = node[:zendserver][:production] admin_email = node[:zendserver][:adminemail] dev_password = node[:zendserver][:devpassword] @@ -16,18 +29,9 @@ bs_command << " -e #{admin_email}" unless admin_email.nil? || admin_email.empty? bs_command << " -d #{devpassword}" unless dev_password.nil? || dev_password.empty? - -execute "create-api-key" do - command "/usr/local/zend/bin/zs-manage api-keys-add-key -n #{node[:zendserver][:apikeyname]} -s #{node[:zendserver][:apikeysecret]}" - retries 5 - retry_delay 5 - ignore_failure false - not_if { is_server_bootstrapped(node[:zendserver][:apikeyname], node[:zendserver][:apikeysecret]) } -end - execute "bootstrap-single-server" do - command bs_command + command lazy {bs_command} ignore_failure false - notifies :run, 'execute[restart-api]' - not_if { is_server_bootstrapped(node[:zendserver][:apikeyname], node[:zendserver][:apikeysecret]) } -end + notifies :run, 'execute[restart-api]', :delayed + action :nothing +end \ No newline at end of file diff --git a/recipes/joincluster.rb b/recipes/joincluster.rb index d84facd..3f4c660 100644 --- a/recipes/joincluster.rb +++ b/recipes/joincluster.rb @@ -1,27 +1,27 @@ #This recipe is used to join a cluster of Zend Servers -key_name = node[:zendserver][:apikeyname] -key_secret = node[:zendserver][:apikeysecret] -db_host = node[:zendserver][:dbhost] -db_user = node[:zendserver][:dbusername] -db_pass = node[:zendserver][:dbpassword] -node_ip = node[:zendserver][:node_ip].nil? ? node['ipaddress'] : node[:zendserver][:node_ip] +ruby_block "server add to cluster" do + block do + apikeyname = node[:zendserver][:chef_admin_apikeyname] + apikeysecret = node[:zendserver][:chef_admin_apikeysecret] + dbhost = node[:zendserver][:dbhost] + dbusername = node[:zendserver][:dbusername] + dbpassword = node[:zendserver][:dbpassword] + node_ip = node[:zendserver][:node_ip].nil? ? node['ipaddress'] : node[:zendserver][:node_ip] -Log "Using ip: #{node_ip}" - -# check before install that a suitable key is provided, if not bail out -Chef::Application.fatal!("Zend Server db_host missing", 2) if db_host.nil? || db_host.empty? -Chef::Application.fatal!("Zend Server db_user missing", 2) if db_user.nil? || db_user.empty? -Chef::Application.fatal!("Zend Server db_pass missing", 2) if db_pass.nil? || db_pass.empty? - -join_command = "#{node[:zendserver][:zsmanage]} server-add-to-cluster -N #{key_name} -K #{key_secret} -U http://#{node[:hostname]}:10081/ZendServer/ -n #{node['hostname']} -i #{node_ip} -o #{db_host} -u #{db_user} -p #{db_pass} -s" - -log "Adding server node to cluster - Executing #{join_command}" if !is_node_joined(key_name, key_secret) - -execute "cluster-join-server" do - command join_command - ignore_failure false - retries 5 - retry_delay 3 - not_if { is_node_joined(key_name, key_secret) } + # check before install that a suitable key is provided, if not bail out + Chef::Application.fatal!("Zend Server API Key Name missing", 2) if apikeyname.nil? || apikeyname.empty? + Chef::Application.fatal!("Zend Server API Key Secret missing", 2) if apikeysecret.nil? || apikeysecret.empty? || apikeysecret == "00000" + Chef::Application.fatal!("Zend Server dbhost missing", 2) if dbhost.nil? || dbhost.empty? + Chef::Application.fatal!("Zend Server dbhost missing", 2) if dbhost.nil? || dbhost.empty? + Chef::Application.fatal!("Zend Server dbusername missing", 2) if dbusername.nil? || dbusername.empty? + Chef::Application.fatal!("Zend Server dbpassword missing", 2) if dbpassword.nil? || dbpassword.empty? + + join_command = "#{node[:zendserver][:zsmanage]} server-add-to-cluster -N #{apikeyname} -K #{apikeysecret} -n #{node['hostname']} -i #{node_ip} -o #{dbhost} -u #{dbusername} -p #{dbpassword} -s" + p = Chef::Mixin::ShellOut.shell_out(join_command) + + node.set[:zendserver][:chef_admin_apikeyname] = p.stdout.split(/\n/).grep(/WEB_API_KEY/)[0].split(/=/)[1].strip() + node.set[:zendserver][:chef_admin_apikeysecret] = p.stdout.split(/\n/).grep(/WEB_API_KEY_HASH/)[0].split(/=/)[1].strip() + end + not_if { is_node_joined(node[:zendserver][:chef_admin_apikeyname], node[:zendserver][:chef_admin_apikeysecret]) } end \ No newline at end of file diff --git a/recipes/manage.rb b/recipes/manage.rb index 146dafa..cda9c35 100644 --- a/recipes/manage.rb +++ b/recipes/manage.rb @@ -3,7 +3,7 @@ execute "restart-api" do action :nothing - command "#{node[:zendserver][:zsmanage]} #{restart} -N #{node[:zendserver][:apikeyname]} -K #{node[:zendserver][:apikeysecret]}" + command lazy {"#{node[:zendserver][:zsmanage]} #{restart} -N #{node[:zendserver][:chef_admin_apikeyname]} -K #{node[:zendserver][:chef_admin_apikeysecret]} "} retries 3 retry_delay 3 end \ No newline at end of file