To be precise, you are using Puppet to manage ~100 files per node. Each one should be copied only in the event that its contents on the target node differ from its contents on the master (including if the file is missing altogether). Puppet will not copy the files if the contents are unchanged, which it checks via a configurable comparison function.
If rsync is slow for this task then it must be that the aggregate size of your ~100 files is enormous, that your available processing power per container is meager, or both.
You're not really into the realm that I'd characterize as "a large number" of files yet, but yes, Puppet is not well suited to be used as a content-management system. You have many options both inside Puppet and out, however, to improve the observed performance.
One alternative is to use a less expensive mechanism for checking file contents by setting a different '
checksum' parameter on the File resources. This is a tradeoff between speed and reliability, with the default, 'md5', providing maximum reliability. You could get a moderate performance improvement without giving up too much reliability by changing to 'md5lite'. You could get a great performance improvement at the cost of a significant reduction in reliability by choosing the 'mtime' option (thereby relying on file modification timestamps).
If the files in question rarely change, then another alternative would be to make a package out of them for your target machines' native packaging system (RPM, Apt, ...), and manage the package instead of individual files. This is pretty effective for installation, but not necessarily so good for catching and reverting changes to the installed files.
Another alternative would be to enroll the files in a version-control system such as Git, and have Puppet use that to sync files with their master copies instead of managing the files as resources. Honestly, I think this is a pretty good fit to the usage you describe.
John