Method: Beaker::DSL::InstallUtils#do_install

Defined in:
lib/beaker/dsl/install_utils.rb

#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.

Perform a Puppet Enterprise upgrade or install

Examples:

do_install(hosts, {:type => :upgrade, :pe_dir => path, :pe_ver => version, :pe_ver_win =>  version_win})

Parameters:

  • hosts (Array<Host>)

    The hosts to install or upgrade PE on

  • opts (Hash{Symbol=>Symbol, String}) (defaults to: {})

    The options

Options Hash (opts):

  • :pe_dir (String)

    Default directory or URL to pull PE package from (Otherwise uses individual hosts pe_dir)

  • :pe_ver (String)

    Default PE version to install or upgrade to (Otherwise uses individual hosts pe_ver)

  • :pe_ver_win (String)

    Default PE version to install or upgrade to on Windows hosts (Otherwise uses individual Windows hosts pe_ver)

  • :type (Symbol) — default: :install

    One of :upgrade or :install

  • :set_console_password (Boolean)

    Should we set the PE console password in the answers file? Used during upgrade only.

  • :answers (Hash<String>)

    Pre-set answers based upon ENV vars and defaults (See Options::Presets.env_vars)



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
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
# File 'lib/beaker/dsl/install_utils.rb', line 463

def do_install hosts, opts = {}
  masterless = (defined? options) ? options[:masterless] : false
  opts[:masterless] = masterless # has to pass masterless down for answer generation awareness
  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')

    unless version_is_less(opts[:pe_ver] || master['pe_ver'], '3.4')
      master['puppetservice'] = 'pe-puppetserver'
    end
  end

  # Set PE distribution for all the hosts, create working dir
  use_all_tar = ENV['PE_USE_ALL_TAR'] == 'true'
  hosts.each do |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']
      should_install_64bit = !(version_is_less(version, '3.4')) && host.is_x86_64? && !host['install_32'] && !opts['install_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, '4.0'))
        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_puppet(hosts, 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 host['platform'] =~ /windows/
      on host, installer_cmd(host, opts)
      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.
        deploy_frictionless_to_master(host)
        on host, installer_cmd(host, opts)
      elsif host['platform'] =~ /osx|eos/
        # If we're not frictionless, we need to run the OSX special-case
        on host, installer_cmd(host, opts)
        #set the certname and master
        on host, puppet("config set server #{master}")
        on host, puppet("config set certname #{host}")
        #run once to request cert
        acceptable_codes = host['platform'] =~ /osx/ ? [1] : [0, 1]
        on host, puppet_agent('-t'), :acceptable_exit_codes => 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)
      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

    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"

    # 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