This was done without bones and only 1 (track-to) constraint for each rocker-arm push-rod. (Blend file below)
It's only necessary to build and animate one rocker assembly to begin with and that's described below...
The method used to move the valve and only on contact with the rocker-arm is firstly to set the valve's origin point to it's very top center vertice. An Empty is added at that location to give us a reference point to return the valve to after the parenting process, described immediately below.
The rocker's animation (rotation) is manually keyframed.
It's then stepped a frame at a time until it comes into contact with the top of the valve rod.
The valve is parented to the rocker at that frame (CTL-P) so it's locked to the rocker contact point.
(Child = valve)
Once played the valve's derived action can be then be baked from the frame of first contact up to the frame where it's rising again and parting from the rocker, inclusive. (in the bake panel tick all option boxes).
The bake leaves us with no parent constraint and a set of keyframes at our disposal. The X & Y axis' channels can be removed, along with all the rotation and scaling channels.
The only animation channel remaining is Z axis LOC and with the frame range already limited to those of physical contact, the valve will only move straight up and down when in contact with the rocker-arm.
Blender can introduce extraneous interpolation curves when keyframes are close to each other and these can cause the valve rod to penetrate the rocker's surface slightly. If that's happening noticeably, simply remove the intermediate keyframes between peaks in the Graph editor. That will smooth things out and should leave you with a clean, U shaped curve. There's only a few KF's to worry about.
Now to the rod that pushes the rocker-arm -
Actually it doesn't do that. The yellow rocker is keyframed to rotate back and forth and the push-rod is parented to the rocker at the hinge pin. The push-rod's origin point is set to the hinge-pin's center.
To keep it's other end pointing at a stationary target, it's given a 'Track-to' constraint. The target is an empty which is sitting directly below but slightly offset along the X axis to prevent it wanting to spin 180 degrees with each half cycle.
To hold it all together so the whole thing can be moved/rotated and even scaled without ill-effect, a
'Nav(igation) Empty' (the large circle) acts as a Master parent for the rocker, valve, and 'track-to' empty, along with the main shaft that will support all the rocker-arms.
It's the Nav-Empty that's pulled around the scene, rotated etc. not the components.
Once the first assembly is working, it's duplicated and their timing and locations offset to suit. Make sure you DON'T include the Nav-empty or main shaft when duplicating