The puppet apt module from puppetlabs works great, but has one big issue. You can define sources (and keys, settings and ppas) from hiera, but only your most specific definition will be used by the module, as only the default priority lookup is done. This means a lot of cut & paste if you want to manage apt settings across multiple environments or server roles. This is known, but will not be fixed as it is apparently by design.
Well, this design did not fit me, so I forked the puppetlabs module, updated it to enable proper hiera_hash look up, and published it to the puppet forge. There is no more difference with the original, but it does simplify my life a lot. Now if you define multiple sources in your hierarchy, for instance at datacenter level:
apt::sources: 'localRepo': location: 'https://repo.example.com/debian' release: '%{::lsbdistcodename}' repos: 'main contrib non-free'
and at server level:
apt::sources: 'puppetlabs': location: 'http://apt.puppetlabs.com' repos: 'main' key: id: '47B320EB4C7C375AA9DAE1A01054B7A24BD6EC30' server: 'pgp.mit.edu'
you will nicely have both sources in sources.list.d, instead of only having the one defined at server level.
You can find the source on github, and can download the module from the puppet forge. Installing it is as simple as:
puppet module install lomignet-apt