Module: Beaker::DSL::InstallUtils::PEUtils
- Includes:
- AIODefaults, PEDefaults, PuppetUtils
- Included in:
- Beaker::DSL::InstallUtils
- Defined in:
- lib/beaker/dsl/install_utils/pe_utils.rb
Overview
This module contains methods to help installing/upgrading PE builds - including Higgs installs
To mix this is into a class you need the following:
- a method hosts that yields any hosts implementing Host's interface to act upon.
- a method options that provides an options hash, see Options::OptionsHash
- the module Roles that provides access to the various hosts implementing Host's interface to act upon
- the module Wrappers the provides convenience methods for Command creation
Constant Summary
Constants included from PEDefaults
Beaker::DSL::InstallUtils::PEDefaults::PE_DEFAULTS
Constants included from AIODefaults
Instance Method Summary collapse
-
#configure_pe_defaults_on(hosts) ⇒ Object
Set defaults and PATH for these hosts to be either pe or aio, have host == aio for aio settings, defaults to pe.
-
#create_agent_specified_arrays(hosts) ⇒ Array<Host>
private
Builds the agent_only and not_agent_only arrays needed for installation.
-
#deploy_frictionless_to_master(host) ⇒ Object
private
Classify the master so that it can deploy frictionless packages for a given host.
-
#do_higgs_install(host, opts) ⇒ Object
private
Perform a Puppet Enterprise Higgs install up until web browser interaction is required, runs on linux hosts only.
-
#do_install(hosts, opts = {}) ⇒ Object
private
Perform a Puppet Enterprise upgrade or install to other settings whether the 32 or 64bit install is used.
-
#fetch_and_push_pe(host, path, filename, extension, local_dir = 'tmp/pe') ⇒ Object
private
Grabs the pe file from a remote host to the machine running Beaker, then scp's the file out to the host.
-
#fetch_pe(hosts, opts) ⇒ Object
private
Determine the PE package to download/upload per-host, download/upload that package onto the host and unpack it.
-
#fetch_pe_on_mac(host, opts) ⇒ Object
private
Determine the PE package to download/upload on a mac host, download/upload that package onto the host.
-
#fetch_pe_on_unix(host, opts) ⇒ Object
private
Determine the PE package to download/upload on a unix style host, download/upload that package onto the host and unpack it.
-
#fetch_pe_on_windows(host, opts) ⇒ Object
private
Determine the PE package to download/upload on a windows host, download/upload that package onto the host.
-
#higgs_installer_cmd(host) ⇒ Object
private
Create the Higgs install command string based upon the host and options settings.
-
#install_higgs(higgs_host = master) ⇒ Object
Install Higgs up till the point where you need to continue installation in a web browser, defaults to execution on the master node.
-
#install_pe ⇒ Object
Install PE based on global hosts with global options.
-
#install_pe_on(hosts, opts) ⇒ Object
Install PE based upon host configuration and options.
-
#installer_cmd(host, opts) ⇒ Object
private
Create the PE install command string based upon the host and options settings.
-
#setup_defaults_and_config_helper_on(host, master, acceptable_exit_codes = nil) ⇒ Object
private
Helper for setting up pe_defaults & setting up the cert on the host.
-
#upgrade_pe(path = nil) ⇒ Object
Upgrade PE based upon global host configuration and global options.
-
#upgrade_pe_on(hosts, opts, path = nil) ⇒ Object
Upgrade PE based upon host configuration and options.
Methods included from PuppetUtils
#add_puppet_paths_on, #configure_defaults_on, #construct_puppet_path, #remove_defaults_on, #remove_puppet_paths_on
Methods included from PEDefaults
#add_pe_defaults_on, #add_platform_pe_defaults, #remove_pe_defaults_on, #remove_platform_pe_defaults
Methods included from AIODefaults
#add_aio_defaults_on, #add_platform_aio_defaults, #remove_aio_defaults_on, #remove_platform_aio_defaults
Instance Method Details
#configure_pe_defaults_on(hosts) ⇒ Object
Set defaults and PATH for these hosts to be either pe or aio, have host == aio for aio settings, defaults to pe.
27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/beaker/dsl/install_utils/pe_utils.rb', line 27 def configure_pe_defaults_on( hosts ) block_on hosts do |host| if host[:pe_ver] && aio_version?(host) or (host['type'] && host['type'] =~ /aio/) add_aio_defaults_on(host) # provide a sane default here for puppetservice host['puppetservice'] ||= 'pe-puppetserver' else add_pe_defaults_on(host) end # add pathing env add_puppet_paths_on(host) end end |
#create_agent_specified_arrays(hosts) ⇒ Array<Host>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
should only be called against versions 4.0+, as this method assumes AIO packages will be required.
agent_only hosts with the :pe_ver setting < 4.0 will not be included in the agent_only array, as AIO install can only happen in versions > 4.0
Builds the agent_only and not_agent_only arrays needed for installation.
512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 |
# File 'lib/beaker/dsl/install_utils/pe_utils.rb', line 512 def create_agent_specified_arrays(hosts) hosts_agent_only = [] hosts_not_agent_only = [] non_agent_only_roles = %w(master database dashboard console frictionless) hosts.each do |host| if host['roles'].none? {|role| non_agent_only_roles.include?(role) } if !aio_version?(host) hosts_not_agent_only << host else hosts_agent_only << host end else hosts_not_agent_only << host end end return hosts_agent_only, hosts_not_agent_only end |
#deploy_frictionless_to_master(host) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Classify the master so that it can deploy frictionless packages for a given host.
291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 |
# File 'lib/beaker/dsl/install_utils/pe_utils.rb', line 291 def deploy_frictionless_to_master(host) klass = host['platform'].gsub(/-/, '_').gsub(/\./,'') klass = "pe_repo::platform::#{klass}" if version_is_less(host['pe_ver'], '3.8') # use the old rake tasks on dashboard, "cd /opt/puppet/share/puppet-dashboard && /opt/puppet/bin/bundle exec /opt/puppet/bin/rake nodeclass:add[#{klass},skip]" on dashboard, "cd /opt/puppet/share/puppet-dashboard && /opt/puppet/bin/bundle exec /opt/puppet/bin/rake node:add[#{master},,,skip]" on dashboard, "cd /opt/puppet/share/puppet-dashboard && /opt/puppet/bin/bundle exec /opt/puppet/bin/rake node:addclass[#{master},#{klass}]" on master, puppet("agent -t"), :acceptable_exit_codes => [0,2] else # the new hotness begin require 'scooter' rescue LoadError => e @logger.notify('WARNING: gem scooter is required for frictionless installation post 3.8') raise e end dispatcher = Scooter::HttpDispatchers::ConsoleDispatcher.new(dashboard) # Check if we've already created a frictionless agent node group # to avoid errors creating the same node group when the beaker hosts file contains # multiple hosts with the same platform node_group = dispatcher.get_node_group_by_name('Beaker Frictionless Agent') if node_group.nil? || node_group.empty? node_group = {} node_group['name'] = "Beaker Frictionless Agent" # Pin the master to the node node_group['rule'] = [ "and", [ '=', 'name', master.to_s ]] node_group['classes'] ||= {} end # add the pe_repo platform class node_group['classes'][klass] = {} dispatcher.create_new_node_group_model(node_group) on master, puppet("agent -t"), :acceptable_exit_codes => [0,2] end end |
#do_higgs_install(host, opts) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Perform a Puppet Enterprise Higgs install up until web browser interaction is required, runs on linux hosts only.
667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 |
# File 'lib/beaker/dsl/install_utils/pe_utils.rb', line 667 def do_higgs_install host, opts use_all_tar = ENV['PE_USE_ALL_TAR'] == 'true' platform = use_all_tar ? 'all' : host['platform'] version = host['pe_ver'] || opts[:pe_ver] host['dist'] = "puppet-enterprise-#{version}-#{platform}" use_all_tar = ENV['PE_USE_ALL_TAR'] == 'true' host['pe_installer'] ||= 'puppet-enterprise-installer' host['working_dir'] = host.tmpdir(Time.new.strftime("%Y-%m-%d_%H.%M.%S")) fetch_pe([host], opts) host['higgs_file'] = "higgs_#{File.basename(host['working_dir'])}.log" on host, higgs_installer_cmd(host), opts #wait for output to host['higgs_file'] #we're all done when we find this line in the PE installation log higgs_re = /Please\s+go\s+to\s+https:\/\/.*\s+in\s+your\s+browser\s+to\s+continue\s+installation/m res = Result.new(host, 'tmp cmd') tries = 10 attempts = 0 prev_sleep = 0 cur_sleep = 1 while (res.stdout !~ higgs_re) and (attempts < tries) res = on host, "cd #{host['working_dir']}/#{host['dist']} && cat #{host['higgs_file']}", :accept_all_exit_codes => true attempts += 1 sleep( cur_sleep ) prev_sleep = cur_sleep cur_sleep = cur_sleep + prev_sleep end if attempts >= tries raise "Failed to kick off PE (Higgs) web installation" end end |
#do_install(hosts, opts = {}) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
on windows, the :ruby_arch host parameter can determine in addition
Perform a Puppet Enterprise upgrade or install to other settings whether the 32 or 64bit install is used
356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 |
# File 'lib/beaker/dsl/install_utils/pe_utils.rb', line 356 def do_install hosts, opts = {} masterless = opts[:masterless] opts[:type] = opts[:type] || :install unless masterless pre30database = version_is_less(opts[:pe_ver] || database['pe_ver'], '3.0') pre30master = version_is_less(opts[:pe_ver] || master['pe_ver'], '3.0') end pe_versions = ( [] << opts['pe_ver'] << hosts.map{ |host| host['pe_ver'] } ).flatten.compact agent_only_check_needed = version_is_less('3.99', max_version(pe_versions, '3.8')) if agent_only_check_needed hosts_agent_only, hosts_not_agent_only = create_agent_specified_arrays(hosts) else hosts_agent_only, hosts_not_agent_only = [], hosts.dup end # Set PE distribution for all the hosts, create working dir use_all_tar = ENV['PE_USE_ALL_TAR'] == 'true' hosts.each do |host| next if agent_only_check_needed && hosts_agent_only.include?(host) host['pe_installer'] ||= 'puppet-enterprise-installer' if host['platform'] !~ /windows|osx/ platform = use_all_tar ? 'all' : host['platform'] version = host['pe_ver'] || opts[:pe_ver] host['dist'] = "puppet-enterprise-#{version}-#{platform}" elsif host['platform'] =~ /osx/ version = host['pe_ver'] || opts[:pe_ver] host['dist'] = "puppet-enterprise-#{version}-#{host['platform']}" elsif host['platform'] =~ /windows/ version = host[:pe_ver] || opts['pe_ver_win'] is_config_32 = true == (host['ruby_arch'] == 'x86') || host['install_32'] || opts['install_32'] should_install_64bit = !(version_is_less(version, '3.4')) && host.is_x86_64? && !is_config_32 #only install 64bit builds if # - we are on pe version 3.4+ # - we do not have install_32 set on host # - we do not have install_32 set globally if !(version_is_less(version, '3.99')) if should_install_64bit host['dist'] = "puppet-agent-#{version}-x64" else host['dist'] = "puppet-agent-#{version}-x86" end elsif should_install_64bit host['dist'] = "puppet-enterprise-#{version}-x64" else host['dist'] = "puppet-enterprise-#{version}" end end host['working_dir'] = host.tmpdir(Time.new.strftime("%Y-%m-%d_%H.%M.%S")) end fetch_pe(hosts_not_agent_only, opts) install_hosts = hosts.dup unless masterless # If we're installing a database version less than 3.0, ignore the database host install_hosts.delete(database) if pre30database and database != master and database != dashboard end install_hosts.each do |host| if agent_only_check_needed && hosts_agent_only.include?(host) host['type'] = 'aio' install_puppet_agent_pe_promoted_repo_on(host, { :puppet_agent_version => host[:puppet_agent_version] || opts[:puppet_agent_version], :puppet_agent_sha => host[:puppet_agent_sha] || opts[:puppet_agent_sha], :pe_ver => host[:pe_ver] || opts[:pe_ver], :puppet_collection => host[:puppet_collection] || opts[:puppet_collection] }) setup_defaults_and_config_helper_on(host, master, [0, 1]) elsif host['platform'] =~ /windows/ on host, installer_cmd(host, opts) configure_pe_defaults_on(host) if not host.is_cygwin? # HACK: for some reason, post install we need to refresh the connection to make puppet available for execution host.close end else # We only need answers if we're using the classic installer version = host['pe_ver'] || opts[:pe_ver] if host['roles'].include?('frictionless') && (! version_is_less(version, '3.2.0')) # If We're *not* running the classic installer, we want # to make sure the master has packages for us. if host['platform'] != master['platform'] # only need to do this if platform differs deploy_frictionless_to_master(host) end on host, installer_cmd(host, opts) configure_pe_defaults_on(host) elsif host['platform'] =~ /osx|eos/ # If we're not frictionless, we need to run the OSX special-case on host, installer_cmd(host, opts) acceptable_codes = host['platform'] =~ /osx/ ? [1] : [0, 1] setup_defaults_and_config_helper_on(host, master, acceptable_codes) else answers = Beaker::Answers.create(opts[:pe_ver] || host['pe_ver'], hosts, opts) create_remote_file host, "#{host['working_dir']}/answers", answers.answer_string(host) on host, installer_cmd(host, opts) configure_pe_defaults_on(host) end end # On each agent, we ensure the certificate is signed then shut down the agent sign_certificate_for(host) unless masterless stop_agent_on(host) end unless masterless # Wait for PuppetDB to be totally up and running (post 3.0 version of pe only) sleep_until_puppetdb_started(database) unless pre30database # Run the agent once to ensure everything is in the dashboard install_hosts.each do |host| on host, puppet_agent('-t'), :acceptable_exit_codes => [0,2] # Workaround for PE-1105 when deploying 3.0.0 # The installer did not respect our database host answers in 3.0.0, # and would cause puppetdb to be bounced by the agent run. By sleeping # again here, we ensure that if that bounce happens during an upgrade # test we won't fail early in the install process. if host['pe_ver'] == '3.0.0' and host == database sleep_until_puppetdb_started(database) end end install_hosts.each do |host| wait_for_host_in_dashboard(host) end # only appropriate for pre-3.9 builds if version_is_less(master[:pe_ver], '3.99') if pre30master task = 'nodegroup:add_all_nodes group=default' else task = 'defaultgroup:ensure_default_group' end on dashboard, "/opt/puppet/bin/rake -sf /opt/puppet/share/puppet-dashboard/Rakefile #{task} RAILS_ENV=production" end # Now that all hosts are in the dashbaord, run puppet one more # time to configure mcollective on install_hosts, puppet_agent('-t'), :acceptable_exit_codes => [0,2] end end |
#fetch_and_push_pe(host, path, filename, extension, local_dir = 'tmp/pe') ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Grabs the pe file from a remote host to the machine running Beaker, then scp's the file out to the host.
736 737 738 739 |
# File 'lib/beaker/dsl/install_utils/pe_utils.rb', line 736 def fetch_and_push_pe(host, path, filename, extension, local_dir='tmp/pe') fetch_http_file("#{path}", "#{filename}#{extension}", local_dir) scp_to host, "#{local_dir}/#{filename}#{extension}", host['working_dir'] end |
#fetch_pe(hosts, opts) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Determine the PE package to download/upload per-host, download/upload that package onto the host and unpack it.
273 274 275 276 277 278 279 280 281 282 283 284 285 286 |
# File 'lib/beaker/dsl/install_utils/pe_utils.rb', line 273 def fetch_pe(hosts, opts) hosts.each do |host| # We install Puppet from the master for frictionless installs, so we don't need to *fetch* anything next if host['roles'].include?('frictionless') && (! version_is_less(opts[:pe_ver] || host['pe_ver'], '3.2.0')) if host['platform'] =~ /windows/ fetch_pe_on_windows(host, opts) elsif host['platform'] =~ /osx/ fetch_pe_on_mac(host, opts) else fetch_pe_on_unix(host, opts) end end end |
#fetch_pe_on_mac(host, opts) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Determine the PE package to download/upload on a mac host, download/upload that package onto the host. Assumed file name format: puppet-enterprise-3.3.0-rc1-559-g97f0833-osx-10.9-x86_64.dmg.
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
# File 'lib/beaker/dsl/install_utils/pe_utils.rb', line 144 def fetch_pe_on_mac(host, opts) path = host['pe_dir'] || opts[:pe_dir] local = File.directory?(path) filename = "#{host['dist']}" extension = ".dmg" if local if not File.exists?("#{path}/#{filename}#{extension}") raise "attempting installation on #{host}, #{path}/#{filename}#{extension} does not exist" end scp_to host, "#{path}/#{filename}#{extension}", "#{host['working_dir']}/#{filename}#{extension}" else if not link_exists?("#{path}/#{filename}#{extension}") raise "attempting installation on #{host}, #{path}/#{filename}#{extension} does not exist" end if opts[:fetch_local_then_push_to_host] fetch_and_push_pe(host, path, filename, extension) else on host, "cd #{host['working_dir']}; curl -O #{path}/#{filename}#{extension}" end end end |
#fetch_pe_on_unix(host, opts) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Determine the PE package to download/upload on a unix style host, download/upload that package onto the host and unpack it.
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 |
# File 'lib/beaker/dsl/install_utils/pe_utils.rb', line 214 def fetch_pe_on_unix(host, opts) path = host['pe_dir'] || opts[:pe_dir] local = File.directory?(path) filename = "#{host['dist']}" if local extension = File.exists?("#{path}/#{filename}.tar.gz") ? ".tar.gz" : ".tar" if not File.exists?("#{path}/#{filename}#{extension}") raise "attempting installation on #{host}, #{path}/#{filename}#{extension} does not exist" end scp_to host, "#{path}/#{filename}#{extension}", "#{host['working_dir']}/#{filename}#{extension}" if extension =~ /gz/ on host, "cd #{host['working_dir']}; gunzip #{filename}#{extension}" end if extension =~ /tar/ on host, "cd #{host['working_dir']}; tar -xvf #{filename}.tar" end else if host['platform'] =~ /eos/ extension = '.swix' else extension = link_exists?("#{path}/#{filename}.tar.gz") ? ".tar.gz" : ".tar" end if not link_exists?("#{path}/#{filename}#{extension}") raise "attempting installation on #{host}, #{path}/#{filename}#{extension} does not exist" end if host['platform'] =~ /eos/ commands = ['enable', "copy #{path}/#{filename}#{extension} extension:"] command = commands.join("\n") on host, "Cli -c '#{command}'" else unpack = 'tar -xvf -' unpack = extension =~ /gz/ ? 'gunzip | ' + unpack : unpack if opts[:fetch_local_then_push_to_host] fetch_and_push_pe(host, path, filename, extension) command_file_push = 'cat ' else command_file_push = "curl #{path}/" end on host, "cd #{host['working_dir']}; #{command_file_push}#{filename}#{extension} | #{unpack}" end end end |
#fetch_pe_on_windows(host, opts) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Determine the PE package to download/upload on a windows host, download/upload that package onto the host. Assumed file name format: puppet-enterprise-3.3.0-rc1-559-g97f0833.msi
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 |
# File 'lib/beaker/dsl/install_utils/pe_utils.rb', line 178 def fetch_pe_on_windows(host, opts) path = host['pe_dir'] || opts[:pe_dir] local = File.directory?(path) version = host['pe_ver'] || opts[:pe_ver_win] filename = "#{host['dist']}" extension = ".msi" if local if not File.exists?("#{path}/#{filename}#{extension}") raise "attempting installation on #{host}, #{path}/#{filename}#{extension} does not exist" end scp_to host, "#{path}/#{filename}#{extension}", "#{host['working_dir']}/#{filename}#{extension}" else if not link_exists?("#{path}/#{filename}#{extension}") raise "attempting installation on #{host}, #{path}/#{filename}#{extension} does not exist" end if opts[:fetch_local_then_push_to_host] fetch_and_push_pe(host, path, filename, extension) on host, "cd #{host['working_dir']}; chmod 644 #{filename}#{extension}" elsif host.is_cygwin? on host, "cd #{host['working_dir']}; curl -O #{path}/#{filename}#{extension}" else on host, powershell("$webclient = New-Object System.Net.WebClient; $webclient.DownloadFile('#{path}/#{filename}#{extension}','#{host['working_dir']}\\#{filename}#{extension}')") end end end |
#higgs_installer_cmd(host) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Create the Higgs install command string based upon the host and options settings. Installation command will be run as a background process. The output of the command will be stored in the provided host.
644 645 646 647 648 |
# File 'lib/beaker/dsl/install_utils/pe_utils.rb', line 644 def higgs_installer_cmd host "cd #{host['working_dir']}/#{host['dist']} ; nohup ./#{host['pe_installer']} <<<Y > #{host['higgs_file']} 2>&1 &" end |
#install_higgs(higgs_host = master) ⇒ Object
Either pe_ver and pe_dir should be set in the ENV or each host should have pe_ver and pe_dir set individually. Install file names are assumed to be of the format puppet-enterprise-VERSION-PLATFORM.(tar)|(tar.gz).
Install Higgs up till the point where you need to continue installation in a web browser, defaults to execution on the master node.
712 713 714 715 716 717 718 719 720 721 722 |
# File 'lib/beaker/dsl/install_utils/pe_utils.rb', line 712 def install_higgs( higgs_host = master ) #process the version files if necessary master['pe_dir'] ||= [:pe_dir] master['pe_ver'] = master['pe_ver'] || ['pe_ver'] || Beaker::Options::PEVersionScraper.load_pe_version(master[:pe_dir] || [:pe_dir], [:pe_version_file]) if higgs_host['platform'] =~ /osx|windows/ raise "Attempting higgs installation on host #{higgs_host.name} with unsupported platform #{higgs_host['platform']}" end #send in the global options hash do_higgs_install higgs_host, end |
#install_pe ⇒ Object
Install PE based on global hosts with global options
548 549 550 |
# File 'lib/beaker/dsl/install_utils/pe_utils.rb', line 548 def install_pe install_pe_on(hosts, ) end |
#install_pe_on(hosts, opts) ⇒ Object
Either pe_ver and pe_dir should be set in the ENV or each host should have pe_ver and pe_dir set individually. Install file names are assumed to be of the format puppet-enterprise-VERSION-PLATFORM.(tar)|(tar.gz) for Unix like systems and puppet-enterprise-VERSION.msi for Windows systems.
Install PE based upon host configuration and options
572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 |
# File 'lib/beaker/dsl/install_utils/pe_utils.rb', line 572 def install_pe_on(hosts, opts) #process the version files if necessary confine_block(:to, {}, hosts) do sorted_hosts.each do |host| host['pe_dir'] ||= opts[:pe_dir] if host['platform'] =~ /windows/ # we don't need the pe_version if: # * master pe_ver > 4.0 if not (!opts[:masterless] && master[:pe_ver] && !version_is_less(master[:pe_ver], '3.99')) host['pe_ver'] ||= Beaker::Options::PEVersionScraper.load_pe_version(host[:pe_dir] || opts[:pe_dir], opts[:pe_version_file_win]) else # inherit the master's version host['pe_ver'] ||= master[:pe_ver] end else host['pe_ver'] ||= Beaker::Options::PEVersionScraper.load_pe_version(host[:pe_dir] || opts[:pe_dir], opts[:pe_version_file]) end end do_install sorted_hosts, opts end end |
#installer_cmd(host, opts) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Create the PE install command string based upon the host and options settings
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
# File 'lib/beaker/dsl/install_utils/pe_utils.rb', line 94 def installer_cmd(host, opts) version = host['pe_ver'] || opts[:pe_ver] if host['platform'] =~ /windows/ log_file = "#{File.basename(host['working_dir'])}.log" # cat may not be available with strictly Windows environments # Prefer `type` as an alternative to `cat` if non-cygwin win_cat = host.is_cygwin? ? "cat" : "type" pe_debug = host[:pe_debug] || opts[:pe_debug] ? " && #{win_cat} #{log_file}" : '' "cd #{host['working_dir']} && cmd /C 'start /w msiexec.exe /qn /L*V #{log_file} /i #{host['dist']}.msi PUPPET_MASTER_SERVER=#{master} PUPPET_AGENT_CERTNAME=#{host}'#{pe_debug}" # Frictionless install didn't exist pre-3.2.0, so in that case we fall # through and do a regular install. elsif host['roles'].include? 'frictionless' and ! version_is_less(version, '3.2.0') # PE 3.4 introduced the ability to pass in config options to the bash script in the form # of <section>:<key>=<value> frictionless_install_opts = [] if host.has_key?('frictionless_options') and ! version_is_less(version, '3.4.0') # since we have options to pass in, we need to tell the bash script host['frictionless_options'].each do |section, settings| settings.each do |key, value| frictionless_install_opts << "#{section}:#{key}=#{value}" end end end pe_debug = host[:pe_debug] || opts[:pe_debug] ? ' -x' : '' "cd #{host['working_dir']} && curl --tlsv1 -kO https://#{master}:8140/packages/#{version}/install.bash && bash#{pe_debug} install.bash #{frictionless_install_opts.join(' ')}".strip elsif host['platform'] =~ /osx/ version = host['pe_ver'] || opts[:pe_ver] pe_debug = host[:pe_debug] || opts[:pe_debug] ? ' -verboseR' : '' "cd #{host['working_dir']} && hdiutil attach #{host['dist']}.dmg && installer#{pe_debug} -pkg /Volumes/puppet-enterprise-#{version}/puppet-enterprise-installer-#{version}.pkg -target /" elsif host['platform'] =~ /eos/ commands = ['enable', "extension puppet-enterprise-#{version}-#{host['platform']}.swix"] command = commands.join("\n") "Cli -c '#{command}'" else pe_debug = host[:pe_debug] || opts[:pe_debug] ? ' -D' : '' "cd #{host['working_dir']}/#{host['dist']} && ./#{host['pe_installer']}#{pe_debug} -a #{host['working_dir']}/answers" end end |
#setup_defaults_and_config_helper_on(host, master, acceptable_exit_codes = nil) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Helper for setting up pe_defaults & setting up the cert on the host
537 538 539 540 541 542 543 544 |
# File 'lib/beaker/dsl/install_utils/pe_utils.rb', line 537 def setup_defaults_and_config_helper_on(host, master, acceptable_exit_codes=nil) configure_pe_defaults_on(host) #set the certname and master on host, puppet("config set server #{master}") on host, puppet("config set certname #{host}") #run once to request cert on host, puppet_agent('-t'), :acceptable_exit_codes => acceptable_exit_codes end |
#upgrade_pe(path = nil) ⇒ Object
Upgrade PE based upon global host configuration and global options
596 597 598 |
# File 'lib/beaker/dsl/install_utils/pe_utils.rb', line 596 def upgrade_pe path=nil upgrade_pe_on(hosts, , path) end |
#upgrade_pe_on(hosts, opts, path = nil) ⇒ Object
Install file names are assumed to be of the format puppet-enterprise-VERSION-PLATFORM.(tar)|(tar.gz) for Unix like systems and puppet-enterprise-VERSION.msi for Windows systems.
Upgrade PE based upon host configuration and options
613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 |
# File 'lib/beaker/dsl/install_utils/pe_utils.rb', line 613 def upgrade_pe_on hosts, opts, path=nil confine_block(:to, {}, hosts) do set_console_password = false # if we are upgrading from something lower than 3.4 then we need to set the pe console password if (dashboard[:pe_ver] ? version_is_less(dashboard[:pe_ver], "3.4.0") : true) set_console_password = true end # get new version information hosts.each do |host| host['pe_dir'] = host['pe_upgrade_dir'] || path if host['platform'] =~ /windows/ host['pe_ver'] = host['pe_upgrade_ver'] || opts['pe_upgrade_ver'] || Options::PEVersionScraper.load_pe_version(host['pe_dir'], opts[:pe_version_file_win]) else host['pe_ver'] = host['pe_upgrade_ver'] || opts['pe_upgrade_ver'] || Options::PEVersionScraper.load_pe_version(host['pe_dir'], opts[:pe_version_file]) end if version_is_less(host['pe_ver'], '3.0') host['pe_installer'] ||= 'puppet-enterprise-upgrader' end end do_install(sorted_hosts, opts.merge({:type => :upgrade, :set_console_password => set_console_password})) opts['upgrade'] = true end end |