1+ #! /usr/bin/env bash
2+ export TERM=xterm-256color
3+
4+ apt update -qq
5+ apt install jq curl -y -qq
6+
7+ function header_info() {
8+ clear
9+ cat << "EOF "
10+
11+ ███████╗██████╗ ██╗ ██╗ ██╗███╗ ██╗██╗ ██╗ ██╗
12+ ██╔════╝██╔══██╗██║ ██║ ██║████╗ ██║██║ ██╔╝ ╚██╗
13+ ███████╗██████╔╝██║ ██║ ██║██╔██╗ ██║█████╔╝ ╚██╗
14+ ╚════██║██╔═══╝ ██║ ██║ ██║██║╚██╗██║██╔═██╗ ██╔╝
15+ ███████║██║ ███████╗╚██████╔╝██║ ╚████║██║ ██╗ ██╔╝
16+ ╚══════╝╚═╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═══╝╚═╝ ╚═╝ ╚═╝
17+ EOF
18+ }
19+
20+ YW=$( echo " \033[33m" )
21+ BL=$( echo " \033[36m" )
22+ HA=$( echo " \033[1;34m" )
23+ RD=$( echo " \033[01;31m" )
24+ BGN=$( echo " \033[4;92m" )
25+ GN=$( echo " \033[1;92m" )
26+ DGN=$( echo " \033[32m" )
27+ CL=$( echo " \033[m" )
28+
29+ if whiptail --backtitle " Splunk" --title " Observability Workshop VM" --yesno " This will create a Observability Workshop VM. Proceed?" 10 58; then
30+ :
31+ else
32+ header_info && echo -e " ${RD} User exited script${CL} \n" && exit
33+ fi
34+
35+ if SWIPE_ID=$( whiptail --backtitle " Splunk" --title " SWiPE ID" --inputbox " Enter your SWiPE ID:" 10 58 3>&1 1>&2 2>&3 ) ; then
36+ # SWIPE_ID=$REPLY
37+ if [[ -n " $SWIPE_ID " ]]; then
38+ echo -e " SWiPE ID: ${YW}${SWIPE_ID}${CL} "
39+ else
40+ header_info && echo -e " ${RD} Invalid SWiPE ID. Exiting script.${CL} \n" && exit
41+ fi
42+ else
43+ header_info && echo -e " ${RD} User exited script${CL} \n" && exit
44+ fi
45+
46+ # Call the API and store the response
47+ JSON_RESPONSE=$( curl -s https://swipe.splunk.show/api? id=${SWIPE_ID} )
48+
49+ # Check if Workshop ID not found
50+ if [[ " $JSON_RESPONSE " == ' {"message":"Workshop ID not found"}' ]]; then
51+ header_info && echo -e " ${RD} Workshop ID not found. Exiting script.${CL} \n" && exit
52+ fi
53+
54+ # Parse the JSON response and extract values
55+ REALM=$( echo ${JSON_RESPONSE} | jq -r ' .REALM' )
56+ RUM_TOKEN=$( echo ${JSON_RESPONSE} | jq -r ' .RUM' )
57+ INGEST_TOKEN=$( echo ${JSON_RESPONSE} | jq -r ' .INGEST' )
58+ API_TOKEN=$( echo ${JSON_RESPONSE} | jq -r ' .API' )
59+ HEC_TOKEN=$( echo ${JSON_RESPONSE} | jq -r ' .HEC_TOKEN' )
60+ HEC_URL=$( echo ${JSON_RESPONSE} | jq -r ' .HEC_URL' )
61+
62+ NEXTID=$( pvesh get /cluster/nextid)
63+
64+ UNIQUE_HOST_ID=$( echo $RANDOM | md5sum | head -c 4)
65+ RANDOM_ADDITION=$(( 4000 + RANDOM % 1001 ))
66+ VMID=$(( NEXTID + RANDOM_ADDITION))
67+ STORAGE=local-lvm
68+ HOSTNAME=$UNIQUE_HOST_ID -workshop-$VMID
69+ USER=splunk
70+ PASSWORD=Splunk123!
71+ LATEST_K9S_VERSION=$( curl -s https://api.github.com/repos/derailed/k9s/releases/latest | jq -r ' .tag_name' )
72+ LATEST_TERRAFORM_VERSION=$( curl -s https://api.github.com/repos/hashicorp/terraform/releases/latest | jq -r ' .tag_name | ltrimstr("v")' )
73+
74+ echo -e " Hostname: ${YW}${HOSTNAME}${CL} \n"
75+ # set -x
76+
77+ cat << EOF | tee /var/lib/vz/snippets/ubuntu.yaml >/dev/null
78+ #cloud-config
79+ package_update: true
80+ package_upgrade: true
81+ package_reboot_if_required: false
82+
83+ hostname: $HOSTNAME
84+ manage_etc_hosts: true
85+ fqdn: $HOSTNAME
86+ user: $USER
87+ password: $PASSWORD
88+ chpasswd:
89+ expire: False
90+ users:
91+ - name: $USER
92+ sudo: ALL=(ALL) NOPASSWD:ALL
93+ shell: /bin/bash
94+ ssh_pwauth: True
95+ packages:
96+ - bash
97+ - ansible
98+ - docker
99+ - docker-buildx
100+ - curl
101+ - docker-compose
102+ - jq
103+ - maven
104+ - net-tools
105+ - openjdk-17-jdk
106+ - python3-venv
107+ - python3-pip
108+ - unzip
109+ - zsh
110+ - git
111+ - wget
112+ - qemu-guest-agent
113+ snap:
114+ commands:
115+ - snap install kubectl --classic
116+ write_files:
117+ - path: /etc/environment
118+ append: true
119+ content: |
120+ # Splunk environment variables
121+ export TERM=xterm-256color
122+ export RUM_TOKEN="$RUM_TOKEN "
123+ export ACCESS_TOKEN="$INGEST_TOKEN "
124+ export API_TOKEN="$API_TOKEN "
125+ export HEC_TOKEN="$HEC_TOKEN "
126+ export HEC_URL="$HEC_URL "
127+ export REALM="$REALM "
128+
129+ INSTANCE="$HOSTNAME "
130+ CLUSTER_NAME="$HOSTNAME -cluster"
131+
132+ export INSTANCE CLUSTER_NAME
133+
134+ export KUBECONFIG=/home/splunk/.kube/config
135+ alias kc='kubectl'
136+ alias dc='docker-compose'
137+
138+ - path: /tmp/workshop-secrets.yaml
139+ permissions: '0755'
140+ content: |
141+ apiVersion: v1
142+ kind: Secret
143+ metadata:
144+ name: workshop-secret
145+ namespace: default
146+ type: Opaque
147+ stringData:
148+ app: $HOSTNAME -store
149+ env: $HOSTNAME -workshop
150+ deployment: "deployment.environment=$HOSTNAME -workshop"
151+ realm: $REALM
152+ access_token: $INGEST_TOKEN
153+ api_token: $API_TOKEN
154+ rum_token: $RUM_TOKEN
155+ hec_token: $HEC_TOKEN
156+ hec_url: $HEC_URL
157+ url: frontend
158+
159+ - path: /tmp/3-node.yaml
160+ permissions: '0755'
161+ content: |
162+ kind: Cluster
163+ apiVersion: kind.x-k8s.io/v1alpha4
164+ nodes:
165+ - role: control-plane
166+ - role: worker
167+ - role: worker
168+
169+ runcmd:
170+ - systemctl start qemu-guest-agent
171+ - systemctl enable qemu-guest-agent
172+
173+ #- chsh -s $( which zsh) splunk
174+ #- echo "source /etc/skel/.profile" >> /home/splunk/.zshrc
175+
176+ # Install Helm
177+ - curl -s https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
178+
179+ # Install K9s (Kubernetes UI) - Version: ${LATEST_K9S_VERSION}
180+ - curl -S -OL https://github.com/derailed/k9s/releases/download/${LATEST_K9S_VERSION} /k9s_Linux_amd64.tar.gz
181+ - tar xfz k9s_Linux_amd64.tar.gz -C /usr/local/bin/ k9s
182+
183+ # Download Workshop
184+ - curl -s -OL https://github.com/splunk/observability-workshop/archive/main.zip
185+ - unzip -qq main.zip -d /home/splunk/
186+ - mkdir /home/splunk/workshop
187+ - mv /home/splunk/observability-workshop-main/workshop/* /home/splunk/workshop
188+ - mv /home/splunk/workshop/ansible/diab-v3.yml /home/splunk
189+ - rm -rf /home/splunk/observability-workshop-main
190+ - rm -rf /home/splunk/workshop/aws /home/splunk/workshop/cloud-init /home/splunk/workshop/ansible
191+ - mv /home/splunk/workshop/k3s/demo-in-a-box.zip /home/splunk
192+
193+ # Download Splunk Observability Content Contrib Repo
194+ - curl -s -L https://github.com/splunk/observability-content-contrib/archive/main.zip -o content-contrib.zip
195+ - unzip -qq content-contrib.zip -d /home/splunk/
196+ - mv /home/splunk/observability-content-contrib-main /home/splunk/observability-content-contrib
197+
198+ # Install Terraform (latest) - Version: ${LATEST_TERRAFORM_VERSION}
199+ - curl -S -OL https://releases.hashicorp.com/terraform/${LATEST_TERRAFORM_VERSION} /terraform_${LATEST_TERRAFORM_VERSION} _linux_amd64.zip
200+ - unzip -qq terraform_${LATEST_TERRAFORM_VERSION} _linux_amd64.zip -d /usr/local/bin
201+
202+ # Install kind
203+ - [ $( uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.30.0/kind-linux-amd64
204+ - chmod +x ./kind
205+ - mv ./kind /usr/local/bin/kind
206+
207+ # Create 3 node k3d cluster
208+ - kind create cluster --config /tmp/3-node.yaml
209+
210+ # Add user splunk to docker group
211+ - usermod -aG docker splunk
212+
213+ # Create kube config and set correct permissions on splunk user home directory
214+ - mkdir /home/splunk/.kube && kubectl config view --raw > /home/splunk/.kube/config
215+ - chmod 400 /home/splunk/.kube/config
216+ - chown -R splunk:splunk /home/splunk
217+
218+ # Deploy private registry
219+ - /snap/bin/kubectl apply -f /home/splunk/workshop/k3s/registry/registry.yaml
220+
221+ # Chaos Mesh
222+ - curl -sSL https://mirrors.chaos-mesh.org/v2.7.1/install.sh | bash -s -- --k3s
223+
224+ # Deploy Splunk secrets
225+ - /snap/bin/kubectl apply -f /tmp/workshop-secrets.yaml
226+ EOF
227+
228+ # qm destroy $VMID >/dev/null
229+ rm -f jammy-server-cloudimg-amd64.img > /dev/null
230+ wget -q https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img
231+ qemu-img resize jammy-server-cloudimg-amd64.img 40G > /dev/null
232+ qm create $VMID --name $HOSTNAME --ostype l26 \
233+ --memory 8192 --balloon 0 \
234+ --agent 1 \
235+ --bios ovmf --machine q35 --efidisk0 $STORAGE :0,pre-enrolled-keys=0 \
236+ --cpu host --socket 1 --cores 4 \
237+ --net0 virtio,bridge=vmbr0 > /dev/null
238+ qm importdisk $VMID jammy-server-cloudimg-amd64.img $STORAGE > /dev/null
239+ qm set $VMID --scsihw virtio-scsi-pci --virtio0 $STORAGE :vm-$VMID -disk-1,discard=on > /dev/null
240+ qm set $VMID --boot order=virtio0 > /dev/null
241+ qm set $VMID --ide2 $STORAGE :cloudinit > /dev/null
242+
243+ qm set $VMID --cicustom " user=local:snippets/ubuntu.yaml" > /dev/null
244+ qm set $VMID --tags o11y-workshop,jammy,cloudinit > /dev/null
245+ # qm set $VMID --ciuser ubuntu
246+ # qm set $VMID --cipassword Splunk123!
247+ # qm set $VMID --ciupdate 0
248+ qm set $VMID --ipconfig0 ip=dhcp > /dev/null
249+ qm cloudinit update $VMID > /dev/null
250+ # qm template $VMID
251+ qm start $VMID > /dev/null
0 commit comments