From 594e62cf7137c073fec95d70a968a6fc6dc48c06 Mon Sep 17 00:00:00 2001 From: djpbessems Date: Tue, 11 Jun 2024 11:25:35 +1000 Subject: [PATCH] feat: Remove node-template hypervisor upload logic (treat as prerequisite instead) --- .../workloadcluster/tasks/nodetemplates.yml | 73 ------------------- .../workloadcluster/tasks/nodetemplates.yml | 33 +++++++++ .../workloadcluster/tasks/nodetemplates.yml | 73 ------------------- ansible/roles/os/tasks/packages.yml | 23 +++++- ansible/roles/os/templates/ansible.j2 | 6 -- scripts/Update-OvfConfiguration.bootstrap.yml | 13 ++++ scripts/Update-OvfConfiguration.upgrade.yml | 19 ++++- 7 files changed, 84 insertions(+), 156 deletions(-) delete mode 100644 ansible/roles/firstboot/files/ansible_payload/bootstrap/roles/workloadcluster/tasks/nodetemplates.yml create mode 100644 ansible/roles/firstboot/files/ansible_payload/common/roles/workloadcluster/tasks/nodetemplates.yml delete mode 100644 ansible/roles/firstboot/files/ansible_payload/upgrade/roles/workloadcluster/tasks/nodetemplates.yml delete mode 100644 ansible/roles/os/templates/ansible.j2 diff --git a/ansible/roles/firstboot/files/ansible_payload/bootstrap/roles/workloadcluster/tasks/nodetemplates.yml b/ansible/roles/firstboot/files/ansible_payload/bootstrap/roles/workloadcluster/tasks/nodetemplates.yml deleted file mode 100644 index 783ef2c..0000000 --- a/ansible/roles/firstboot/files/ansible_payload/bootstrap/roles/workloadcluster/tasks/nodetemplates.yml +++ /dev/null @@ -1,73 +0,0 @@ -- block: - - - name: Check for existing template on hypervisor - community.vmware.vmware_guest_info: - name: "{{ (filename | basename | split('.'))[:-1] | join('.') }}" - register: existing_ova - ignore_errors: yes - - - name: Store inventory path of existing template - ansible.builtin.set_fact: - nodetemplate_inventorypath: "{{ existing_ova.instance.hw_folder ~ '/' ~ existing_ova.instance.hw_name }}" - when: existing_ova is not failed - - - block: - - - name: Parse OVA file for network mappings - ansible.builtin.shell: - cmd: govc import.spec -json {{ filename }} - environment: - GOVC_INSECURE: '1' - GOVC_URL: "{{ vapp['hv.fqdn'] }}" - GOVC_USERNAME: "{{ vapp['hv.username'] }}" - GOVC_PASSWORD: "{{ vapp['hv.password'] }}" - register: ova_spec - - - name: Deploy OVA template on hypervisor - community.vmware.vmware_deploy_ovf: - cluster: "{{ vcenter_info.cluster }}" - datastore: "{{ vcenter_info.datastore }}" - name: "{{ (filename | basename | split('.'))[:-1] | join('.') }}" - networks: "{u'{{ ova_spec.stdout | from_json | json_query('NetworkMapping[0].Name') }}':u'{{ vcenter_info.network }}'}" - allow_duplicates: no - power_on: false - ovf: "{{ filename }}" - register: ova_deploy - - - name: Add additional placeholder disk - community.vmware.vmware_guest_disk: - name: "{{ ova_deploy.instance.hw_name }}" - disk: - - size: 1Mb - scsi_controller: 1 - scsi_type: paravirtual - unit_number: 0 - - # Disabled to allow disks to be resized; at the cost of cloning speed - # - name: Create snapshot on deployed VM - # community.vmware.vmware_guest_snapshot: - # name: "{{ ova_deploy.instance.hw_name }}" - # state: present - # snapshot_name: "{{ ansible_date_time.iso8601_basic_short }}-base" - - - name: Mark deployed VM as templates - community.vmware.vmware_guest: - name: "{{ ova_deploy.instance.hw_name }}" - is_template: yes - - - name: Store inventory path of deployed template - ansible.builtin.set_fact: - nodetemplate_inventorypath: "{{ ova_deploy.instance.hw_folder ~ '/' ~ ova_deploy.instance.hw_name }}" - - when: existing_ova is failed - - vars: - filename: "{{ query('ansible.builtin.fileglob', '/opt/workloadcluster/node-templates/*.ova') | first }}" - module_defaults: - group/vmware: - hostname: "{{ vapp['hv.fqdn'] }}" - validate_certs: no - username: "{{ vapp['hv.username'] }}" - password: "{{ vapp['hv.password'] }}" - datacenter: "{{ vcenter_info.datacenter }}" - folder: "{{ vcenter_info.folder }}" diff --git a/ansible/roles/firstboot/files/ansible_payload/common/roles/workloadcluster/tasks/nodetemplates.yml b/ansible/roles/firstboot/files/ansible_payload/common/roles/workloadcluster/tasks/nodetemplates.yml new file mode 100644 index 0000000..283ad7a --- /dev/null +++ b/ansible/roles/firstboot/files/ansible_payload/common/roles/workloadcluster/tasks/nodetemplates.yml @@ -0,0 +1,33 @@ +- block: + + - name: Check for existing template + community.vmware.vmware_guest_info: + name: "{{ vapp['workloadcluster.nodetemplate'] }}" + hostname: "{{ vapp['hv.fqdn'] }}" + validate_certs: false + username: "{{ vapp['hv.username'] }}" + password: "{{ vapp['hv.password'] }}" + datacenter: "{{ vcenter_info.datacenter }}" + folder: "{{ vcenter_info.folder }}" + register: nodetemplate + until: + - nodetemplate is not failed + retries: 600 + delay: 30 + #wait for 5 hr. + vars: + color_reset: "\e[0m" + ansible_callback_diy_runner_retry_msg: >- + {%- set result = ansible_callback_diy.result.output -%} + {%- set retries_left = result.retries - result.attempts -%} + TEMPLATE '{{ vapp['workloadcluster.nodetemplate'] }}' NOT FOUND; PLEASE UPLOAD MANUALLY -- ({{ retries_left }} retries left) + ansible_callback_diy_runner_retry_msg_color: bright yellow + + - name: Store inventory path of existing template + ansible.builtin.set_fact: + nodetemplate_inventorypath: "{{ nodetemplate.instance.hw_folder ~ '/' ~ nodetemplate.instance.hw_name }}" + + rescue: + - name: CRITICAL ERROR + ansible.builtin.fail: + msg: Required node-template is not available; cannot continue diff --git a/ansible/roles/firstboot/files/ansible_payload/upgrade/roles/workloadcluster/tasks/nodetemplates.yml b/ansible/roles/firstboot/files/ansible_payload/upgrade/roles/workloadcluster/tasks/nodetemplates.yml deleted file mode 100644 index e867b67..0000000 --- a/ansible/roles/firstboot/files/ansible_payload/upgrade/roles/workloadcluster/tasks/nodetemplates.yml +++ /dev/null @@ -1,73 +0,0 @@ -- block: - - - name: Check for existing template on hypervisor - community.vmware.vmware_guest_info: - name: "{{ (filename | basename | split('.'))[:-1] | join('.') }}" - register: existing_ova - ignore_errors: yes - - - name: Store inventory path of existing template - ansible.builtin.set_fact: - nodetemplate_inventorypath: "{{ existing_ova.instance.hw_folder ~ '/' ~ existing_ova.instance.hw_name }}" - when: existing_ova is not failed - - - block: - - - name: Parse OVA file for network mappings - ansible.builtin.shell: - cmd: govc import.spec -json {{ filename }} - environment: - GOVC_INSECURE: '1' - GOVC_URL: "{{ vapp['hv.fqdn'] }}" - GOVC_USERNAME: "{{ vapp['hv.username'] }}" - GOVC_PASSWORD: "{{ vapp['hv.password'] }}" - register: ova_spec - - - name: Deploy OVA template on hypervisor - community.vmware.vmware_deploy_ovf: - cluster: "{{ vcenter_info.cluster }}" - datastore: "{{ vcenter_info.datastore }}" - name: "{{ (filename | basename | split('.'))[:-1] | join('.') }}" - networks: "{u'{{ ova_spec.stdout | from_json | json_query('NetworkMapping[0].Name') }}':u'{{ vcenter_info.network }}'}" - allow_duplicates: no - power_on: false - ovf: "{{ filename }}" - register: ova_deploy - - - name: Add additional placeholder disk - community.vmware.vmware_guest_disk: - name: "{{ ova_deploy.instance.hw_name }}" - disk: - - size: 1Gb - scsi_controller: 1 - scsi_type: paravirtual - unit_number: 0 - - # Disabled to allow disks to be resized; at the cost of cloning speed - # - name: Create snapshot on deployed VM - # community.vmware.vmware_guest_snapshot: - # name: "{{ ova_deploy.instance.hw_name }}" - # state: present - # snapshot_name: "{{ ansible_date_time.iso8601_basic_short }}-base" - - - name: Mark deployed VM as templates - community.vmware.vmware_guest: - name: "{{ ova_deploy.instance.hw_name }}" - is_template: yes - - - name: Store inventory path of deployed template - ansible.builtin.set_fact: - nodetemplate_inventorypath: "{{ ova_deploy.instance.hw_folder ~ '/' ~ ova_deploy.instance.hw_name }}" - - when: existing_ova is failed - - vars: - filename: "{{ query('ansible.builtin.fileglob', '/opt/metacluster/node-templates/*.ova') | first }}" - module_defaults: - group/vmware: - hostname: "{{ vapp['hv.fqdn'] }}" - validate_certs: no - username: "{{ vapp['hv.username'] }}" - password: "{{ vapp['hv.password'] }}" - datacenter: "{{ vcenter_info.datacenter }}" - folder: "{{ vcenter_info.folder }}" diff --git a/ansible/roles/os/tasks/packages.yml b/ansible/roles/os/tasks/packages.yml index f131e36..547720c 100644 --- a/ansible/roles/os/tasks/packages.yml +++ b/ansible/roles/os/tasks/packages.yml @@ -38,8 +38,29 @@ - name: Configure Ansible defaults ansible.builtin.template: - src: ansible.j2 dest: /etc/ansible/ansible.cfg + content: | + [defaults] + callbacks_enabled = ansible.posix.profile_tasks + force_color = true + stdout_callback = community.general.diy + + [callback_diy] + + [callback_profile_tasks] + task_output_limit = 0 + +- name: Create default shell aliases + ansible.builtin.lineinfile: + path: ~/.bashrc + state: present + line: "{{ item }}" + insertafter: EOF + loop: + - alias k="kubectl" + - alias less="less -rf" + loop_control: + label: "{{ (item | regex_findall('([^ =\"]+)'))[2] }}" - name: Cleanup ansible.builtin.apt: diff --git a/ansible/roles/os/templates/ansible.j2 b/ansible/roles/os/templates/ansible.j2 deleted file mode 100644 index c8a7c64..0000000 --- a/ansible/roles/os/templates/ansible.j2 +++ /dev/null @@ -1,6 +0,0 @@ -[defaults] -callbacks_enabled = ansible.posix.profile_tasks -force_color = true - -[callback_profile_tasks] -task_output_limit = 5 diff --git a/scripts/Update-OvfConfiguration.bootstrap.yml b/scripts/Update-OvfConfiguration.bootstrap.yml index 8089d71..45039ad 100644 --- a/scripts/Update-OvfConfiguration.bootstrap.yml +++ b/scripts/Update-OvfConfiguration.bootstrap.yml @@ -162,6 +162,19 @@ PropertyCategories: - cp1w1ws1 UserConfigurable: true + - Key: workloadcluster.nodetemplate + Type: string["ubuntu-2204-kube-v1.30.0", "photon-5-kube-v1.30.0.ova"] + Label: Workload-cluster node template + Description: | + All worker and worker-storage nodes for the workload-cluster will be provisioned with this node template. + Note: + Make sure that this exact template has been uploaded to the vCenter instance before powering on this appliance! + DefaultValue: ubuntu-2204-kube-v1.30.0 + Configurations: + - cp1w1ws0 + - cp1w1ws1 + UserConfigurable: true + - Key: workloadcluster.nodesize Type: string["small", "medium", "large"] Label: Workload-cluster node size* diff --git a/scripts/Update-OvfConfiguration.upgrade.yml b/scripts/Update-OvfConfiguration.upgrade.yml index effb263..7dd8044 100644 --- a/scripts/Update-OvfConfiguration.upgrade.yml +++ b/scripts/Update-OvfConfiguration.upgrade.yml @@ -44,7 +44,7 @@ PropertyCategories: Configurations: '*' UserConfigurable: true -- Name: 2) Add meta-cluster node +- Name: 2) Meta-cluster new node ProductProperties: - Key: guestinfo.hostname @@ -95,7 +95,20 @@ PropertyCategories: # Configurations: '*' # UserConfigurable: true -- Name: 3) Common +- Name: 3) Workload-cluster + ProductProperties: + + - Key: workloadcluster.nodetemplate + Type: string["ubuntu-2204-kube-v1.30.0", "photon-5-kube-v1.30.0.ova"] + Label: Workload-cluster node template + Description: | + All worker and worker-storage nodes for the workload-cluster will be provisioned with this node template. + Note: + Make sure that this exact template has been uploaded to the vCenter instance before powering on this appliance! + DefaultValue: ubuntu-2204-kube-v1.30.0 + UserConfigurable: true + +- Name: 4) Common ProductProperties: - Key: guestinfo.rootsshkey @@ -106,7 +119,7 @@ PropertyCategories: Configurations: '*' UserConfigurable: true -- Name: 4) Hypervisor +- Name: 5) Hypervisor ProductProperties: - Key: hv.fqdn