Puppet Server includes a file server for transferring static file content to agents; this is what’s used whenever a file resource has a source => puppet:///... attribute specified.

Generally, files are stored in modules. But if you need to serve larger files that shouldn’t be in source control or shouldn’t be distributed with a module, you can make a custom file server mount point and let Puppet serve those files from another directory.

Summary

To create a new mount point, you must:

Once the mount point is working, you can reference its files at puppet:///<MOUNT POINT>/<PATH>.

What’s a mount point, in a Puppet URI?

Puppet URIs are constructed like this:

puppet://<SERVER>/<MOUNT POINT>/<PATH>

Creating a new mount point in fileserver.conf

fileserver.conf uses an INI-like syntax. The fileserver.conf page has a complete description, but all you need to know is:

[<NAME OF MOUNT POINT>]
    path <PATH TO DIRECTORY>
    allow *

[installer_files]
    path /etc/puppetlabs/puppet/installer_files
    allow *

In the example above, a file at /etc/puppetlabs/puppet/installer_files/oracle.pkg would be available in manifests as puppet:///installer_files/oracle.pkg.

Make sure that the puppet user can access that directory and its contents.

Always include the allow * line, since the default behavior is to deny all access. If you need to control access to a custom mount point, do so in auth.conf. Putting authorization rules in fileserver.conf is deprecated.

Caution: You should always restrict write access to mounted directories. The file server will follow any symlinks in a file server mount, including links to files that agent nodes should not access (like SSL keys).

When following symlinks, the file server can access any files readable by Puppet Server’s user account.

Controlling access to a custom mount point in auth.conf

By default, any node with a valid certificate can access the files in your new mount point — if it can fetch a catalog, it can fetch files; if it can’t, it can’t. This is the same behavior as the special modules and plugins mount points.

If necessary, you can restrict access to a custom mount point in auth.conf.

New-style auth.conf

If you’ve disabled the legacy auth.conf file by setting jruby-puppet.use-legacy-auth-conf: false, you’ll be adding a rule to Puppet Server’s HOCON-format auth.conf file, located at /etc/puppetlabs/puppetserver/conf.d/auth.conf.

Your new auth rule must meet the following requirements:

For example:

{
    # Allow limited access to files in /etc/puppetlabs/puppet/installer_files:
    match-request: {
        path: "^/puppet/v3/file_(content|metadata)s?/installer_files"
        type: regex
    }
    allow: "*.dev.example.com"
    sort-order: 400
    name: "dev.example.com large installer files"
},

Legacy auth.conf

If you haven’t disabled the legacy auth.conf file, you’ll be adding a stanza to /etc/puppetlabs/puppet/auth.conf.

Your new auth rule must meet the following requirements:

For example:

# Allow limited access to files in /etc/puppetlabs/puppet/installer_files:
path ~ ^/file_(metadata|content)s?/installer_files/
auth yes
allow *.dev.example.com
allow_ip 192.168.100.0/24