Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Fire It Up: Automated Provisioning

Fire It Up: Automated Provisioning

At Rackspace, every minute spent on a manual task is a minute less spent providing fanatical support to customers. It's vital that we automate manual work. This talk is a case study of a group of Rackers who automated network device provisioning by leveraging new and existing services. Automating provisioning processes that stretch across the physical world and multiple applications is challenging. Shipping features on a time table and keeping a maintainable codebase require making intelligent tradeoffs. We want to share with you some of our insights into making these necessary tradeoffs.

Josh Schairbaum

July 19, 2013
Tweet

More Decks by Josh Schairbaum

Other Decks in Technology

Transcript

  1. July 19, 2013 How Empowered People Automated Provisioning in 6

    Datacenters Across 4 Continents Fire It Up Saturday, July 20, 13
  2. Automating a process is just as much about organizational change

    as technical change Saturday, July 20, 13
  3. Hofstadter's Law: It always takes longer than you expect, even

    when you take into account Hofstadter's Law. Saturday, July 20, 13
  4. class  Swimlanes::Discovery  <  Swimlane    #  ...  omitted  ...  

       def  perform        DeviceDiscovery.run(device)    rescue  =>  error        @errors  <<  error        raise  error    ensure        Orchestration.notify(device,  self)    end end Saturday, July 20, 13
  5. class  KicksController  <  ApplicationController    #  ...  omitted  ...  

     def  create        @kick_process  =  KickProcess.start(@device,                                                                            params[:step])        respond_with(@kick_process)    end end Saturday, July 20, 13
  6. class  KickProcess    STEPS  =  {        ‘1

     -­‐  Discovery’  =>  [  Swimlanes::Discovery  ]      }      def  self.start(device,  step)        kick_process  =  new(device,  step)        kick_process.start    end      def  start        STEPS[step].each  do  |action|            action.perform(device)        end        self    end end Saturday, July 20, 13
  7. class  DeviceDiscovery    def  self.run(device)        device_discovery  =

     new(device)        device_discovery.run    end      def  run        switch  =  FE::Switch.discover(device)        mac        =  switch.mac_address.            select  {  |m|                  m  ==  device.mac_address              }.first        FE::MacAddress.update(mac,  device)    end end Saturday, July 20, 13
  8. class  DeviceDiscovery    def  self.run(device)        device_discovery  =

     new(device)        device_discovery.run    end      def  run        switch  =  Switch.discover(device)        mac        =  MacAddress.discover(switch)        MacAddressCorrelation.            create(device,  mac)    end end Saturday, July 20, 13