diff options
| author | elijah <elijah@riseup.net> | 2013-04-01 00:04:54 -0700 | 
|---|---|---|
| committer | elijah <elijah@riseup.net> | 2013-04-01 00:04:54 -0700 | 
| commit | b9a20186350a0315ee7159f2df2b55a47e9f90a4 (patch) | |
| tree | 845b08feaa723a00d6dc7da26be68471fc4c7e1e /lib | |
| parent | c3f78c9df38f6e4dec94737863dcfcc1f4e60e96 (diff) | |
remove supply_drop, add support for puppet_command.
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/leap_cli.rb | 1 | ||||
| -rw-r--r-- | lib/leap_cli/commands/deploy.rb | 62 | ||||
| -rw-r--r-- | lib/leap_cli/commands/node.rb | 1 | ||||
| -rw-r--r-- | lib/leap_cli/constants.rb | 7 | ||||
| -rw-r--r-- | lib/leap_cli/logger.rb | 1 | ||||
| -rw-r--r-- | lib/leap_cli/remote/leap_plugin.rb (renamed from lib/leap_cli/remote/plugin.rb) | 34 | ||||
| -rw-r--r-- | lib/leap_cli/remote/puppet_plugin.rb | 66 | ||||
| -rw-r--r-- | lib/leap_cli/remote/rsync_plugin.rb | 35 | ||||
| -rw-r--r-- | lib/leap_cli/remote/tasks.rb | 22 | ||||
| -rw-r--r-- | lib/leap_cli/util/remote_command.rb | 8 | ||||
| -rw-r--r-- | lib/leap_cli/version.rb | 2 | 
11 files changed, 161 insertions, 78 deletions
| diff --git a/lib/leap_cli.rb b/lib/leap_cli.rb index 1921357..7b52ce4 100644 --- a/lib/leap_cli.rb +++ b/lib/leap_cli.rb @@ -1,6 +1,7 @@  module LeapCli; end  require 'leap_cli/version.rb' +require 'leap_cli/constants.rb'  require 'leap_cli/requirements.rb'  require 'leap_cli/leapfile.rb' diff --git a/lib/leap_cli/commands/deploy.rb b/lib/leap_cli/commands/deploy.rb index 76df4fb..12e8294 100644 --- a/lib/leap_cli/commands/deploy.rb +++ b/lib/leap_cli/commands/deploy.rb @@ -2,8 +2,6 @@  module LeapCli    module Commands -    DEFAULT_TAGS = ['leap_base','leap_service'] -      desc 'Apply recipes to a node or set of nodes.'      long_desc 'The FILTER can be the name of a node, service, or tag.'      arg_name 'FILTER' @@ -13,6 +11,9 @@ module LeapCli        c.switch :fast, :desc => 'Makes the deploy command faster by skipping some slow steps. A "fast" deploy can be used safely if you recently completed a normal deploy.',                        :negatable => false +      # --force +      c.switch :force, :desc => 'Deploy even if there is a lockfile.', :negatable => false +        # --tags        c.flag :tags, :desc => 'Specify tags to pass through to puppet (overriding the default).',                      :default_value => DEFAULT_TAGS.join(','), :arg_name => 'TAG[,TAG]' @@ -34,37 +35,16 @@ module LeapCli            ssh.leap.log :checking, 'node' do              ssh.leap.assert_initialized            end -            ssh.leap.log :synching, "configuration files" do              sync_hiera_config(ssh)              sync_support_files(ssh)            end - -          # sync puppet manifests and apply them -          ssh.set :puppet_source, [Path.platform, 'puppet'].join('/') -          ssh.set :puppet_destination, '/srv/leap' - -          # set tags -          if options[:tags] -            tags = options[:tags].split(',') -          else -            tags = DEFAULT_TAGS.dup +          ssh.leap.log :synching, "puppet manifests" do +            sync_puppet_files(ssh)            end -          tags << 'leap_slow' unless options[:fast] - -          # set verbosity -          verbosity = case LeapCli.log_level -            when 3 then '--verbose' -            when 4 then '--verbose --debug' -            when 5 then '--verbose --debug --trace' -            else '' +          ssh.leap.log :applying, "puppet" do +            ssh.puppet.apply(:verbosity => LeapCli.log_level, :tags => tags(options), :force => options[:force])            end - -          ssh.set :puppet_command, "/usr/bin/puppet apply --color=false --tags=#{tags.join(',')} --detailed-exitcodes #{verbosity}" -          ssh.set :puppet_lib, "puppet/modules" -          ssh.set :puppet_parameters, '--libdir puppet/lib --confdir puppet puppet/manifests/site.pp' -          ssh.set :puppet_stream_output, true -          ssh.apply_puppet          end        end      end @@ -73,7 +53,7 @@ module LeapCli      def sync_hiera_config(ssh)        dest_dir = provider.hiera_sync_destination -      ssh.leap.rsync_update do |server| +      ssh.rsync.update do |server|          node = manager.node(server.host)          hiera_file = Path.relative_path([:hiera, node.name])          ssh.leap.log hiera_file + ' -> ' + node.name + ':' + dest_dir + '/hiera.yaml' @@ -83,7 +63,7 @@ module LeapCli      def sync_support_files(ssh)        dest_dir = provider.hiera_sync_destination -      ssh.leap.rsync_update do |server| +      ssh.rsync.update do |server|          node = manager.node(server.host)          files_to_sync = node.file_paths.collect {|path| Path.relative_path(path, Path.provider) }          if files_to_sync.any? @@ -102,6 +82,20 @@ module LeapCli        end      end +    def sync_puppet_files(ssh) +      ssh.rsync.update do |server| +        ssh.leap.log(Path.platform + '/[bin,puppet] -> ' + server.host + ':' + LeapCli::PUPPET_DESTINATION) +        { +          :dest => LeapCli::PUPPET_DESTINATION, +          :source => '.', +          :chdir => Path.platform, +          :excludes => '*', +          :includes => ['/bin', '/bin/**', '/puppet', '/puppet/**'], +          :flags => "--relative --dirs --delete --copy-links" +        } +      end +    end +      def init_submodules        Dir.chdir Path.platform do          assert_run! "git submodule sync" @@ -141,6 +135,16 @@ module LeapCli        return includes      end +    def tags(options) +      if options[:tags] +        tags = options[:tags].split(',') +      else +        tags = LeapCli::DEFAULT_TAGS.dup +      end +      tags << 'leap_slow' unless options[:fast] +      tags.join(',') +    end +      #      # for safety, we allow production deploys to be turned off in the Leapfile.      # diff --git a/lib/leap_cli/commands/node.rb b/lib/leap_cli/commands/node.rb index 8ebb5e8..379fba6 100644 --- a/lib/leap_cli/commands/node.rb +++ b/lib/leap_cli/commands/node.rb @@ -59,7 +59,6 @@ module LeapCli; module Commands            save_public_host_key(node, global)            update_compiled_ssh_configs            ssh_connect(node, :bootstrap => true, :echo => options[:echo]) do |ssh| -            ssh.set_hostname              ssh.install_authorized_keys              ssh.install_prerequisites            end diff --git a/lib/leap_cli/constants.rb b/lib/leap_cli/constants.rb new file mode 100644 index 0000000..bf30df1 --- /dev/null +++ b/lib/leap_cli/constants.rb @@ -0,0 +1,7 @@ +module LeapCli + +  PUPPET_DESTINATION = '/srv/leap' +  INITIALIZED_FILE = "#{PUPPET_DESTINATION}/initialized" +  DEFAULT_TAGS = ['leap_base','leap_service'] + +end
\ No newline at end of file diff --git a/lib/leap_cli/logger.rb b/lib/leap_cli/logger.rb index 1aa7971..a496260 100644 --- a/lib/leap_cli/logger.rb +++ b/lib/leap_cli/logger.rb @@ -101,6 +101,7 @@ module LeapCli        # IMPORTANT        { :match => /^err ::/,                   :color => :red,     :match_level => 0, :priority => -10 }, +      { :match => /^ERROR:/,                   :color => :red,     :match_level => 0, :priority => -10 },        { :match => /.*/,                        :color => :blue,    :match_level => 0, :priority => -20 },        # CLEANUP diff --git a/lib/leap_cli/remote/plugin.rb b/lib/leap_cli/remote/leap_plugin.rb index 4824858..2c427e9 100644 --- a/lib/leap_cli/remote/plugin.rb +++ b/lib/leap_cli/remote/leap_plugin.rb @@ -1,10 +1,9 @@  #  # these methods are made available in capistrano tasks as 'leap.method_name' +# (see RemoteCommand::new_capistrano)  # -require 'rsync_command' - -module LeapCli; module Remote; module Plugin +module LeapCli; module Remote; module LeapPlugin    def required_packages      "puppet ruby-hiera-puppet rsync lsb-release" @@ -24,7 +23,7 @@ module LeapCli; module Remote; module Plugin    def assert_initialized      begin -      test_initialized_file = "test -f /srv/leap/initialized" +      test_initialized_file = "test -f #{INITIALIZED_FILE}"        check_required_packages = "! dpkg-query -W --showformat='${Status}\n' #{required_packages} 2>&1 | grep -q -E '(deinstall|no packages)'"        run "#{test_initialized_file} && #{check_required_packages}"      rescue Capistrano::CommandError => exc @@ -37,7 +36,7 @@ module LeapCli; module Remote; module Plugin    end    def mark_initialized -    run "touch /srv/leap/initialized" +    run "touch #{INITIALIZED_FILE}"    end    #def mkdir(dir) @@ -48,31 +47,6 @@ module LeapCli; module Remote; module Plugin    #  run "chown root -R #{dir} && chmod -R ag-rwx,u+rwX #{dir}"    #end -  # -  # takes a block, yielded a server, that should return a hash with various rsync options. -  # supported options include: -  # -  #   {:source => '', :dest => '', :flags => '', :includes => [], :excludes => []} -  # -  def rsync_update -    rsync = RsyncCommand.new(:logger => logger, :flags => '-a') -    rsync.asynchronously(find_servers) do |server| -      options = yield server -      next unless options -      remote_user = server.user || fetch(:user, ENV['USER']) -      src = options[:source] -      dest = {:user => remote_user, :host => server.host, :path => options[:dest]} -      options[:ssh] = ssh_options.merge(server.options[:ssh_options]||{}) -      options[:chdir] ||= Path.provider -      rsync.exec(src, dest, options) -    end -    if rsync.failed? -      LeapCli::Util.bail! do -        LeapCli::Util.log :failed, "to rsync to #{rsync.failures.map{|f|f[:dest][:host]}.join(' ')}" -      end -    end -  end -    #def logrun(cmd)    #  @streamer ||= LeapCli::Remote::LogStreamer.new    #  run cmd do |channel, stream, data| diff --git a/lib/leap_cli/remote/puppet_plugin.rb b/lib/leap_cli/remote/puppet_plugin.rb new file mode 100644 index 0000000..9c41380 --- /dev/null +++ b/lib/leap_cli/remote/puppet_plugin.rb @@ -0,0 +1,66 @@ +# +# these methods are made available in capistrano tasks as 'puppet.method_name' +# (see RemoteCommand::new_capistrano) +# + +module LeapCli; module Remote; module PuppetPlugin + +  def apply(options) +    run "#{PUPPET_DESTINATION}/bin/puppet_command set_hostname apply #{flagize(options)}" +  end + +  private + +  def flagize(hsh) +    hsh.inject([]) {|str, item| +      if item[1] === false +        str +      elsif item[1] === true +        str << "--" + item[0].to_s +      else +        str << "--" + item[0].to_s + " " + item[1].to_s +      end +    }.join(' ') +  end + +end; end; end + + +    # def puppet(command = :noop) +    #   #puppet_cmd = "cd #{puppet_destination} && #{sudo_cmd} #{puppet_command} --modulepath=#{puppet_lib} #{puppet_parameters}" +    #   puppet_cmd = "cd #{puppet_destination} && #{sudo_cmd} #{puppet_command} #{puppet_parameters}" +    #   flag = command == :noop ? '--noop' : '' + +    #   writer = if puppet_stream_output +    #              SupplyDrop::Writer::Streaming.new(logger) +    #            else +    #              SupplyDrop::Writer::Batched.new(logger) +    #            end + +    #   writer = SupplyDrop::Writer::File.new(writer, puppet_write_to_file) unless puppet_write_to_file.nil? + +    #   begin +    #     exitcode = nil +    #     run "#{puppet_cmd} #{flag}; echo exitcode:$?" do |channel, stream, data| +    #       if data =~ /exitcode:(\d+)/ +    #         exitcode = $1 +    #         writer.collect_output(channel[:host], "Puppet #{command} complete (#{exitcode_description(exitcode)}).\n") +    #       else +    #         writer.collect_output(channel[:host], data) +    #       end +    #     end +    #   ensure +    #     writer.all_output_collected +    #   end +    # end + +    # def exitcode_description(code) +    #   case code +    #     when "0" then "no changes" +    #     when "2" then "changes made" +    #     when "4" then "failed" +    #     when "6" then "changes and failures" +    #     else code +    #   end +    # end + diff --git a/lib/leap_cli/remote/rsync_plugin.rb b/lib/leap_cli/remote/rsync_plugin.rb new file mode 100644 index 0000000..2c89f26 --- /dev/null +++ b/lib/leap_cli/remote/rsync_plugin.rb @@ -0,0 +1,35 @@ +# +# these methods are made available in capistrano tasks as 'rsync.method_name' +# (see RemoteCommand::new_capistrano) +# + +require 'rsync_command' + +module LeapCli; module Remote; module RsyncPlugin + +  # +  # takes a block, yielded a server, that should return a hash with various rsync options. +  # supported options include: +  # +  #   {:source => '', :dest => '', :flags => '', :includes => [], :excludes => []} +  # +  def update +    rsync = RsyncCommand.new(:logger => logger, :flags => '-a') +    rsync.asynchronously(find_servers) do |server| +      options = yield server +      next unless options +      remote_user = server.user || fetch(:user, ENV['USER']) +      src = options[:source] +      dest = {:user => remote_user, :host => server.host, :path => options[:dest]} +      options[:ssh] = ssh_options.merge(server.options[:ssh_options]||{}) +      options[:chdir] ||= Path.provider +      rsync.exec(src, dest, options) +    end +    if rsync.failed? +      LeapCli::Util.bail! do +        LeapCli::Util.log :failed, "to rsync to #{rsync.failures.map{|f|f[:dest][:host]}.join(' ')}" +      end +    end +  end + +end; end; end diff --git a/lib/leap_cli/remote/tasks.rb b/lib/leap_cli/remote/tasks.rb index 35349ad..b515650 100644 --- a/lib/leap_cli/remote/tasks.rb +++ b/lib/leap_cli/remote/tasks.rb @@ -3,8 +3,6 @@  # For DSL manual, see https://github.com/capistrano/capistrano/wiki  # -require 'supply_drop' -  MAX_HOSTS = 10  task :install_authorized_keys, :max_hosts => MAX_HOSTS do @@ -14,14 +12,8 @@ task :install_authorized_keys, :max_hosts => MAX_HOSTS do    end  end -task :set_hostname, :max_hosts => MAX_HOSTS do -  leap.log :setting, "hostname" do -    run "hostname $CAPISTRANO:HOST$" -  end -end -  task :install_prerequisites, :max_hosts => MAX_HOSTS do -  leap.mkdirs puppet_destination +  leap.mkdirs LeapCli::PUPPET_DESTINATION    run "locale-gen"    leap.log :updating, "package list" do      run "apt-get update" @@ -33,9 +25,9 @@ task :install_prerequisites, :max_hosts => MAX_HOSTS do    leap.mark_initialized  end -task :apply_puppet, :max_hosts => MAX_HOSTS do -  raise "now such directory #{puppet_source}" unless File.directory?(puppet_source) -  leap.log :applying, "puppet" do -    puppet.apply -  end -end +#task :apply_puppet, :max_hosts => MAX_HOSTS do +#  raise "now such directory #{puppet_source}" unless File.directory?(puppet_source) +#  leap.log :applying, "puppet" do +#    puppet.apply +#  end +#end diff --git a/lib/leap_cli/util/remote_command.rb b/lib/leap_cli/util/remote_command.rb index aee4eff..57234eb 100644 --- a/lib/leap_cli/util/remote_command.rb +++ b/lib/leap_cli/util/remote_command.rb @@ -73,8 +73,12 @@ module LeapCli; module Util; module RemoteCommand      @capistrano_enabled ||= begin        require 'capistrano'        require 'capistrano/cli' -      require 'leap_cli/remote/plugin' -      Capistrano.plugin :leap, LeapCli::Remote::Plugin +      require 'leap_cli/remote/leap_plugin' +      require 'leap_cli/remote/puppet_plugin' +      require 'leap_cli/remote/rsync_plugin' +      Capistrano.plugin :leap, LeapCli::Remote::LeapPlugin +      Capistrano.plugin :puppet, LeapCli::Remote::PuppetPlugin +      Capistrano.plugin :rsync, LeapCli::Remote::RsyncPlugin        true      end diff --git a/lib/leap_cli/version.rb b/lib/leap_cli/version.rb index 232eb45..7f0b4d5 100644 --- a/lib/leap_cli/version.rb +++ b/lib/leap_cli/version.rb @@ -3,6 +3,6 @@ module LeapCli      VERSION = '0.2.0'      SUMMARY = 'Command line interface to the LEAP platform'      DESCRIPTION = 'The command "leap" can be used to manage a bevy of servers running the LEAP platform from the comfort of your own home.' -    LOAD_PATHS = ['lib', 'vendor/supply_drop/lib', 'vendor/certificate_authority/lib', 'vendor/rsync_command/lib'] +    LOAD_PATHS = ['lib', 'vendor/certificate_authority/lib', 'vendor/rsync_command/lib']    end  end | 
