- name: Install K3s ansible.builtin.command: cmd: ./install.sh chdir: /opt/metacluster/k3s environment: INSTALL_K3S_SKIP_DOWNLOAD: 'true' INSTALL_K3S_EXEC: 'server --cluster-init --disable local-storage' - name: Install kubectl tab-completion ansible.builtin.shell: cmd: kubectl completion bash | tee /etc/bash_completion.d/kubectl - name: Ensure API availability ansible.utils.cli_parse: command: curl -k https://{{ vapp['guestinfo.ipaddress'] }}:6443/livez?verbose parser: name: ansible.utils.json set_fact: api_readycheck ignore_errors: yes until: api_readycheck.apiVersion is defined retries: 3 delay: 30 - block: - name: Initialize tempfile ansible.builtin.tempfile: state: file register: kubeconfig - name: Retrieve kubeconfig ansible.builtin.command: cmd: kubectl config view --raw register: kubectl_config - name: Store kubeconfig in tempfile ansible.builtin.copy: dest: "{{ kubeconfig.path }}" content: "{{ kubectl_config.stdout }}" mode: 0600 no_log: true - block: - name: Extract container images ansible.builtin.unarchive: src: /opt/metacluster/container-images/image-tarballs.tgz dest: /opt/metacluster/container-images list_files: yes register: imagetarballs - name: Import container images ansible.builtin.command: cmd: k3s ctr image import {{ item }} chdir: /opt/metacluster/container-images loop: "{{ imagetarballs.files }}" - name: Install longhorn chart kubernetes.core.helm: name: longhorn chart_ref: /opt/metacluster/helm-charts/longhorn release_namespace: longhorn-system create_namespace: yes wait: yes kubeconfig: "{{ kubeconfig.path }}" values: defaultSettings: defaultDataPath: /mnt/blockstorage defaultReplicaCount: 1 ingress: enabled: true host: storage.{{ vapp['metacluster.fqdn'] }} persistence: defaultClassReplicaCount: 1 - name: Install harbor chart kubernetes.core.helm: name: harbor chart_ref: /opt/metacluster/helm-charts/harbor release_namespace: harbor create_namespace: yes wait: yes kubeconfig: "{{ kubeconfig.path }}" values: expose: ingress: hosts: core: registry.{{ vapp['metacluster.fqdn'] }} externalURL: https://registry.{{ vapp['metacluster.fqdn'] }} harborAdminPassword: "{{ vapp['guestinfo.rootpw'] }}" notary: enabled: false - name: Push images to registry ansible.builtin.shell: cmd: >- skopeo copy \ --dest-tls-verify=false \ --dest-creds admin:{{ vapp['guestinfo.rootpw'] }} \ docker-archive:./{{ item }} \ docker://registry.{{ vapp['metacluster.fqdn'] }}/library/$( \ k3s ctr run \ --rm \ --mount type=bind,src=$PWD,dst=/data,options=rbind:ro \ quay.io/skopeo/stable:v1.8.0 skopeo \ skopeo list-tags docker-archive:/data/{{ item }} | \ jq -r '.Tags[0]') chdir: /opt/metacluster/container-images/ loop: "{{ imagetarballs.files }}" - name: Delete container image tarballs/archives ansible.builtin.file: path: /opt/metacluster/container-images state: absent - name: Configure K3s node for private registry ansible.builtin.template: dest: /etc/rancher/k3s/registries.yaml src: registries.j2 - name: Install gitea chart kubernetes.core.helm: name: gitea chart_ref: /opt/metacluster/helm-charts/gitea release_namespace: gitea create_namespace: yes wait: yes kubeconfig: "{{ kubeconfig.path }}" values: gitea: admin: username: administrator password: "{{ vapp['guestinfo.rootpw'] }}" email: admin@{{ vapp['metacluster.fqdn'] }} image: pullPolicy: IfNotPresent ingress: enabled: true hosts: - host: git.{{ vapp['metacluster.fqdn'] }} paths: - path: / pathType: Prefix - name: Install argo-cd chart kubernetes.core.helm: name: argo-cd chart_ref: /opt/metacluster/helm-charts/argo-cd release_namespace: argo-cd create_namespace: yes wait: yes kubeconfig: "{{ kubeconfig.path }}" values: server: ingress: enabled: true hosts: - gitops.{{ vapp['metacluster.fqdn'] }} - name: Cleanup tempfile ansible.builtin.file: path: "{{ kubeconfig.path }}" state: absent when: kubeconfig.path is defined