Machine gun with multiple firing modes
Without more code / context it is hard to give much of an answer, but a few comments:


You can make ammo a read only attribute by using attr_reader :ammo then inside the class or module you can access it using @ammo just like you do in your initializer.
Don't over-complicate your code. Given what you have now there is no reason to do any of what you want. Wait till your code gets complicated enough that you need to break it up then you won't just be guessing what the best option is.
Consider using delegation rather than inheritance or modules. So your gun could have an ammo_clip attribute referencing an AmmoClip instance.
This code:

Rof = {:sustained =&gt; rand(3..9), :rapid =&gt; rand(5..9), 
       :cyclic =&gt; rand(1..200), :cease =&gt; 0}



probably doesn't do what you expect. Those random numbers will be calculated once at program startup, not each time a gun is fired.