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:

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:

# 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:

command
cf-agent -f example_mount_nfs.cf
output
2013-06-08T17:48:42-0700    error: Attempting abort because mount went into a retry loop.
command
grep mnt /etc/fstab
output
fileserver:/home 	 /mnt 	 nfs 	 rw
command
df |grep mnt
output
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.