---
title: Ideas for Customization
weight: 40
aliases: /ansible-edge-gitops/ideas-for-customization/
---

:toc:
:imagesdir: /images
:_content-type: ASSEMBLY
include::modules/comm-attributes.adoc[]

== Why customize the pattern

A key goal of the Red Hat patterns development process is to create modular, customizable demos. You can adapt them to fit your specific use cases.
For example: 

* You may not be interested in Ignition as an application.
* You might not have kiosks, but you have other edge computing use cases involving containers.
* You may want to experiment with different RHEL releases.
* You might want to explore alternative use cases for Ansible Automation Platform.

This demo offers several customization options. Here are some starter ideas, along with instructions on what to change and where to make those changes in the pattern.

== Defining your own VM sets using the chart

. Fork the link:https://github.com/validatedpatterns/ansible-edge-gitops[repo].

. Clone the repository to your local machine.

. Change to the `ansible-edge-gitops` directory.

. Create and switch to a new branch named `my-branch`, by running the following command:
+
[source,shell]
----
$ git checkout -b my-branch
----

. Change to the `overides` directory.
+
For example, to replace kiosk with new `iotsensor`` and `iotgateway` types, the file might look like this:
+
[source,yaml]
----
---
vms:
  # Define the iotsensor VMs
  iotsensor:
    count: 4
    flavor: small
    workload: server
    os: rhel8
    role: iotsensor
    storage: 20Gi
    memory: 2Gi
    cores: 1
    sockets: 1
    threads: 1
    cloudInitUser: cloud-user
    cloudInitPassword: 'password123'
    template: rhel8-server-small
    sshsecret: secret/data/hub/iotsensor-ssh
    sshpubkeyfield: publickey
    ports:
      - name: ssh
        port: 22
        protocol: TCP
        targetPort: 22

  # Define the iotgateway VMs
  iotgateway:
    count: 1
    flavor: medium
    workload: server
    os: rhel8
    role: iotgateway
    storage: 30Gi
    memory: 4Gi
    cores: 1
    sockets: 1
    threads: 1
    cloudInitUser: cloud-user
    cloudInitPassword: 'password123'
    template: rhel8-server-medium
    sshsecret: secret/data/hub/iotgateway-ssh
    sshpubkeyfield: publickey
    ports:
      - name: ssh
        port: 22
        protocol: TCP
        targetPort: 22
      - name: mqtt
        port: 1883
        protocol: TCP
        targetPort: 1883
----

This would create 1 `iotgateway` VM and 4 `iotsensor` VMs. 

You also need to define the SSH secrets (`iotgateway-ssh` and `iotsensor-ssh`) data structures in `~/values-secret.yaml`.

== Defining your own VM sets "`from scratch`"

. Pick a default template from the standard OpenShift Virtualization template library in the `openshift` namespace. For this pattern, we used `rhel8-desktop-medium`:
+
[source,text]
----
$ oc get template -n openshift rhel8-desktop-medium
----
+
.Example output
[source,text]
----
NAME                   DESCRIPTION                                                                        PARAMETERS        OBJECTS
rhel8-desktop-medium   Template for Red Hat Enterprise Linux 8 VM or newer. A PVC with the RHEL disk...   4 (2 generated)   1
----

. Create a VM through the command line template process by running the following command: 
+
[source,shell]
----
oc process -n openshift rhel8-desktop-medium | oc apply -f -
----
+
.Example output
[source,text]
----
{
    "kind": "List",
    "apiVersion": "v1",
    "metadata": {},
    "items": [
        {
            "apiVersion": "kubevirt.io/v1",
            "kind": "VirtualMachine",
            "metadata": {
                "annotations": {
                    "vm.kubevirt.io/validations": "[\n  {\n    \"name\": \"minimal-required-memory\",\n    \"path\": \"jsonpath::.spec.domain.memory.guest\",\n    \"rule\": \"integer\",\n    \"message\": \"This VM requires more memory.\",\n    \"min\": 1610612736\n  }\n]\n"
                },
                "labels": {
                    "app": "rhel8-y43iixn7issko1lu",
                    "vm.kubevirt.io/template": "rhel8-desktop-medium",
                    "vm.kubevirt.io/template.revision": "1",
                    "vm.kubevirt.io/template.version": "v0.31.1"
                },
                "name": "rhel8-y43iixn7issko1lu"
            },
            "spec": {
                "dataVolumeTemplates": [
                    {
                        "apiVersion": "cdi.kubevirt.io/v1beta1",
                        "kind": "DataVolume",
                        "metadata": {
                            "name": "rhel8-y43iixn7issko1lu"
                        },
                        "spec": {
                            "sourceRef": {
                                "kind": "DataSource",
                                "name": "rhel8",
                                "namespace": "openshift-virtualization-os-images"
                            },
                            "storage": {
                                "resources": {
                                    "requests": {
                                        "storage": "30Gi"
                                    }
                                }
                            }
                        }
                    }
                ],
                "running": false,
                "template": {
                    "metadata": {
                        "annotations": {
                            "vm.kubevirt.io/flavor": "medium",
                            "vm.kubevirt.io/os": "rhel8",
                            "vm.kubevirt.io/workload": "desktop"
                        },
                        "labels": {
                            "kubevirt.io/domain": "rhel8-y43iixn7issko1lu",
                            "kubevirt.io/size": "medium"
                        }
                    },
                    "spec": {
                        "architecture": "amd64",
                        "domain": {
                            "cpu": {
                                "cores": 1,
                                "sockets": 1,
                                "threads": 1
                            },
                            "devices": {
                                "disks": [
                                    {
                                        "disk": {
                                            "bus": "virtio"
                                        },
                                        "name": "rootdisk"
                                    },
                                    {
                                        "disk": {
                                            "bus": "virtio"
                                        },
                                        "name": "cloudinitdisk"
                                    }
                                ],
                                "inputs": [
                                    {
                                        "bus": "virtio",
                                        "name": "tablet",
                                        "type": "tablet"
                                    }
                                ],
                                "interfaces": [
                                    {
                                        "masquerade": {},
                                        "model": "virtio",
                                        "name": "default"
                                    }
                                ],
                                "rng": {}
                            },
                            "memory": {
                                "guest": "4Gi"
                            }
                        },
                        "networks": [
                            {
                                "name": "default",
                                "pod": {}
                            }
                        ],
                        "terminationGracePeriodSeconds": 180,
                        "volumes": [
                            {
                                "dataVolume": {
                                    "name": "rhel8-y43iixn7issko1lu"
                                },
                                "name": "rootdisk"
                            },
                            {
                                "cloudInitNoCloud": {
                                    "userData": "#cloud-config\nuser: cloud-user\npassword: 1pna-7owu-mrna\nchpasswd: { expire: False }"
                                },
                                "name": "cloudinitdisk"
                            }
                        ]
                    }
                }
            }
        }
    ]
}
----

. Use the template to create a VM:
+
[source,shell]
----
$ oc process -n openshift rhel8-desktop-medium | oc apply -f -
----
+
.Example output
[source,text]
----
virtualmachine.kubevirt.io/rhel8-q63yuvxpjdvy18l7 created
----
+
In just a few minutes, you will have a blank rhel8 VM, which you can then start and log in to by using the console and customize.

. Get the details of this template as a local YAML file:
+
[source,shell]
----
$ oc get template -n openshift rhel8-desktop-medium -o yaml > my-template.yaml
----
+
Once you have this local template, you can view the elements you want to customize.