public FileTemplate createUserDataTemplate(
      String scriptDirectory, Map<String, String> properties) {
    Preconditions.checkNotNull(scriptDirectory, "scriptDirectory cannot be null");
    Preconditions.checkNotNull(properties, "properties cannot be null");

    String dns = properties.get(DNS_PROPERTY);
    String gateway = properties.get(GATEWAY_PROPERTY);
    String netmask = properties.get(NETMASK_PROPERTY);
    String nodeIndexStr = properties.get(NodeTemplateUtils.NODE_INDEX_PROPERTY);
    List<String> zookeeperIps =
        NodeTemplateUtils.deserializeAddressList(properties.get(ZOOKEEPER_IPS_PROPERTY));

    int nodeIndex = Integer.parseInt(nodeIndexStr);

    String ipAddress = zookeeperIps.get(nodeIndex);
    String cidrSignature = new SubnetUtils(ipAddress, netmask).getInfo().getCidrSignature();
    String zkParameters = createZookeeperParameters(zookeeperIps);

    Map<String, String> parameters = new HashMap();
    parameters.put("$DNS", "DNS=" + dns);
    parameters.put("$GATEWAY", gateway);
    parameters.put("$ZK_ID", Integer.toString(nodeIndex + 1));
    parameters.put("$ADDRESS", cidrSignature);
    parameters.put("$ZK_PARAMETERS", zkParameters);

    FileTemplate template = new FileTemplate();
    template.filePath = Paths.get(scriptDirectory, ZOOKEEPER_USER_DATA_TEMPLATE).toString();
    template.parameters = parameters;
    return template;
  }