Project

General

Profile

Download (6.26 KB) Statistics
| Branch: | Tag: | Revision:
<%#
kind: snippet
name: kickstart_kernel_options
model: ProvisioningTemplate
snippet: true
description: |
The list of kernel options for initrd appended to the bootloader kernel line on Red Hat compatible distributions.
Typically renders to a string with the url where to fetch the OS installer answer files, e.g.
network ksdevice=bootif ks.device=bootif BOOTIF=01-52-54-00-8b-a3-86 inst.ks=http://foreman.example.com/unattended/provision inst.ks.sendmac ip=dhcp nameserver=192.168.122.1
Custom options can be added by setting the array parameter kickstart_kernel_custom_options
-%>
<%
rhel_compatible = @host.operatingsystem.family == 'Redhat' && @host.operatingsystem.name != 'Fedora'
is_fedora = @host.operatingsystem.name == 'Fedora'
os_major = @host.operatingsystem.major.to_i
os_minor = @host.operatingsystem.minor.to_i
major = @host.operatingsystem.major.to_i
hostname = @host.name
iface = @host.provision_interface
mac = @host.provision_interface.mac
subnet4 = iface.subnet
subnet6 = iface.subnet6
dual_stack_fallback = host_param('dual_stack_provision_fallback')

custom_options = [host_param('kickstart_kernel_custom_options')].flatten.compact
options = []

if rhel_compatible && os_major < 8
# replaced with BOOTIF in EL8+
options.push("network", "ksdevice=bootif", "ks.device=bootif")
end

if mac
# hardware type is always 01 (ethernet) unless specified otherwise
options.push("BOOTIF=#{host_param("hardware_type", "01")}-#{mac.gsub(':', '-')}")
end

# tell Anaconda what to pass off to kickstart server
# both current and legacy syntax provided
if (is_fedora && os_major >= 33) || (rhel_compatible && os_major >= 8)
if subnet4 && !subnet4.dhcp_boot_mode?
options.push("inst.ks=#{foreman_url('provision', static: '1').gsub("&", "\\\\&")}")
elsif subnet6 && !subnet6.dhcp_boot_mode?
options.push("inst.ks=#{foreman_url('provision', static6: '1').gsub("&", "\\\\&")}")
else
options.push("inst.ks=#{foreman_url('provision').gsub("&", "\\\\&")}", "inst.ks.sendmac")
end
else
if subnet4 && !subnet4.dhcp_boot_mode?
options.push("ks=#{foreman_url('provision', static: '1').gsub("&", "\\\\&")}")
elsif subnet6 && !subnet6.dhcp_boot_mode?
options.push("ks=#{foreman_url('provision', static6: '1').gsub("&", "\\\\&")}")
else
options.push("ks=#{foreman_url('provision').gsub("&", "\\\\&")}", "kssendmac", "ks.sendmac")
end
end

# networking credentials
if subnet4 && subnet6
if dual_stack_fallback == 'IPv4'
subnet6 = false
elsif dual_stack_fallback == 'IPv6'
subnet4 = false
else
raise("Dual-stack provisioning not supported, set parameter 'dual_stack_provision_fallback'")
end
end
options.push("dualstack!") if subnet4 && subnet6
if subnet4 && subnet4.dhcp_boot_mode?
options.push("ip=dhcp") if rhel_compatible && major >= 7
elsif subnet4 && !subnet4.dhcp_boot_mode?
if rhel_compatible && major < 7
dns_servers = subnet4.dns_servers.join(',')
if @ipxe_net
options.push('ip=${netX/ip} netmask=${netX/netmask} gateway=${netX/gateway} dns=${dns}')
else
options.push("ip=#{iface.ip}", "netmask=#{subnet4.mask}", "gateway=#{subnet4.gateway}", "dns=#{dns_servers}")
end
else
if @ipxe_net
options.push("ip=${netX/ip}::${netX/gateway}:${netX/netmask}:#{hostname}:#{iface.identifier}:none nameserver=${dns}")
else
options.push("ip=#{iface.ip}::#{subnet4.gateway}:#{subnet4.mask}:#{hostname}:#{iface.identifier}:none")
end
end
elsif subnet6 && subnet6.dhcp_boot_mode? && rhel_compatible && major >= 7
if host_param_true?("use-slaac")
options.push("ip=auto6")
else
options.push("ip=dhcp6")
end
elsif subnet6 && !subnet6.dhcp_boot_mode?
raise("Static IPv6 provisioning works on RHEL7 or newer") if rhel_compatible && major < 7
gw = subnet6.gateway ? "[#{subnet6.gateway}]" : ""
options.push("ip=[#{iface.ip6}]::#{gw}:#{subnet6.cidr}:#{hostname}:#{iface.identifier}:none")
end

# nameservers - must be present even for DHCP subnets because of bug:
# https://bugzilla.redhat.com/show_bug.cgi?id=1795276
if subnet4 && !@ipxe_net
subnet4.dns_servers.each { |server|
options.push("nameserver=#{server}")
}
elsif subnet6 && !@ipxe_net
subnet6.dns_servers.each { |server|
options.push("nameserver=#{server}")
}
end

# bond
if iface.bond? && rhel_compatible && os_major >= 6
bond_slaves = iface.attached_devices_identifiers.join(',')
options.push("bond=#{iface.identifier}:#{bond_slaves}:mode=#{iface.mode},#{iface.bond_options.tr(' ', ',')}")
end

# VLAN (only on physical is recognized)
if iface.virtual? && iface.tag.present? && iface.attached_to.present?
if iface.attached_to.match 'bond'
@host.bond_interfaces.each do |bond_interface|
if bond_interface.identifier == iface.attached_to
bond_slaves = bond_interface.attached_devices_identifiers.join(',')
options.push("bond=#{bond_interface.identifier}:#{bond_slaves}:mode=#{bond_interface.mode},#{bond_interface.bond_options.tr(' ', ',')}")
end
end
end
if (is_fedora && os_major < 17) || (rhel_compatible && os_major < 7)
options.push("vlanid=#{iface.tag}")
else
options.push("vlan=#{iface.attached_to}.#{iface.tag}:#{iface.attached_to}")
end
end

if host_param('kickstart_liveimg')
options.push("inst.stage2=#{medium_uri}")
end

# S390x architecture has a different stage two image:
# https://access.redhat.com/solutions/4206591
if @host.architecture.to_s.match(/s390x?/i)
options.push("inst.cmdline")
options.push("inst.repo=#{medium_uri}")
end

# FIPS
if !is_fedora && os_major >= 7 && host_param_true?('fips_enabled')
options.push('fips=1')
end

nic_delay = subnet4&.nic_delay || subnet6&.nic_delay
if nic_delay && rhel_compatible && major >= 7
["dhcp", "iflink", "ifup", "route", "ipv6dad", "ipv6auto", "carrier"].each do |type|
options.push("rd.net.timeout.#{type}=#{nic_delay}")
end
elsif nic_delay
options.push("nicdelay=#{nic_delay} linksleep=#{nic_delay}")
end

# add user specified custom options if specified (noop if not)
options.concat(custom_options)
-%>
<%# do not add newline after the next line %>
<%= options.join(' ') -%>
(26-26/55)