Preseed Script Template Variables#

SynergyCP preseed scripts use the Smarty template engine to dynamically generate automated installation configurations. This document provides a complete reference of all available template variables.

Overview#

Preseed scripts (for Debian/Ubuntu) and kickstart scripts (for CentOS/RHEL/AlmaLinux) are stored in SynergyCP under OS Reloads → Preseeds. These scripts provide automated answers to the OS installer and are fetched by the installer during the installation process via the {$preseed_url} variable from the boot script.

Please be cognizant that you’re only using preseed variables in preseed templates. Boot script variables will not work in preseed templates, although there’s a few variables that have name overlap.

Available Variables Summary#

Variable Type Description Minimum Version
{$hostname} string Server hostname
{$password} string Encrypted root/administrator password
{$login_type} string Login method for the installation 5.5
{$ssh_keys} array SSH public keys for the installation 5.5
{$ip} string Primary IP address (deprecated, use {$server.primary_ip})
{$netmask} string Subnet mask (deprecated, use {$server.primary_ip})
{$gateway} string Gateway IP (deprecated, use {$server.primary_ip})
{$url.update} string API endpoint to update installation status
{$url.script.during} string URL to during-install shell script
{$url.script.final} string URL to final shell script
{$server.id} integer Server ID
{$server.mac} string Primary port MAC address
{$server.use_uefi} boolean Whether server boots with UEFI
{$server.primary_ip} array Primary IP address details
{$server.all_ips} array All static IP addresses for OS reload
{$install.id} integer Installation ID
{$install.disk.raid} integer/null RAID level (0, 1, 10, or null)
{$install.disk.index} integer Disk index
{$install.disk.linux} string Linux disk identifier (e.g., sda)
{$install.url} string API endpoint for install details
{$share.http} string HTTP URL to file server
{$share.host} string File server hostname/IP
{$share.dir} string Directory path on share
{$share.path} string Full UNC path to share
{$image} string ISO image name (if applicable)
{$product_key} string Windows product key (Windows only)
{$drivers} array Windows drivers (Windows only)
{$dns} array DNS server addresses (Windows only)

A dash (—) means the variable is available in all SynergyCP versions covered by this documentation.


Available Variables#

Basic Configuration#

{$hostname}#

Type: string

Example: server1.example.com or ABC123

Description: The hostname for the server. Uses the server’s nickname if set, otherwise falls back to the server ID.

Usage:

# Debian Installer (d-i)
d-i netcfg/hostname string {$hostname}
d-i netcfg/get_hostname string {$hostname}

# CentOS/RHEL/AlmaLinux Kickstart
network --hostname {$hostname}

# Ubuntu Subiquity (Autoinstall)
hostname: {$hostname}

{$password}#

Type: string

Description: Encrypted password hash for the root user. For Linux systems, this is a crypt-style hash. For Windows systems, this is a Windows-compatible password hash.

Usage:

# Debian Installer (d-i)
d-i passwd/root-password-crypted password {$password}

# CentOS/RHEL/AlmaLinux Kickstart
rootpw --iscrypted {$password}

# Ubuntu Subiquity (Autoinstall)
- sed -i 's|^root:.:|root:{$password}:|' /target/etc/shadow

{$login_type}#

Type: string

Added in: SynergyCP 5.5

Values: with_password, with_ssh_key, with_password_and_ssh_key, or no_root_ssh

Description: The login method selected for this installation. When the login type does not include a password (with_ssh_key, no_root_ssh), {$password} is empty. When the login type does not include SSH keys (with_password, no_root_ssh), {$ssh_keys} is empty.

Usage:

{if $login_type == 'with_ssh_key' || $login_type == 'no_root_ssh'}
# Key-only or no-root-SSH install: lock down password authentication
sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication no/' /target/etc/ssh/sshd_config
{/if}

{$ssh_keys}#

Type: array

Added in: SynergyCP 5.5

Example: ['ssh-ed25519 AAAA... [email protected]', 'ssh-rsa AAAA... [email protected]']

Description: Array of OpenSSH public key strings to authorize for the root user. Contains the keys selected for the installation (from the client’s stored SSH keys plus any keys pasted directly), de-duplicated. Only populated when {$login_type} is with_ssh_key or with_password_and_ssh_key; otherwise the array is empty.

Usage:

# Debian Installer (d-i)
d-i preseed/late_command string \
  in-target /bin/bash -c 'mkdir -p /root/.ssh && chmod 700 /root/.ssh'; \
{foreach $ssh_keys as $key}
  in-target /bin/bash -c 'echo "{$key}" >> /root/.ssh/authorized_keys'; \
{/foreach}
  in-target /bin/bash -c 'chmod 600 /root/.ssh/authorized_keys'

# CentOS/RHEL/AlmaLinux Kickstart
%post
mkdir -p /root/.ssh && chmod 700 /root/.ssh
{foreach $ssh_keys as $key}
echo "{$key}" >> /root/.ssh/authorized_keys
{/foreach}
chmod 600 /root/.ssh/authorized_keys
%end

# Ubuntu Subiquity (Autoinstall)
late-commands:
  - mkdir -p /target/root/.ssh && chmod 700 /target/root/.ssh
{foreach $ssh_keys as $key}
  - echo "{$key}" >> /target/root/.ssh/authorized_keys
{/foreach}
  - chmod 600 /target/root/.ssh/authorized_keys

Network Configuration (Deprecated)#

These top-level variables are deprecated. Use {$server.primary_ip} instead for new scripts.

{$ip}#

Type: string

Example: 192.168.1.100

Description: Primary IP address for the server.

Deprecated: This variable is deprecated. Use {$server.primary_ip.addresses[0]} instead.

Usage:

# CentOS/RHEL/AlmaLinux Kickstart
network --ip {$ip}

{$netmask}#

Type: string

Example: 255.255.255.0

Description: Subnet mask for the primary IP.

Deprecated: This variable is deprecated. Use {$server.primary_ip} to calculate the netmask from the CIDR mask instead.

Usage:

# CentOS/RHEL/AlmaLinux Kickstart
network --netmask {$netmask}

{$gateway}#

Type: string

Example: 192.168.1.1

Description: Gateway IP address for the primary IP.

Deprecated: This variable is deprecated. Use {$server.primary_ip.gateway} instead.

Usage:

# CentOS/RHEL/AlmaLinux Kickstart
network --gateway {$gateway}

Installation Scripts#

{$url.update}#

Type: string

Example: https://synergycp.example.com/api/server/123/install/456?key=abc123

Description: API endpoint URL to update the installation status. Scripts can POST to this URL to notify SynergyCP of installation progress.

Usage:

# Shell script
curl -X POST "{$url.update}" -d "status=installing"

{$url.script.during}#

Type: string

Example: https://synergycp.example.com/api/server/123/install/456/script/during?key=abc123

Description: URL to a shell script that runs during the installation process (before the OS is fully installed).

Usage:

# Debian Installer (d-i)
d-i partman/early_command string \
  wget -O /tmp/scp-during-commands.sh "{$url.script.during|replace:'https://':'http://'}"; \
  . /tmp/scp-during-commands.sh

# CentOS/RHEL/AlmaLinux Kickstart
%pre
curl "{$url.script.during}" | /bin/bash
%end

# Ubuntu Subiquity (Autoinstall)
early-commands:
  - curl --insecure -L {$url.script.during} | /bin/bash

{$url.script.final}#

Type: string

Example: https://synergycp.example.com/api/server/123/install/456/script/final?key=abc123

Description: URL to a shell script that runs at the end of the installation process (after the OS is installed but before reboot).

Usage:

# Debian Installer (d-i)
d-i preseed/late_command string \
  in-target /bin/bash -c 'curl --insecure -L {$url.script.final} | /bin/bash'

# CentOS/RHEL/AlmaLinux Kickstart
%post
curl {$url.script.final} | /bin/bash
%end

# Ubuntu Subiquity (Autoinstall)
late-commands:
  - curtin in-target --target /target -- curl --insecure -L {$url.script.final} | /bin/bash

Server Information#

{$server.id}#

Type: integer

Example: 123

Description: The unique server ID in SynergyCP.


{$server.mac}#

Type: string

Example: 00:11:22:33:44:55

Description: MAC address of the server’s primary network port.

Usage:

# CentOS/RHEL/AlmaLinux Kickstart
network --device {$server.mac}

# Ubuntu Autoinstall (cloud-config)
match:
  macaddress: {$server.mac}

{$server.use_uefi}#

Type: boolean

Values: true or false

Description: Indicates whether the server boots using UEFI mode.


{$server.primary_ip}#

Type: array

Description: Array containing detailed information about the server’s primary IP address.

Properties:

  • cidr - Full CIDR notation (e.g., 192.168.1.100/24)
  • cidr_mask - CIDR mask number (e.g., 24)
  • gateway - Gateway IP address
  • addresses - Array of usable IP addresses in the range

Usage:

# Ubuntu Autoinstall (cloud-config)
addresses: [{$ip}/{$server.primary_ip.cidr_mask}]
routes:
  - to: default
    via: {$server.primary_ip.gateway}

{$server.all_ips}#

Type: array

Description: Array of all static IP addresses configured for OS reload. Each element has the same structure as {$server.primary_ip}.

Usage:

# Iterate through all IPs
{foreach $server.all_ips as $ip_info}
  # IP: {$ip_info.addresses[0]}
  # Gateway: {$ip_info.gateway}
  # CIDR: {$ip_info.cidr}
{/foreach}

Installation Details#

{$install.id}#

Type: integer

Example: 456

Description: The unique installation ID in SynergyCP.


{$install.disk.raid}#

Type: integer or null

Example: 1 (for RAID 1) or null (for no RAID)

Values: 0, 1, 10, or null

Description: The RAID level configured for this installation. null means no RAID.

Usage:

# AlmaLinux/CentOS Kickstart
{if $install.disk.raid === null}
    # No RAID configuration
    clearpart --all --drives={$install.disk.linux}
    part /boot --fstype ext2 --size=250 --ondisk={$install.disk.linux}
{else}
    # RAID configuration
    raid /boot --level={$install.disk.raid} raid.01 raid.03
{/if}

{$install.disk.index}#

Type: integer

Example: 0

Description: The index of the disk to use for installation.


{$install.disk.linux}#

Type: string

Example: sda

Description: The Linux disk identifier for the primary installation disk.

Usage:

# AlmaLinux/CentOS Kickstart
clearpart --all --drives={$install.disk.linux}
part /boot --ondisk={$install.disk.linux}

{$install.url}#

Type: string

Example: https://synergycp.example.com/api/server/123/install/456?key=abc123

Description: API endpoint URL for retrieving detailed installation information.


File Share#

{$share.http}#

Type: string

Example: http://192.168.1.10:4002

Description: HTTP URL to access the SynergyCP file server for the IP group. Port 4002 is the default HTTP port.


{$share.host}#

Type: string

Example: 192.168.1.10

Description: Hostname or IP address of the SynergyCP file server for the IP group.


{$share.dir}#

Type: string

Example: debian\bookworm

Description: Directory path on the share (backslash-separated, no leading/trailing slashes).


{$share.path}#

Type: string

Example: \\192.168.1.10\debian\bookworm

Description: Full UNC path to the share in Windows format.


Optional Variables#

{$image}#

Type: string

Example: ubuntu-20.04-live-server-amd64.iso

Description: The name of the ISO image being used for installation. Only available if an edition with an image is selected.


Windows-Only Variables#

These variables are only available when installing Windows ($install->is_windows is true).

{$product_key}#

Type: string

Example: XXXXX-XXXXX-XXXXX-XXXXX-XXXXX

Description: Windows product key for activation.

Usage:

<ProductKey>{$product_key}</ProductKey>

{$drivers}#

Type: array

Description: Collection of Windows driver shares. Each driver has a share.url property containing the UNC path.

Usage:

{foreach $drivers as $driver}
  <PathAndCredentials wcm:action="add">
    <Path>{$driver.share.url}</Path>
  </PathAndCredentials>
{/foreach}

{$dns}#

Type: array

Example: ['8.8.8.8', '8.8.4.4']

Description: Array of DNS server IP addresses for Windows installations. Defaults to Google DNS.

Usage:

<DNSServerSearchOrder>
{foreach $dns as $dns_server}
  <IpAddress wcm:action="add" wcm:keyValue="{$dns_server@iteration}">{$dns_server}</IpAddress>
{/foreach}
</DNSServerSearchOrder>

Common Patterns#

HTTPS to HTTP Conversion#

Some installers don’t support HTTPS. Use the replace filter:

wget -O /tmp/script.sh "{$url.script.during|replace:'https://':'http://'}"

Disk Partitioning with RAID Detection#

{if $install.disk.raid === null}
    # Single disk setup
    clearpart --all --drives={$install.disk.linux}
    part /boot --fstype ext2 --size=250 --ondisk={$install.disk.linux}
    part pv.01 --size=1 --grow --ondisk={$install.disk.linux}
{else}
    # RAID setup
    clearpart --all --initlabel
    part raid.01 --fstype="raid" --ondisk=sda --size=500
    part raid.02 --fstype="raid" --ondisk=sdb --size=500
    raid /boot --level={$install.disk.raid} raid.01 raid.02
{/if}

Advanced Disk Partitioning (NVMe vs SATA, UEFI vs Legacy, RAID)#

This example shows how to handle different disk types, boot modes, and RAID configurations dynamically in a kickstart script.

%pre
curl "{$url.script.during}" | /bin/bash

# Detect disk type and configure partitioning
if [ -e /dev/nvme0n1 ]; then
    # NVMe drives detected
    {if $install.disk.raid === null}
        # Single NVMe disk
        {if $server.use_uefi}
            # UEFI boot with NVMe
            echo "bootloader --location=boot --boot-drive=nvme0n1" > /tmp/part-include
            echo "clearpart --all --initlabel --drives=nvme0n1" >> /tmp/part-include
            echo "part /boot/efi --fstype=efi --size=600 --ondisk=nvme0n1" >> /tmp/part-include
            echo "part /boot --fstype=xfs --size=1024 --ondisk=nvme0n1" >> /tmp/part-include
            echo "part pv.01 --size=1 --grow --ondisk=nvme0n1" >> /tmp/part-include
        {else}
            # Legacy boot with NVMe
            echo "bootloader --location=boot --boot-drive=nvme0n1" > /tmp/part-include
            echo "clearpart --all --initlabel --drives=nvme0n1" >> /tmp/part-include
            echo "part /boot --fstype=xfs --size=1024 --ondisk=nvme0n1" >> /tmp/part-include
            echo "part pv.01 --size=1 --grow --ondisk=nvme0n1" >> /tmp/part-include
        {/if}
    {else}
        # RAID with NVMe drives
        echo "bootloader --location=boot --boot-drive=nvme0n1" > /tmp/part-include
        echo "clearpart --all --initlabel --drives=nvme0n1,nvme1n1" >> /tmp/part-include
        echo "part raid.01 --fstype=raid --ondisk=nvme0n1 --size=500" >> /tmp/part-include
        echo "part raid.02 --fstype=raid --grow --ondisk=nvme0n1 --size=1" >> /tmp/part-include
        echo "part raid.03 --fstype=raid --ondisk=nvme1n1 --size=500" >> /tmp/part-include
        echo "part raid.04 --fstype=raid --grow --ondisk=nvme1n1 --size=1" >> /tmp/part-include
        echo "raid /boot --device=md0 --fstype=xfs --level={$install.disk.raid} raid.01 raid.03" >> /tmp/part-include
        echo "raid pv.01 --device=md1 --level={$install.disk.raid} raid.02 raid.04" >> /tmp/part-include
    {/if}
else
    # SATA/SAS drives detected
    {if $install.disk.raid === null}
        # Single SATA disk
        {if $server.use_uefi}
            # UEFI boot with SATA
            echo "bootloader --location=boot --boot-drive=sda" > /tmp/part-include
            echo "clearpart --all --initlabel --drives=sda" >> /tmp/part-include
            echo "part /boot/efi --fstype=efi --size=600 --ondisk=sda" >> /tmp/part-include
            echo "part /boot --fstype=xfs --size=1024 --ondisk=sda" >> /tmp/part-include
            echo "part pv.01 --size=1 --grow --ondisk=sda" >> /tmp/part-include
        {else}
            # Legacy boot with SATA
            echo "bootloader --location=boot --boot-drive=sda" > /tmp/part-include
            echo "clearpart --all --initlabel --drives=sda" >> /tmp/part-include
            echo "part /boot --fstype=xfs --size=1024 --ondisk=sda" >> /tmp/part-include
            echo "part pv.01 --size=1 --grow --ondisk=sda" >> /tmp/part-include
        {/if}
    {else}
        # RAID with SATA drives
        echo "bootloader --location=boot --boot-drive=sda" > /tmp/part-include
        echo "clearpart --all --initlabel --drives=sda,sdb" >> /tmp/part-include
        echo "part raid.01 --fstype=raid --ondisk=sda --size=500" >> /tmp/part-include
        echo "part raid.02 --fstype=raid --grow --ondisk=sda --size=1" >> /tmp/part-include
        echo "part raid.03 --fstype=raid --ondisk=sdb --size=500" >> /tmp/part-include
        echo "part raid.04 --fstype=raid --grow --ondisk=sdb --size=1" >> /tmp/part-include
        {if $server.use_uefi}
            # UEFI RAID requires EFI partition on both disks
            echo "part /boot/efi --fstype=efi --size=600 --ondisk=sda" >> /tmp/part-include
            echo "part /boot/efi2 --fstype=efi --size=600 --ondisk=sdb" >> /tmp/part-include
        {/if}
        echo "raid /boot --device=md0 --fstype=xfs --level={$install.disk.raid} raid.01 raid.03" >> /tmp/part-include
        echo "raid pv.01 --device=md1 --level={$install.disk.raid} raid.02 raid.04" >> /tmp/part-include
    {/if}
fi
%end

# Include the dynamically generated partitioning
%include /tmp/part-include

# Volume Group configuration
volgroup vg_root pv.01

# Logical Volume configuration
logvol swap --vgname=vg_root --size=4096 --name=lv_swap
logvol / --vgname=vg_root --size=1 --grow --name=lv_root

Key Concepts:

  1. Disk Type Detection: The %pre section uses shell script to detect whether NVMe (/dev/nvme0n1) or SATA (/dev/sda) drives are present
  2. Dynamic Partitioning: Partition commands are generated dynamically and written to /tmp/part-include, then included with %include /tmp/part-include
  3. UEFI Handling: {$server.use_uefi} determines whether to create an EFI system partition (/boot/efi)
  4. RAID Configuration: {$install.disk.raid} determines single disk vs RAID setup
  5. UEFI RAID: When using UEFI with RAID, EFI partitions must be created on both disks (cannot be RAIDed)

Network Configuration by Installer Type#

Debian Installer (d-i):

d-i netcfg/choose_interface select auto
d-i netcfg/disable_dhcp boolean true
d-i netcfg/get_ipaddress string {$ip}
d-i netcfg/get_netmask string {$netmask}
d-i netcfg/get_gateway string {$gateway}
d-i netcfg/get_nameservers string 8.8.8.8
d-i netcfg/confirm_static boolean true
d-i netcfg/hostname string {$hostname}
d-i netcfg/get_hostname string {$hostname}

Subiquity Installer (Ubuntu 20+):

network:
  version: 2
  ethernets:
    eth0:
      addresses: [{$ip}/{$server.primary_ip.cidr_mask}]
      routes:
        - to: default
          via: {$server.primary_ip.gateway}
      match:
        macaddress: {$server.mac}
      nameservers:
        addresses: [8.8.8.8, 1.1.1.1]

Anaconda Installer (CentOS/RHEL/AlmaLinux):

network --onboot yes --device {$server.mac} --bootproto static --ip {$ip} --netmask {$netmask} --gateway {$gateway} --nameserver 8.8.8.8 --hostname {$hostname}

Running Installation Scripts#

Early/During Installation:

# Debian Installer (d-i)
d-i partman/early_command string \
  wget -O /tmp/script.sh "{$url.script.during|replace:'https://':'http://'}"; \
  . /tmp/script.sh

# CentOS/RHEL/AlmaLinux Kickstart
%pre
curl "{$url.script.during}" | /bin/bash
%end

# Ubuntu Subiquity (Autoinstall)
early-commands:
  - curl --insecure -L {$url.script.during} | /bin/bash

Late/Final Installation:

# Debian Installer (d-i)
d-i preseed/late_command string \
  in-target curl --insecure -L {$url.script.final} | /bin/bash

# CentOS/RHEL/AlmaLinux Kickstart
%post
curl {$url.script.final} | /bin/bash
%end

# Ubuntu Subiquity (Autoinstall)
late-commands:
  - curtin in-target --target /target -- curl --insecure -L {$url.script.final} | /bin/bash

Troubleshooting#

Variable Not Rendering#

If a variable shows as literal text (e.g., {$hostname} instead of server1):

  1. Check that the variable name is spelled correctly
  2. Verify the variable exists in the Available Variables list above
  3. Ensure you’re not inside a {literal} block
  4. For Windows-only variables, verify the installation is for Windows

Script Execution Issues#

If installation scripts aren’t running:

  1. Verify the URL is accessible: {$url.script.during} should return a valid shell script
  2. Check for HTTPS issues - use |replace:'https://':'http://' if needed
  3. Add --insecure flag to curl commands for self-signed certificates
  4. Add -L flag to curl commands to follow HTTP/HTTPS redirects: curl -L {$url.script.final}
  5. Verify the API key hasn’t expired (4-hour timeout)

RAID Configuration Not Working#

If RAID partitioning fails:

  1. Check {$install.disk.raid} value - should be 0, 1, 10, or null
  2. Use strict comparison: {if $install.disk.raid === null} not {if !$install.disk.raid}
  3. Ensure enough disks are available for the RAID level
  4. Verify disk identifiers ({$install.disk.linux}) match your hardware