Mounting an NFS filesystem is straightforward using CFEngine's storage promises. The following bundle specifies the name of a remote file system server, the path of the remote file system and the mount point directory on the local machine:

code
body common control
{
bundlesequence => { "mounts" };
}


bundle agent mounts
{
storage:

  "/mnt" mount  => nfs("fileserver","/home");  # "/mnt" is the local moint point
                                               # "fileserver" is the remote fileserver
                                               # "/home" is the path to the remote file system
}


body mount nfs(server,source)
{
mount_type => "nfs";           # Protocol type of remote file system
mount_source => "$(source)";   # Path of remote file system
mount_server => "$(server)";   # Name or IP of remote file system server
mount_options => { "rw" };     # List of option strings to add to the file system table ("fstab")
edit_fstab => "true";          # True/false add or remove entries to the file system table ("fstab")
}

This policy can be found in /var/cfengine/share/doc/examples/example_mount_nfs.cf

Here is an example run. At start, the filesystem is not in /etc/fstab and is not mounted:

code
# grep mnt /etc/fstab # filesystem is not in /etc/fstab
# df |grep mnt # filesystem is not mounted

Now we run CFEngine to mount the filesystem and add it to /etc/fstab:

code
# cf-agent -f example_mount_nfs.cf
2013-06-08T17:48:42-0700    error: Attempting abort because mount went into a retry loop.
# grep mnt /etc/fstab
fileserver:/home     /mnt    nfs     rw
# df |grep mnt
fileserver:/home 149912064 94414848  47882240  67% /mnt
#

Note: CFEngine errors out after it mounts the filesystem and updates /etc/fstab. There is a ticket https://cfengine.com/dev/issues/2937 open on this issue.