diff --git a/cmd/eksctl-anywhere/cmd/generateclusterconfig.go b/cmd/eksctl-anywhere/cmd/generateclusterconfig.go index 78ce9302dd47..10e13834f849 100644 --- a/cmd/eksctl-anywhere/cmd/generateclusterconfig.go +++ b/cmd/eksctl-anywhere/cmd/generateclusterconfig.go @@ -1,8 +1,10 @@ package cmd import ( + "encoding/csv" "fmt" "log" + "os" "strings" "github.com/spf13/cobra" @@ -50,6 +52,7 @@ func preRunGenerateClusterConfig(cmd *cobra.Command, args []string) { func init() { generateCmd.AddCommand(generateClusterConfigCmd) generateClusterConfigCmd.Flags().StringP("provider", "p", "", fmt.Sprintf("Provider to use (%s)", strings.Join(constants.SupportedProviders, " or "))) + generateClusterConfigCmd.Flags().StringP("paramsFile", "m", "", "parameters file (vsphere or tinkerbell)") err := generateClusterConfigCmd.MarkFlagRequired("provider") if err != nil { log.Fatalf("marking flag as required: %v", err) @@ -61,6 +64,34 @@ func generateClusterConfig(clusterName string) error { var datacenterYaml []byte var machineGroupYaml [][]byte var clusterConfigOpts []v1alpha1.ClusterGenerateOpt + var kubernetesVersion string + var tinkerbellTemplateConfigTemplate string + var podsCidrBlocks []string + var servicesCidrBlocks []string + var paramsData []byte + var err error + + // use cluster name as the default management cluster name. + managementClusterName := clusterName + + if viper.IsSet("paramsFile") { + paramsFile := viper.GetString("paramsFile") + paramsData, err = os.ReadFile(paramsFile) + + switch strings.ToLower(viper.GetString("provider")) { + case constants.VSphereProviderName: + if err != nil { + return fmt.Errorf("reading paramsFile: %v\nSample paramsFile has content:\n%s", err, GetDefaultVSphereParamsTemplate()) + } + case constants.TinkerbellProviderName: + if err != nil { + return fmt.Errorf("reading paramsFile: %v\nSample paramsFile has content:\n%s", err, GetDefaultTinkerbellParamsTemplate()) + } + default: + return fmt.Errorf("parameter file is only supported for vsphere and tinkerbell") + } + } + switch strings.ToLower(viper.GetString("provider")) { case constants.DockerProviderName: datacenterConfig := v1alpha1.NewDockerDatacenterConfigGenerate(clusterName) @@ -77,13 +108,54 @@ func generateClusterConfig(clusterName string) error { } datacenterYaml = dcyaml case constants.VSphereProviderName: - clusterConfigOpts = append(clusterConfigOpts, v1alpha1.WithClusterEndpoint()) - datacenterConfig := v1alpha1.NewVSphereDatacenterConfigGenerate(clusterName) + var vSphereParams v1alpha1.VSphereClusterConfigParams + err = yaml.Unmarshal(paramsData, &vSphereParams) + if err != nil { + return fmt.Errorf("unmarshal vSphereParams: %v", err) + } + + if vSphereParams.ManagementClusterName != "" { + // override the management cluster name with that from parameter file. + managementClusterName = vSphereParams.ManagementClusterName + } + + // set podsCidrBlocks and servicesCidrBlocks to the values from parameter file. + podsCidrBlocks = vSphereParams.PodsCidrBlocks + servicesCidrBlocks = vSphereParams.ServicesCidrBlocks + + if vSphereParams.CPEndpointHost != "" { + // add control plane endpoint config with host from parameter file. + clusterConfigOpts = append(clusterConfigOpts, v1alpha1.WithClusterEndpointHost(vSphereParams.CPEndpointHost)) + } else { + clusterConfigOpts = append(clusterConfigOpts, v1alpha1.WithClusterEndpoint()) + } + + // create datacenter config with values from parameter file + datacenterConfig := v1alpha1.NewVSphereDatacenterConfigGenerate(clusterName, vSphereParams.Datacenter, vSphereParams.Network, vSphereParams.Server, vSphereParams.Thumbprint, vSphereParams.Insecure) clusterConfigOpts = append(clusterConfigOpts, v1alpha1.WithDatacenterRef(datacenterConfig)) + // default counts of CP nodes, Etcd nodes and worker nodes. + cpCount := 2 + etcdCount := 3 + workerCount := 2 + + if vSphereParams.CPCount != 0 { + // override counts of CP nodes with value from parameter file. + cpCount = vSphereParams.CPCount + } + + if vSphereParams.EtcdCount != 0 { + // override counts of Etcd nodes with value from parameter file. + etcdCount = vSphereParams.EtcdCount + } + + if vSphereParams.WorkerCount != 0 { + // override counts of Worker nodes with value from parameter file. + workerCount = vSphereParams.WorkerCount + } clusterConfigOpts = append(clusterConfigOpts, - v1alpha1.ControlPlaneConfigCount(2), - v1alpha1.ExternalETCDConfigCount(3), - v1alpha1.WorkerNodeConfigCount(2), + v1alpha1.ControlPlaneConfigCount(cpCount), + v1alpha1.ExternalETCDConfigCount(etcdCount), + v1alpha1.WorkerNodeConfigCount(workerCount), v1alpha1.WorkerNodeConfigName(constants.DefaultWorkerNodeGroupName), ) dcyaml, err := yaml.Marshal(datacenterConfig) @@ -91,11 +163,21 @@ func generateClusterConfig(clusterName string) error { return fmt.Errorf("generating cluster yaml: %v", err) } datacenterYaml = dcyaml + var sshAuthorizedKey string + if vSphereParams.SSHAuthorizedKeyFile != "" { + b, err := os.ReadFile(vSphereParams.SSHAuthorizedKeyFile) + if err != nil { + return fmt.Errorf("open sshAuthorizedKeyFile file: %v", err) + } + sshAuthorizedKey = string(b) + } + + kubernetesVersion = vSphereParams.KubernetesVersion // need to default control plane config name to something different from the cluster name based on assumption // in controller code - cpMachineConfig := v1alpha1.NewVSphereMachineConfigGenerate(providers.GetControlPlaneNodeName(clusterName)) - workerMachineConfig := v1alpha1.NewVSphereMachineConfigGenerate(clusterName) - etcdMachineConfig := v1alpha1.NewVSphereMachineConfigGenerate(providers.GetEtcdNodeName(clusterName)) + cpMachineConfig := v1alpha1.NewVSphereMachineConfigGenerate(providers.GetControlPlaneNodeName(clusterName), vSphereParams.Datastore, vSphereParams.Folder, vSphereParams.ResourcePool, vSphereParams.Template, sshAuthorizedKey, vSphereParams.OSFamily, vSphereParams.CPDiskGiB, vSphereParams.CPNumCPUs, vSphereParams.CPMemoryMiB) + workerMachineConfig := v1alpha1.NewVSphereMachineConfigGenerate(clusterName, vSphereParams.Datastore, vSphereParams.Folder, vSphereParams.ResourcePool, vSphereParams.Template, sshAuthorizedKey, vSphereParams.OSFamily, vSphereParams.WorkerDiskGiB, vSphereParams.WorkerNumCPUs, vSphereParams.WorkerMemoryMiB) + etcdMachineConfig := v1alpha1.NewVSphereMachineConfigGenerate(providers.GetEtcdNodeName(clusterName), vSphereParams.Datastore, vSphereParams.Folder, vSphereParams.ResourcePool, vSphereParams.Template, sshAuthorizedKey, vSphereParams.OSFamily, vSphereParams.EtcdDiskGiB, vSphereParams.EtcdNumCPUs, vSphereParams.EtcdMemoryMiB) clusterConfigOpts = append(clusterConfigOpts, v1alpha1.WithCPMachineGroupRef(cpMachineConfig), v1alpha1.WithWorkerMachineGroupRef(workerMachineConfig), @@ -183,35 +265,172 @@ func generateClusterConfig(clusterName string) error { } machineGroupYaml = append(machineGroupYaml, cpMcYaml, workerMcYaml, etcdMcYaml) case constants.TinkerbellProviderName: - clusterConfigOpts = append(clusterConfigOpts, v1alpha1.WithClusterEndpoint()) - datacenterConfig := v1alpha1.NewTinkerbellDatacenterConfigGenerate(clusterName) + var tinkerbellParams v1alpha1.TinkerbellClusterConfigParams + err = yaml.Unmarshal(paramsData, &tinkerbellParams) + if err != nil { + return fmt.Errorf("unmarshal tinkerbellParams: %v", err) + } + + if tinkerbellParams.ManagementClusterName != "" { + // override the management cluster name with that from parameter file. + managementClusterName = tinkerbellParams.ManagementClusterName + } + + // set podsCidrBlocks and servicesCidrBlocks to the values from parameter file. + podsCidrBlocks = tinkerbellParams.PodsCidrBlocks + servicesCidrBlocks = tinkerbellParams.ServicesCidrBlocks + + if tinkerbellParams.CPEndpointHost != "" { + // add control plane endpoint config with host from parameter file. + clusterConfigOpts = append(clusterConfigOpts, v1alpha1.WithClusterEndpointHost(tinkerbellParams.CPEndpointHost)) + } else { + clusterConfigOpts = append(clusterConfigOpts, v1alpha1.WithClusterEndpoint()) + } + + kubernetesVersion = tinkerbellParams.KubernetesVersion + + adminIP := tinkerbellParams.AdminIP + tinkerbellIP := tinkerbellParams.TinkerbellIP + osImageURL := tinkerbellParams.OSImageURL + + // create datacenter config with values from parameter file + datacenterConfig := v1alpha1.NewTinkerbellDatacenterConfigGenerate(clusterName, tinkerbellIP, osImageURL) clusterConfigOpts = append(clusterConfigOpts, v1alpha1.WithDatacenterRef(datacenterConfig)) + // default counts of CP nodes, Etcd nodes and worker nodes. + cpCount := 1 + workerCount := 1 + if tinkerbellParams.HardwareCSV != "" { + // parse hardware.csv file to get counts of CP/worker nodes + f, err := os.Open(tinkerbellParams.HardwareCSV) + if err != nil { + return fmt.Errorf("open hardware file: %v", err) + } + defer f.Close() + csvReader := csv.NewReader(f) + data, err := csvReader.ReadAll() + if err != nil { + return fmt.Errorf("read hardware file: %v", err) + } + macIndex := -1 + ipIndex := -1 + labelsIndex := -1 + cpCount = 0 + workerCount = 0 + for i, line := range data { + if i == 0 { + // from the header (first line), find the index of + // MAC, IP, labels. + for j, field := range line { + if strings.EqualFold(field, "mac") { + macIndex = j + } else if strings.EqualFold(field, "ip_address") { + ipIndex = j + } else if strings.EqualFold(field, "labels") { + labelsIndex = j + } + } + if macIndex == -1 { + return fmt.Errorf("no mac header found in hardware file") + } + if ipIndex == -1 { + return fmt.Errorf("no ip header found in hardware file") + } + if labelsIndex == -1 { + return fmt.Errorf("no labels header found in hardware file") + } + } else { + // for rest lines, increase counts of CP nodes and worker nodes. + if strings.ToLower(line[labelsIndex]) == "type=cp" { + cpCount = cpCount + 1 + } else { + workerCount = workerCount + 1 + } + } + } + } + + if tinkerbellParams.CPCount != 0 { + // override counts of CP nodes with value from parameter file. + cpCount = tinkerbellParams.CPCount + } + + if tinkerbellParams.WorkerCount != 0 { + // override counts of Worker nodes with value from parameter file. + workerCount = tinkerbellParams.WorkerCount + } + clusterConfigOpts = append(clusterConfigOpts, - v1alpha1.ControlPlaneConfigCount(1), - v1alpha1.WorkerNodeConfigCount(1), - v1alpha1.WorkerNodeConfigName(constants.DefaultWorkerNodeGroupName), + v1alpha1.ControlPlaneConfigCount(cpCount), ) + if workerCount > 0 { + // only generate worker cluster when worker count > 0. + clusterConfigOpts = append(clusterConfigOpts, + v1alpha1.WorkerNodeConfigCount(workerCount), + v1alpha1.WorkerNodeConfigName(constants.DefaultWorkerNodeGroupName), + ) + } dcyaml, err := yaml.Marshal(datacenterConfig) if err != nil { return fmt.Errorf("generating cluster yaml: %v", err) } datacenterYaml = dcyaml - cpMachineConfig := v1alpha1.NewTinkerbellMachineConfigGenerate(providers.GetControlPlaneNodeName(clusterName)) - workerMachineConfig := v1alpha1.NewTinkerbellMachineConfigGenerate(clusterName) + var sshAuthorizedKey string + if tinkerbellParams.SSHAuthorizedKeyFile != "" { + b, err := os.ReadFile(tinkerbellParams.SSHAuthorizedKeyFile) + if err != nil { + return fmt.Errorf("open sshAuthorizedKeyFile file: %v", err) + } + sshAuthorizedKey = string(b) + } + + cpMachineConfig := v1alpha1.NewTinkerbellMachineConfigGenerate(clusterName, providers.GetControlPlaneNodeName(clusterName), "cp", sshAuthorizedKey, tinkerbellParams.OSFamily) clusterConfigOpts = append(clusterConfigOpts, v1alpha1.WithCPMachineGroupRef(cpMachineConfig), - v1alpha1.WithWorkerMachineGroupRef(workerMachineConfig), ) cpMcYaml, err := yaml.Marshal(cpMachineConfig) if err != nil { return fmt.Errorf("generating cluster yaml: %v", err) } - workerMcYaml, err := yaml.Marshal(workerMachineConfig) - if err != nil { - return fmt.Errorf("generating cluster yaml: %v", err) + machineGroupYaml = append(machineGroupYaml, cpMcYaml) + + if workerCount > 0 { + workerMachineConfig := v1alpha1.NewTinkerbellMachineConfigGenerate(clusterName, clusterName, "worker", sshAuthorizedKey, tinkerbellParams.OSFamily) + // only generate worker machine group reference when worker count > 0. + clusterConfigOpts = append(clusterConfigOpts, + v1alpha1.WithWorkerMachineGroupRef(workerMachineConfig), + ) + // only generate worker machine config YAML when worker count > 0. + workerMcYaml, err := yaml.Marshal(workerMachineConfig) + if err != nil { + return fmt.Errorf("generating cluster yaml: %v", err) + } + machineGroupYaml = append(machineGroupYaml, workerMcYaml) + } + + if viper.IsSet("paramsFile") { + if tinkerbellParams.TinkerbellTemplateConfigTemplateFile != "" { + b, err := os.ReadFile(tinkerbellParams.TinkerbellTemplateConfigTemplateFile) + if err != nil { + if tinkerbellParams.OSFamily == v1alpha1.Ubuntu { + return fmt.Errorf("open tinkerbellTemplateConfigTemplateFile file: %v\nSample TinkerbellTemplateConfigTemplateFile has content:%s", err, GetDefaultTinkerbellTemplateConfigTemplateUbuntu()) + } else if tinkerbellParams.OSFamily == v1alpha1.Bottlerocket { + return fmt.Errorf("open tinkerbellTemplateConfigTemplateFile file: %v\nSample TinkerbellTemplateConfigTemplateFile has content:%s", err, GetDefaultTinkerbellTemplateConfigTemplateBottlerocket()) + } + return fmt.Errorf("open tinkerbellTemplateConfigTemplateFile file: %v", err) + } + tinkerbellTemplateConfigTemplate = string(b) + } else if tinkerbellParams.OSFamily == v1alpha1.Ubuntu { + tinkerbellTemplateConfigTemplate = GetDefaultTinkerbellTemplateConfigTemplateUbuntu() + } else if tinkerbellParams.OSFamily == v1alpha1.Bottlerocket { + tinkerbellTemplateConfigTemplate = GetDefaultTinkerbellTemplateConfigTemplateBottlerocket() + } + + tinkerbellTemplateConfigTemplate = strings.Replace(tinkerbellTemplateConfigTemplate, "$$NAME", clusterName, -1) + tinkerbellTemplateConfigTemplate = strings.Replace(tinkerbellTemplateConfigTemplate, "$$IMG_URL", osImageURL, -1) + tinkerbellTemplateConfigTemplate = strings.Replace(tinkerbellTemplateConfigTemplate, "$$ADMIN_IP", adminIP, -1) + tinkerbellTemplateConfigTemplate = strings.Replace(tinkerbellTemplateConfigTemplate, "$$TINKERBELL_IP", tinkerbellIP, -1) } - machineGroupYaml = append(machineGroupYaml, cpMcYaml, workerMcYaml) case constants.NutanixProviderName: datacenterConfig := v1alpha1.NewNutanixDatacenterConfigGenerate(clusterName) dcYaml, err := yaml.Marshal(datacenterConfig) @@ -257,7 +476,8 @@ func generateClusterConfig(clusterName string) error { default: return fmt.Errorf("not a valid provider") } - config := v1alpha1.NewClusterGenerate(clusterName, clusterConfigOpts...) + + config := v1alpha1.NewClusterGenerate(clusterName, managementClusterName, kubernetesVersion, podsCidrBlocks, servicesCidrBlocks, clusterConfigOpts...) configMarshal, err := yaml.Marshal(config) if err != nil { @@ -272,6 +492,13 @@ func generateClusterConfig(clusterName string) error { resources = append(resources, machineGroupYaml...) } - fmt.Println(string(templater.AppendYamlResources(resources...))) + fmt.Print(string(templater.AppendYamlResources(resources...))) + + if tinkerbellTemplateConfigTemplate != "" { + fmt.Println(tinkerbellTemplateConfigTemplate) + } else { + fmt.Println("") + } + return nil } diff --git a/cmd/eksctl-anywhere/cmd/tinkerbellparams_defaults_template.go b/cmd/eksctl-anywhere/cmd/tinkerbellparams_defaults_template.go new file mode 100644 index 000000000000..a121b9ce82f0 --- /dev/null +++ b/cmd/eksctl-anywhere/cmd/tinkerbellparams_defaults_template.go @@ -0,0 +1,26 @@ +package cmd + +const ( + defaultTinkerbellParamsTemplate = `managementClusterName: +podsCidrBlocks: + - 192.168.64.0/18 +servicesCidrBlocks: + - 10.96.0.0/12 +kubernetesVersion: 1.26 +cpCount: 1 +workerCount: 2 +cpEndpointHost: +tinkerbellIP: +adminIP: +osFamily: ubuntu +osImageURL: +hardwareCSV: +sshAuthorizedKeyFile: +tinkerbellTemplateConfigTemplateFile: tinkerbellTemplateConfigTemplate.yaml +` +) + +// GetDefaultTinkerbellParamsTemplate returns the default TinkerbellParamsTemplate. +func GetDefaultTinkerbellParamsTemplate() string { + return string(defaultTinkerbellParamsTemplate) +} diff --git a/cmd/eksctl-anywhere/cmd/tinkerbelltemplateconfig_defaults_template_bottlerocket.go b/cmd/eksctl-anywhere/cmd/tinkerbelltemplateconfig_defaults_template_bottlerocket.go new file mode 100644 index 000000000000..bf767ac78eb0 --- /dev/null +++ b/cmd/eksctl-anywhere/cmd/tinkerbelltemplateconfig_defaults_template_bottlerocket.go @@ -0,0 +1,94 @@ +package cmd + +const ( + defaultTinkerbellTemplateConfigTemplateBottlerocket = `apiVersion: anywhere.eks.amazonaws.com/v1alpha1 +kind: TinkerbellTemplateConfig +metadata: + name: $$NAME +spec: + template: + global_timeout: 6000 + id: "" + name: $$NAME + tasks: + - actions: + - environment: + COMPRESSED: "true" + DEST_DISK: /dev/sda + IMG_URL: $$IMG_URL + image: public.ecr.aws/eks-anywhere/tinkerbell/hub/image2disk:6c0f0d437bde2c836d90b000312c8b25fa1b65e1-eks-a-15 + name: stream-image + timeout: 720 + - environment: + # An example console declaration that will send all kernel output to both consoles, and systemd output to ttyS0. + # kernel { + # console = "tty0", "ttyS0,115200n8" + # } + BOOTCONFIG_CONTENTS: | + kernel {} + DEST_DISK: /dev/sda12 + DEST_PATH: /bootconfig.data + DIRMODE: "0700" + FS_TYPE: ext4 + GID: "0" + MODE: "0644" + UID: "0" + image: public.ecr.aws/eks-anywhere/tinkerbell/hub/writefile:6c0f0d437bde2c836d90b000312c8b25fa1b65e1-eks-a-15 + name: write-bootconfig + timeout: 90 + - environment: + CONTENTS: | + # Version is required, it will change as we support + # additional settings + version = 1 + # "eno1" is the interface name + # Users may turn on dhcp4 and dhcp6 via boolean + [eno1] + dhcp4 = true + # Define this interface as the "primary" interface + # for the system. This IP is what kubelet will use + # as the node IP. If none of the interfaces has + # "primary" set, we choose the first interface in + # the file + primary = true + DEST_DISK: /dev/sda12 + DEST_PATH: /net.toml + DIRMODE: "0700" + FS_TYPE: ext4 + GID: "0" + MODE: "0644" + UID: "0" + image: public.ecr.aws/eks-anywhere/tinkerbell/hub/writefile:6c0f0d437bde2c836d90b000312c8b25fa1b65e1-eks-a-15 + name: write-netconfig + timeout: 90 + - environment: + HEGEL_URLS: [http://$$ADMIN_IP:50061,http://$$TINKERBELL_IP:50061] + DEST_DISK: /dev/sda12 + DEST_PATH: /user-data.toml + DIRMODE: "0700" + FS_TYPE: ext4 + GID: "0" + MODE: "0644" + UID: "0" + image: public.ecr.aws/eks-anywhere/tinkerbell/hub/writefile:6c0f0d437bde2c836d90b000312c8b25fa1b65e1-eks-a-15 + name: write-user-data + timeout: 90 + - name: "reboot" + image: public.ecr.aws/eks-anywhere/tinkerbell/hub/reboot:6c0f0d437bde2c836d90b000312c8b25fa1b65e1-eks-a-15 + timeout: 90 + volumes: + - /worker:/worker + name: $$NAME + volumes: + - /dev:/dev + - /dev/console:/dev/console + - /lib/firmware:/lib/firmware:ro + worker: '{{.device_1}}' + version: "0.1" +` +) + +// GetDefaultTinkerbellTemplateConfigTemplateBottlerocket returns the default TinkerbellTemplateConfigTemplate for Bottlerocket. +func GetDefaultTinkerbellTemplateConfigTemplateBottlerocket() string { + return string(defaultTinkerbellTemplateConfigTemplateBottlerocket) +} diff --git a/cmd/eksctl-anywhere/cmd/tinkerbelltemplateconfig_defaults_template_ubuntu.go b/cmd/eksctl-anywhere/cmd/tinkerbelltemplateconfig_defaults_template_ubuntu.go new file mode 100644 index 000000000000..92ce343fd9ff --- /dev/null +++ b/cmd/eksctl-anywhere/cmd/tinkerbelltemplateconfig_defaults_template_ubuntu.go @@ -0,0 +1,116 @@ +package cmd + +const ( + defaultTinkerbellTemplateConfigTemplateUbuntu = `apiVersion: anywhere.eks.amazonaws.com/v1alpha1 +kind: TinkerbellTemplateConfig +metadata: + name: $$NAME +spec: + template: + global_timeout: 6000 + id: "" + name: $$NAME + tasks: + - actions: + - environment: + COMPRESSED: "true" + DEST_DISK: /dev/sda + IMG_URL: $$IMG_URL + image: public.ecr.aws/eks-anywhere/tinkerbell/hub/image2disk:6c0f0d437bde2c836d90b000312c8b25fa1b65e1-eks-a-15 + name: stream-image + timeout: 720 + - environment: + DEST_DISK: /dev/sda2 + DEST_PATH: /etc/netplan/config.yaml + STATIC_NETPLAN: true + DIRMODE: "0755" + FS_TYPE: ext4 + GID: "0" + MODE: "0644" + UID: "0" + image: public.ecr.aws/eks-anywhere/tinkerbell/hub/writefile:6c0f0d437bde2c836d90b000312c8b25fa1b65e1-eks-a-15 + name: write-netplan + timeout: 90 + - environment: + CONTENTS: | + datasource: + Ec2: + metadata_urls: [http://$$ADMIN_IP:50061,http://$$TINKERBELL_IP:50061] + strict_id: false + manage_etc_hosts: localhost + warnings: + dsid_missing_source: off + DEST_DISK: /dev/sda2 + DEST_PATH: /etc/cloud/cloud.cfg.d/10_tinkerbell.cfg + DIRMODE: "0700" + FS_TYPE: ext4 + GID: "0" + MODE: "0600" + UID: "0" + image: public.ecr.aws/eks-anywhere/tinkerbell/hub/writefile:6c0f0d437bde2c836d90b000312c8b25fa1b65e1-eks-a-15 + name: add-tink-cloud-init-config + timeout: 90 + - environment: + CONTENTS: | + network: + config: disabled + DEST_DISK: /dev/sda2 + DEST_PATH: /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg + DIRMODE: "0700" + FS_TYPE: ext4 + GID: "0" + MODE: "0600" + UID: "0" + image: public.ecr.aws/eks-anywhere/tinkerbell/hub/writefile:6c0f0d437bde2c836d90b000312c8b25fa1b65e1-eks-a-15 + name: disable-cloud-init-network-capabilities + timeout: 90 + - environment: + CONTENTS: | + datasource: Ec2 + DEST_DISK: /dev/sda2 + DEST_PATH: /etc/cloud/ds-identify.cfg + DIRMODE: "0700" + FS_TYPE: ext4 + GID: "0" + MODE: "0600" + UID: "0" + image: public.ecr.aws/eks-anywhere/tinkerbell/hub/writefile:6c0f0d437bde2c836d90b000312c8b25fa1b65e1-eks-a-15 + name: add-tink-cloud-init-ds-config + timeout: 90 + - environment: + BLOCK_DEVICE: /dev/sda2 + CHROOT: "y" + CMD_LINE: apt -y update && apt -y install openssl + DEFAULT_INTERPRETER: /bin/sh -c + FS_TYPE: ext4 + image: public.ecr.aws/eks-anywhere/tinkerbell/hub/cexec:6c0f0d437bde2c836d90b000312c8b25fa1b65e1-eks-a-15 + name: install-openssl + timeout: 90 + - environment: + BLOCK_DEVICE: /dev/sda2 + FS_TYPE: ext4 + CHROOT: "y" + DEFAULT_INTERPRETER: "/bin/sh -c" + CMD_LINE: "useradd --password $(openssl passwd -1 tinkerbell) --shell /bin/bash --create-home --groups sudo tinkerbell" + image: public.ecr.aws/eks-anywhere/tinkerbell/hub/cexec:6c0f0d437bde2c836d90b000312c8b25fa1b65e1-eks-a-15 + name: "create-user" + timeout: 90 + - name: "reboot" + image: public.ecr.aws/eks-anywhere/tinkerbell/hub/reboot:6c0f0d437bde2c836d90b000312c8b25fa1b65e1-eks-a-15 + timeout: 90 + volumes: + - /worker:/worker + name: $$NAME + volumes: + - /dev:/dev + - /dev/console:/dev/console + - /lib/firmware:/lib/firmware:ro + worker: '{{.device_1}}' + version: "0.1" +` +) + +// GetDefaultTinkerbellTemplateConfigTemplateUbuntu returns the default TinkerbellTemplateConfigTemplate for Ubuntu. +func GetDefaultTinkerbellTemplateConfigTemplateUbuntu() string { + return string(defaultTinkerbellTemplateConfigTemplateUbuntu) +} diff --git a/cmd/eksctl-anywhere/cmd/vsphereparams_defaults_template.go b/cmd/eksctl-anywhere/cmd/vsphereparams_defaults_template.go new file mode 100644 index 000000000000..47d9ce00b051 --- /dev/null +++ b/cmd/eksctl-anywhere/cmd/vsphereparams_defaults_template.go @@ -0,0 +1,40 @@ +package cmd + +const ( + defaultVSphereParamsTemplate = `managementClusterName: +podsCidrBlocks: + - 192.168.192.0/18 +servicesCidrBlocks: + - 10.96.192.0/18 +cpCount: 2 +etcdCount: 3 +workerCount: 3 +cpEndpointHost: +kubernetesVersion: 1.28 +datacenter: +insecure: true +network: +server: +thumbprint: +datastore: +folder: +cpDiskGiB: 0 +cpMemoryMiB: 0 +cpNumCPUs: 0 +etcdDiskGiB: 0 +etcdMemoryMiB: 0 +etcdNumCPUs: 0 +workerDiskGiB: 256 +workerMemoryMiB: 65536 +workerNumCPUs: 16 +osFamily: "ubuntu" +resourcePool: +template: