It is useful to organize Puppet "infrastructure", "role", "data" and "manifests" files that represent the physical, operational and software aspects of a computing system.
Infrastructure defines the physical and network characteristics of a server or virtual server, such as its address and hostname. The role organizes different software applications into a logical solution, such as web server. These various software applications are defined using Puppet's manifests. All of these files are parameterized so that user and site-specific data are located in a separate file (or database table). This abstraction is illustrated below.
For example, the website you are using now is hosted on a virtual server that is controlled by a Puppet infrastructure node. Parameters for this node include information such as the OpenVZ container settings.
A website role is assigned to this infrastructure node. This role is a collection of different application manifests and settings, such as Apache and its various directives that are specific to this website. This Apache manifest describes the general installation and configuration of that application, which is customized through the role.
Separating code (also called manifests), infrastructure and data makes my Puppet configurations easier to manage and apply over a wide range of systems. This separation has proven to be very useful and critical for a large-scale Puppet configuration.
Read more about Puppet System Configuration.