---
# System prepended metadata

title: Assisted Installer Customization

---


# Assisted Installer Customization


# Epics



*   Manifests: [https://issues.redhat.com/browse/MGMT-1780](https://issues.redhat.com/browse/MGMT-1780)
*   Discovery ignition: [https://issues.redhat.com/browse/MGMT-1793](https://issues.redhat.com/browse/MGMT-1793)
*   Install Config: [https://issues.redhat.com/browse/MGMT-1883](https://issues.redhat.com/browse/MGMT-1883)
*   Pointer Ignition: [https://issues.redhat.com/browse/MGMT-1989](https://issues.redhat.com/browse/MGMT-1989)
*   Installer Params: [https://issues.redhat.com/browse/MGMT-2476](https://issues.redhat.com/browse/MGMT-2476)
*   Minimal ISO: [https://issues.redhat.com/browse/MGMT-2863](https://issues.redhat.com/browse/MGMT-2863) 


# Use Cases


## Disconnected On-Prem

Reference: [https://docs.google.com/document/d/154qX7sv7cHCpIe8Kzif39Ka19sUJxu25YeiYnygbHf8/edit#heading=h.474n44t0zdq2](https://docs.google.com/document/d/154qX7sv7cHCpIe8Kzif39Ka19sUJxu25YeiYnygbHf8/edit#heading=h.474n44t0zdq2)

Utilizes: Discovery Ignition, Install Config

In this case a user mirrors all the container images required to run OpenShift and Assisted Installer to a local registry. That registry has to be configured on the nodes during discovery and install. This requires modification of the install config (adds imageContentSources and additionalTrustBundle) as well as discovery ignition (adds registries.conf and the registry CA cert).


## Static IP before and during install

Reference: Email with subject “[kni-devel] Assisted Installer Weekly Demo (2020-10-29)”

Utilizes: Discovery Ignition, Installer Params

In this case a user needs to configure a static IP for each node in the cluster. This is not possible using the pointer ignition because the entire ignition file needs to be resolved before anything will be written to the filesystem. This leaves us with a chicken-egg problem. The ignition cannot be resolved because we can’t download the referenced ignition from the control plane without an IP, but we won’t get an IP unless we write some files to configure the static IP.


For the discovery step the user can ship a mac-to-IP mapping and a script to set the IP in the discovery ignition. For the installed node this is solved by adding kernel parameters to the coreos-installer command. These parameters (specifically ip and nameserver) can be used to establish the network connection we need to resolve the remote reference in the pointer ignition.File System Manipulation

Reference: [https://docs.openshift.com/container-platform/4.6/installing/install_config/installing-customizing.html](https://docs.openshift.com/container-platform/4.6/installing/install_config/installing-customizing.html) 

Utilizes: Discovery Ignition, Manifests

In this case a user wants to make cluster wide changes to the filesystem before and/or after install. Customization of the discovery ignition allows arbitrary files to be placed on the filesystem before reboot, and Machine Config Operator manifests are used for changes to the nodes after the cluster is installed. The manifests also will automatically make the changes available to any nodes added to the cluster after initial installation.

An example of this would be ntp (chronyd) configuration.


## Minimal discovery ISO

Reference: [https://docs.google.com/document/d/1ixaRhDkVnlQvDK1HgimKrbyRJPfJgSaw9jE-MS0ZdIo/edit?usp=sharing](https://docs.google.com/document/d/1ixaRhDkVnlQvDK1HgimKrbyRJPfJgSaw9jE-MS0ZdIo/edit?usp=sharing)


# Examples


## Manifests


### Create a cluster manifest


```
# base64 encoding of the example from https://docs.openshift.com/container-platform/4.6/installing/install_config/installing-customizing.html 
content=YXBpVmVyc2lvbjogbWFjaGluZWNvbmZpZ3VyYXRpb24ub3BlbnNoaWZ0LmlvL3YxCmtpbmQ6IE1hY2hpbmVDb25maWcKbWV0YWRhdGE6CiAgbGFiZWxzOgogICAgbWFjaGluZWNvbmZpZ3VyYXRpb24ub3BlbnNoaWZ0LmlvL3JvbGU6IG1hc3RlcgogIG5hbWU6IDk5LW9wZW5zaGlmdC1tYWNoaW5lY29uZmlnLW1hc3Rlci1rYXJncwpzcGVjOgogIGtlcm5lbEFyZ3VtZW50czoKICAgIC0gJ2xvZ2xldmVsPTcnCg==
file=openshift/99-openshift-machineconfig-master-kargs.yaml

curl \
    --header "Content-Type: application/json" \
    --header "Authorization: Bearer $TOKEN" \
    --request POST \
    --data "{\"file_name\":\"$file\", \"content\":\"$content\"}" \
"http://$ASSISTED_SERVICE_IP:$ASSISTED_SERVICE_PORT/api/assisted-install/v1/clusters/$CLUSTER_ID/manifests"
```



### View a manifest’s contents


```
file=openshift/99-openshift-machineconfig-master-kargs.yaml

curl --header "Authorization: Bearer $TOKEN" "http://$ASSISTED_SERVICE_IP:$ASSISTED_SERVICE_PORT/api/assisted-install/v1/clusters/$CLUSTER_ID/manifests/files?file_name=$file"
```



## Discovery Ignition


### Patch the discovery ignition


```
# ignition patch file
{
  "config": "{\"ignition\": {\"version\": \"3.1.0\"}, \"storage\": {\"files\": [{\"path\": \"/etc/containers/registries.conf\", \"mode\": 420, \"overwrite\": true, \"user\": { \"name\": \"root\"},\"contents\": {\"source\": \"data:text/plain;base64,dW5xdWFsaWZpZWQtc2VhcmNoLXJlZ2lzdHJpZXMgPSBbInJlZ2lzdHJ5LmFjY2Vzcy5yZWRoYXQuY29tIiwgImRvY2tlci5pbyJdCltbcmVnaXN0cnldXQogICBwcmVmaXggPSAiIgogICBsb2NhdGlvbiA9ICJxdWF5LmlvL29jcG1ldGFsIgogICBtaXJyb3ItYnktZGlnZXN0LW9ubHkgPSBmYWxzZQogICBbW3JlZ2lzdHJ5Lm1pcnJvcl1dCiAgIGxvY2F0aW9uID0gImxvY2FsLnJlZ2lzdHJ5OjUwMDAvb2NwbWV0YWwiCg==\"}}]}}"
}

curl \
    --header "Content-Type: application/json" \
    --header "Authorization: Bearer $TOKEN" \
    --request PATCH \
    --data @discovery-ign.json \
"http://$ASSISTED_SERVICE_IP:$ASSISTED_SERVICE_PORT/api/assisted-install/v1/clusters/$CLUSTER_ID/discovery-ignition"
```



### View the discovery ignition


```
curl --header "Authorization: Bearer $TOKEN" "http://$ASSISTED_SERVICE_IP:$ASSISTED_SERVICE_PORT/api/assisted-install/v1/clusters/$CLUSTER_ID/discovery-ignition"
```



## Install Config


### Patch the install config


```
curl \
    --header "Content-Type: application/json" \
    --header "Authorization: Bearer $TOKEN" \
    --request PATCH \
    --data '"{\"controlPlane\":{\"hyperthreading\":\"Disabled\"}}"' \
"http://$ASSISTED_SERVICE_IP:$ASSISTED_SERVICE_PORT/api/assisted-install/v1/clusters/$CLUSTER_ID/install-config"
```



### View the install config


```
curl --header "Authorization: Bearer $TOKEN" "http://$ASSISTED_SERVICE_IP:$ASSISTED_SERVICE_PORT/api/assisted-install/v1/clusters/$CLUSTER_ID/install-config"
```



## Pointer Ignition


### Patch the pointer ignition


```
curl \
    --header "Content-Type: application/json" \
    --header "Authorization: Bearer $TOKEN" \
    --request PATCH \
    --data '{"config": "{\"ignition\": {\"version\": \"3.1.0\"}, \"storage\": {\"files\": [{\"path\": \"/etc/example\", \"contents\": {\"source\": \"data:text/plain;base64,SGVsbG8gZnJvbSBob3N0IDg0Njk2NzdiLThlZGEtNDQzOS1iNDQwLTc3ZGM5M2FkZmNlZgo=\"}}]}}"}' \
"http://$ASSISTED_SERVICE_IP:$ASSISTED_SERVICE_PORT/api/assisted-install/v1/clusters/$CLUSTER_ID/hosts/$HOST_ID/ignition"
```



### View the pointer ignition


```
curl --header "Authorization: Bearer $TOKEN" "http://$ASSISTED_SERVICE_IP:$ASSISTED_SERVICE_PORT/api/assisted-install/v1/clusters/$CLUSTER_ID/hosts/$HOST_ID/ignition"
```



## Installer Params


### Set the installer params


```
curl \
    --header "Content-Type: application/json" \
    --header "Authorization: Bearer $TOKEN" \
    --request PATCH \
    --data '{"args": ["--append-karg", "nameserver=8.8.8.8", "-n"]}' \
"http://$ASSISTED_SERVICE_IP:$ASSISTED_SERVICE_PORT/api/assisted-install/v1/clusters/$CLUSTER_ID/hosts/$HOST_ID/installer-args"
