© PA Photos
Both sides struggled to create chances in a frantic opening, with Andreas Weimann finally testing Mark Bunn with a low strike required a strong save.
Villa were then forced to make an early change as Matthew Lowton was forced off with a thigh problem, ending his run of playing every minute in the Premier League this season for Paul Lambert's side.
Villa then went close with a touch of fortune before the break, with Agbonlahor's deflected cross clipping the woodwork after taking a touch off Garrido.
Christian Beneteke was kept largely quiet by the home side as a frustrating first period ended in stalemate.
Ten minutes into the second half Villa broke the deadlock as Agbonlahor buried a measured finish into the far corner from 20 yards.
Hoolahan and Weimann then both missed gilt-edged chances at both ends with the game stretched as Norwich pushed for an equaliser.
With 16 minutes left, the home side were handed a lifeline as Joe Bennett conceded a penalty after bringing down Robert Snodgrass.
Holt made no mistake from the spot, sending Brad Guzan the wrong way with a powerful effort.
Norwich were unable to hold in the closing stages as Agbonlahor's pace proved decisive, with the forward racing onto a pass from Ashley Westwood before slotting from close range.
Villa held on in stoppage time to secure a second successive victory and ease their relegation fears, with Norwich still looking nervously over their shoulders.