From 571fe6c0ee1e9a67733943d6bdd958969fde0e3e Mon Sep 17 00:00:00 2001 From: iotbands1train Date: Tue, 23 Apr 2024 21:37:43 -0500 Subject: [PATCH 1/5] Update Jenkinsfile-CI to use dynamic variables --- .vscode/settings.json | 4 ++ .../DOCKER/Mini_Project/Docker_commands | 50 ++++++++++++++ DEVOPS-main/DOCKER/Mini_Project/Dockerfile | 20 ++++++ DEVOPS-main/DOCKER/Mini_Project/README.md | 25 +++++++ .../Ansible/Amazon_Linux2/ansible.bash | 3 + .../Docker/Amazon_Linux2/docker.bash | 12 ++++ .../Git/Amazon_Linux2/git.bash | 3 + .../Jenkins/Amazon_Linux/jenkins.bash | 26 +++++++ .../Kubernetes/Amazon_Linux2/k8s_kubeadm | 43 ++++++++++++ .../Amazon_Linux2/k8s_minikube.bash | 25 +++++++ .../Kubernetes/Ubuntu20.04/k8s.bash | 56 +++++++++++++++ .../Maven/Amazon_Linux2/maven.bash | 7 ++ .../Trivy/Amazon_Linux2/trivy.bash | 3 + .../JENKINS/First_JenkinsPipeline/Jenkinsfile | 35 ++++++++++ .../Helm_&_HelmCharts/Helm_Installation.sh | 8 +++ .../Helm_&_HelmCharts/Helm_Installation.txt | 8 +++ .../Helm_&_HelmCharts/Jenkins_using_Helm.sh | 15 ++++ .../Helm_&_HelmCharts/Jenkins_using_Helm.txt | 15 ++++ .../Installing Kubeadm In Node.sh | 54 +++++++++++++++ .../Installing Kubeadm In Node.txt | 54 +++++++++++++++ .../Installing Kubeadm in Master.sh | 64 ++++++++++++++++++ .../Installing Kubeadm in Master.txt | 64 ++++++++++++++++++ .../Installing Minikube in EC2.sh | 54 +++++++++++++++ .../Installing Minikube in EC2.txt | 54 +++++++++++++++ .../Opening Minikube tunnel.sh | 2 + .../Opening Minikube tunnel.txt | 2 + DEVOPS-main/KUBERNETES/K8S_OBJECTS/1 | 1 + DEVOPS-main/KUBERNETES/K8S_OBJECTS/1. Pod.txt | 23 +++++++ .../KUBERNETES/K8S_OBJECTS/2. ReplicaSet.txt | 46 +++++++++++++ .../KUBERNETES/K8S_OBJECTS/3. Deployment.txt | 28 ++++++++ .../K8S_OBJECTS/4.1 Service - NodePort.txt | 25 +++++++ .../4.2 Service - LoadBalancer.txt | 25 +++++++ .../KUBERNETES/K8S_OBJECTS/5.1 PV & PVC.txt | 42 ++++++++++++ .../K8S_OBJECTS/5.2 Pod with PV.txt | 21 ++++++ .../KUBERNETES/K8S_OBJECTS/6.1 ConfigMap.txt | 17 +++++ .../K8S_OBJECTS/6.2 Pod with ConfigMap.txt | 15 ++++ .../K8S_OBJECTS/6.3 Pod with ConfigMap.txt | 15 ++++ .../KUBERNETES/K8S_OBJECTS/7.1 Secret.txt | 8 +++ .../K8S_OBJECTS/7.2 Pod with Secret.txt | 15 ++++ .../KUBERNETES/K8S_OBJECTS/8. Namespace.txt | 17 +++++ Jenkinsfile-CI | 8 ++- README.md | 2 +- image.png | Bin 0 -> 86356 bytes pom.xml | 9 +++ .../DevopsIntegrationApplication.java | 6 ++ src/main/resources/application.properties | 3 + target/classes/META-INF/build-info.properties | 5 ++ target/classes/application.properties | 3 + target/classes/application.yml | 8 +++ .../DevopsIntegrationApplication.class | Bin 0 -> 1308 bytes target/classes/git.properties | 26 +++++++ .../DevopsIntegrationApplicationTests.class | Bin 0 -> 566 bytes terraform_files/README.md | 2 +- terraform_files/main.tf | 6 +- terraform_files/node.tf | 12 ++-- terraform_files/provider.tf | 2 +- 56 files changed, 1082 insertions(+), 14 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 DEVOPS-main/DOCKER/Mini_Project/Docker_commands create mode 100644 DEVOPS-main/DOCKER/Mini_Project/Dockerfile create mode 100644 DEVOPS-main/DOCKER/Mini_Project/README.md create mode 100644 DEVOPS-main/Installation_Scripts/Ansible/Amazon_Linux2/ansible.bash create mode 100644 DEVOPS-main/Installation_Scripts/Docker/Amazon_Linux2/docker.bash create mode 100644 DEVOPS-main/Installation_Scripts/Git/Amazon_Linux2/git.bash create mode 100644 DEVOPS-main/Installation_Scripts/Jenkins/Amazon_Linux/jenkins.bash create mode 100644 DEVOPS-main/Installation_Scripts/Kubernetes/Amazon_Linux2/k8s_kubeadm create mode 100644 DEVOPS-main/Installation_Scripts/Kubernetes/Amazon_Linux2/k8s_minikube.bash create mode 100644 DEVOPS-main/Installation_Scripts/Kubernetes/Ubuntu20.04/k8s.bash create mode 100644 DEVOPS-main/Installation_Scripts/Maven/Amazon_Linux2/maven.bash create mode 100644 DEVOPS-main/Installation_Scripts/Trivy/Amazon_Linux2/trivy.bash create mode 100644 DEVOPS-main/JENKINS/First_JenkinsPipeline/Jenkinsfile create mode 100644 DEVOPS-main/KUBERNETES/Helm_&_HelmCharts/Helm_Installation.sh create mode 100644 DEVOPS-main/KUBERNETES/Helm_&_HelmCharts/Helm_Installation.txt create mode 100644 DEVOPS-main/KUBERNETES/Helm_&_HelmCharts/Jenkins_using_Helm.sh create mode 100644 DEVOPS-main/KUBERNETES/Helm_&_HelmCharts/Jenkins_using_Helm.txt create mode 100644 DEVOPS-main/KUBERNETES/Installing K8s using Kubeadm/Installing Kubeadm In Node.sh create mode 100644 DEVOPS-main/KUBERNETES/Installing K8s using Kubeadm/Installing Kubeadm In Node.txt create mode 100644 DEVOPS-main/KUBERNETES/Installing K8s using Kubeadm/Installing Kubeadm in Master.sh create mode 100644 DEVOPS-main/KUBERNETES/Installing K8s using Kubeadm/Installing Kubeadm in Master.txt create mode 100644 DEVOPS-main/KUBERNETES/Installing K8s using Minikube/Installing Minikube in EC2.sh create mode 100644 DEVOPS-main/KUBERNETES/Installing K8s using Minikube/Installing Minikube in EC2.txt create mode 100644 DEVOPS-main/KUBERNETES/Installing K8s using Minikube/Opening Minikube tunnel.sh create mode 100644 DEVOPS-main/KUBERNETES/Installing K8s using Minikube/Opening Minikube tunnel.txt create mode 100644 DEVOPS-main/KUBERNETES/K8S_OBJECTS/1 create mode 100644 DEVOPS-main/KUBERNETES/K8S_OBJECTS/1. Pod.txt create mode 100644 DEVOPS-main/KUBERNETES/K8S_OBJECTS/2. ReplicaSet.txt create mode 100644 DEVOPS-main/KUBERNETES/K8S_OBJECTS/3. Deployment.txt create mode 100644 DEVOPS-main/KUBERNETES/K8S_OBJECTS/4.1 Service - NodePort.txt create mode 100644 DEVOPS-main/KUBERNETES/K8S_OBJECTS/4.2 Service - LoadBalancer.txt create mode 100644 DEVOPS-main/KUBERNETES/K8S_OBJECTS/5.1 PV & PVC.txt create mode 100644 DEVOPS-main/KUBERNETES/K8S_OBJECTS/5.2 Pod with PV.txt create mode 100644 DEVOPS-main/KUBERNETES/K8S_OBJECTS/6.1 ConfigMap.txt create mode 100644 DEVOPS-main/KUBERNETES/K8S_OBJECTS/6.2 Pod with ConfigMap.txt create mode 100644 DEVOPS-main/KUBERNETES/K8S_OBJECTS/6.3 Pod with ConfigMap.txt create mode 100644 DEVOPS-main/KUBERNETES/K8S_OBJECTS/7.1 Secret.txt create mode 100644 DEVOPS-main/KUBERNETES/K8S_OBJECTS/7.2 Pod with Secret.txt create mode 100644 DEVOPS-main/KUBERNETES/K8S_OBJECTS/8. Namespace.txt create mode 100644 image.png create mode 100644 target/classes/META-INF/build-info.properties create mode 100644 target/classes/application.properties create mode 100644 target/classes/application.yml create mode 100644 target/classes/com/javatechie/DevopsIntegrationApplication.class create mode 100644 target/classes/git.properties create mode 100644 target/test-classes/com/javatechie/DevopsIntegrationApplicationTests.class diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..4e8a8c9 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "FSharp.suggestGitignore": false, + "java.configuration.updateBuildConfiguration": "interactive" +} \ No newline at end of file diff --git a/DEVOPS-main/DOCKER/Mini_Project/Docker_commands b/DEVOPS-main/DOCKER/Mini_Project/Docker_commands new file mode 100644 index 0000000..d405f45 --- /dev/null +++ b/DEVOPS-main/DOCKER/Mini_Project/Docker_commands @@ -0,0 +1,50 @@ +===================== +# Build image (from Dockerfile) +===================== +docker build -t project/myapp:v1 . +# 'project/myapp' is user-defined name + +===================== +# Create container (from Image) +===================== +docker run -dt --name container1 -p 80:80 project/myapp +# here 80:80 means : +# 'container1' is user-defined name + +===================== +# Access the content +===================== +# Open browser & use to access the content + +------------------------------------------------------------ +--- END --- +------------------------------------------------------------ +===================== +# OTHER COMMANDS +===================== + +===================== +# Go inside container +===================== +docker exec -it /bin/bash + +===================== +# Stop & remove all containers +===================== +docker stop $(docker ps -aq) +docker rm $(docker ps -aq) + +===================== +# Delete all docker images +===================== +docker image prune -af + +===================== +# To delete all content from text file using 'vi' +# use 'Esc:%d' +===================== + +===================== +# To check which directories are consuming space in Linux +===================== +du -h /usr | sort -rh | head -n 10 diff --git a/DEVOPS-main/DOCKER/Mini_Project/Dockerfile b/DEVOPS-main/DOCKER/Mini_Project/Dockerfile new file mode 100644 index 0000000..7f5c5ab --- /dev/null +++ b/DEVOPS-main/DOCKER/Mini_Project/Dockerfile @@ -0,0 +1,20 @@ +FROM ubuntu + +# Install Apache & Git +RUN apt-get update && \ + apt-get install -y apache2 git + +# Pull content from Github +RUN git clone https://github.com/iotbands1train/DevopsProject1.git +# Add content inside html directory +RUN cd DevopsProject/ && \ + cp -R * /var/www/html/ + +# Delete the Project directory after copying the files +RUN rm -rf DevopsProject + +# Start Apache +CMD ["apache2ctl", "-D", "FOREGROUND"] + +# Expose port 80 of container +EXPOSE 80 diff --git a/DEVOPS-main/DOCKER/Mini_Project/README.md b/DEVOPS-main/DOCKER/Mini_Project/README.md new file mode 100644 index 0000000..f8516e3 --- /dev/null +++ b/DEVOPS-main/DOCKER/Mini_Project/README.md @@ -0,0 +1,25 @@ +--- +# **DOCKER MINI PROJECT** +--- + +![image](https://github.com/pandacloud1/DEVOPS/assets/134182273/e7a14622-fc73-4036-b64c-e41f0f175b07) + +## Objective: +Pulling content from Github & exposing through container + +## Instructions: +1. Create EC2 instance & enable required ports (eg. 22, 80, 8080) in the security group +2. Install Docker + * *(https://github.com/pandacloud1/DEVOPS/tree/main/Installation_Scripts/Docker)* +3. Create Dockerfile as below: + * Install Git, Apache + * Pull content from Github + * Copy the content to /var/www/html/ location + * Start Apache service +4. Create Docker image from 'Dockerfile' +5. Create Container from Docker image exposing required port of the container with the local machine +6. Access the content from the browser using + +- *Dockerfile:* *(https://github.com/pandacloud1/DEVOPS/blob/main/DOCKER/Mini_Project/Dockerfile)* +- *Docker_Commands:* *(https://github.com/pandacloud1/DEVOPS/blob/main/DOCKER/Mini_Project/Docker_commands)* + diff --git a/DEVOPS-main/Installation_Scripts/Ansible/Amazon_Linux2/ansible.bash b/DEVOPS-main/Installation_Scripts/Ansible/Amazon_Linux2/ansible.bash new file mode 100644 index 0000000..7e6f906 --- /dev/null +++ b/DEVOPS-main/Installation_Scripts/Ansible/Amazon_Linux2/ansible.bash @@ -0,0 +1,3 @@ +sudo yum update -y +sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -y +sudo yum install git python python-devel python-pip openssl ansible -y diff --git a/DEVOPS-main/Installation_Scripts/Docker/Amazon_Linux2/docker.bash b/DEVOPS-main/Installation_Scripts/Docker/Amazon_Linux2/docker.bash new file mode 100644 index 0000000..721aa30 --- /dev/null +++ b/DEVOPS-main/Installation_Scripts/Docker/Amazon_Linux2/docker.bash @@ -0,0 +1,12 @@ +# REF: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-docker.html +#!/bin/bash +sudo yum update -y +sudo yum install docker -y +sudo systemctl start docker +sudo systemctl enable docker +# Add ec2-user to the docker group so that Docker commands can be run w/o using sudo. +sudo usermod -aG docker $USER && newgrp docker #(add normal user 'docker') +# sudo usermod -aG docker ec2-user +# To avoid below permission error +# Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock +sudo chmod 777 /var/run/docker.sock diff --git a/DEVOPS-main/Installation_Scripts/Git/Amazon_Linux2/git.bash b/DEVOPS-main/Installation_Scripts/Git/Amazon_Linux2/git.bash new file mode 100644 index 0000000..27b4f06 --- /dev/null +++ b/DEVOPS-main/Installation_Scripts/Git/Amazon_Linux2/git.bash @@ -0,0 +1,3 @@ +#!/bin/bash +sudo yum update -y +sudo yum install git -y diff --git a/DEVOPS-main/Installation_Scripts/Jenkins/Amazon_Linux/jenkins.bash b/DEVOPS-main/Installation_Scripts/Jenkins/Amazon_Linux/jenkins.bash new file mode 100644 index 0000000..4b91fde --- /dev/null +++ b/DEVOPS-main/Installation_Scripts/Jenkins/Amazon_Linux/jenkins.bash @@ -0,0 +1,26 @@ +#!/bin/bash +# REF: (https://www.jenkins.io/doc/tutorials/tutorial-for-installing-jenkins-on-AWS/) +# NOTE: +# 1. Jenkins works on port 8080, so keep the port open while creating EC2 instance +# 2. Jenkins also requires Java & supports versions 11,17 & 21 + +sudo yum update -y +sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo +sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key +sudo yum install java-17-amazon-corretto -y +sudo yum install jenkins -y +sudo systemctl enable jenkins +sudo systemctl start jenkins + +# Get Jenkins_Public_IP +ip=$(curl ifconfig.me) +port=8080 +echo "Access your Jenkins here --> http://$ip:$port" + +# Generate Jenkins initial login password +pass=$(sudo cat /var/lib/jenkins/secrets/initialAdminPassword) +echo "Your Jenkins Initial Password: $pass" + +# In case if Jenkins fails to starts, try to set Java version to 11,17,21 using below command +# sudo /usr/sbin/alternatives --config java +# (Select the relevant Java version: 11,17 or 21) diff --git a/DEVOPS-main/Installation_Scripts/Kubernetes/Amazon_Linux2/k8s_kubeadm b/DEVOPS-main/Installation_Scripts/Kubernetes/Amazon_Linux2/k8s_kubeadm new file mode 100644 index 0000000..b8ce4ef --- /dev/null +++ b/DEVOPS-main/Installation_Scripts/Kubernetes/Amazon_Linux2/k8s_kubeadm @@ -0,0 +1,43 @@ +# ------------------- +# Install Docker +# ------------------- +# REF: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-docker.html +#!/bin/bash +sudo yum update -y +sudo yum install docker -y +sudo systemctl start docker +sudo systemctl enable docker +sudo usermod -aG docker $USER && newgrp docker + +# ------------------- +# Install K8S (Kubeadm) +# ------------------- +# REF: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ +sudo setenforce 0 +sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config + +cat < -n jenkins -- /bin/bash + +# To get Jenkins password after helm setup +kubectl exec --namespace jenkins -it svc/my-jenkins-app -c jenkins -- /bin/cat /run/secrets/additional/chart-admin-password && echo \ No newline at end of file diff --git a/DEVOPS-main/KUBERNETES/Helm_&_HelmCharts/Jenkins_using_Helm.txt b/DEVOPS-main/KUBERNETES/Helm_&_HelmCharts/Jenkins_using_Helm.txt new file mode 100644 index 0000000..a3e72a0 --- /dev/null +++ b/DEVOPS-main/KUBERNETES/Helm_&_HelmCharts/Jenkins_using_Helm.txt @@ -0,0 +1,15 @@ + +# Installing Jenkins application using Helm +# Reference: https://github.com/jenkinsci/helm-charts + +kubectl create namespace jenkins +helm repo add jenkins https://charts.jenkins.io #(to add charts related to jenkins application) +helm repo update #(to update the repository) +helm search repo jenkins #(to search 'jenkins' in helm repository) +helm install jenkins jenkins/jenkins -n jenkins +kubectl get pods -n jenkins + +kubectl exec -it -n jenkins -- /bin/bash + +# To get Jenkins password after helm setup +kubectl exec --namespace jenkins -it svc/my-jenkins-app -c jenkins -- /bin/cat /run/secrets/additional/chart-admin-password && echo \ No newline at end of file diff --git a/DEVOPS-main/KUBERNETES/Installing K8s using Kubeadm/Installing Kubeadm In Node.sh b/DEVOPS-main/KUBERNETES/Installing K8s using Kubeadm/Installing Kubeadm In Node.sh new file mode 100644 index 0000000..68e5ea8 --- /dev/null +++ b/DEVOPS-main/KUBERNETES/Installing K8s using Kubeadm/Installing Kubeadm In Node.sh @@ -0,0 +1,54 @@ +# ------------------------ +# ------------------------ +# INSTALLING KUBEADM IN NODE [UBUNTU 20.04] +# ------------------------ +# ------------------------ +# Reference: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#k8s-install-0 + +# Updating the OS +sudo apt-get update -y +# apt-transport-https may be a dummy package; if so, you can skip that package + +# ------------------------ +# INSTALL DOCKER +# ------------------------ +sudo apt update -y #(update the OS) +sudo apt install docker.io -y #(install docker) +sudo service docker start #(start docker service) + +# ------------------------ +# INSTALL KUBECTL +# ------------------------ + +# Install package for Kubernetes apt repository +sudo apt-get install -y apt-transport-https ca-certificates curl gpg + +# In older release less than Ubuntu 22.04 below directory must be created +sudo mkdir -m 755 /etc/apt/keyrings + +# Download the public signing key for the Kubernetes package repositories +curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg + +# Add the appropriate Kubernetes apt repository +# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list +echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list + +# Update the apt package index, install kubelet, kubeadm and kubectl +sudo apt-get update -y +sudo apt-get install -y kubelet kubeadm kubectl + +sudo apt-mark hold kubelet kubeadm kubectl + +# ------------------------ +# Check Kubernetes version +# ------------------------ +kubectl version + + +# ============================= + +# Run these commands separately +sudo su - +# + +systemctl restart kubelet diff --git a/DEVOPS-main/KUBERNETES/Installing K8s using Kubeadm/Installing Kubeadm In Node.txt b/DEVOPS-main/KUBERNETES/Installing K8s using Kubeadm/Installing Kubeadm In Node.txt new file mode 100644 index 0000000..68e5ea8 --- /dev/null +++ b/DEVOPS-main/KUBERNETES/Installing K8s using Kubeadm/Installing Kubeadm In Node.txt @@ -0,0 +1,54 @@ +# ------------------------ +# ------------------------ +# INSTALLING KUBEADM IN NODE [UBUNTU 20.04] +# ------------------------ +# ------------------------ +# Reference: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#k8s-install-0 + +# Updating the OS +sudo apt-get update -y +# apt-transport-https may be a dummy package; if so, you can skip that package + +# ------------------------ +# INSTALL DOCKER +# ------------------------ +sudo apt update -y #(update the OS) +sudo apt install docker.io -y #(install docker) +sudo service docker start #(start docker service) + +# ------------------------ +# INSTALL KUBECTL +# ------------------------ + +# Install package for Kubernetes apt repository +sudo apt-get install -y apt-transport-https ca-certificates curl gpg + +# In older release less than Ubuntu 22.04 below directory must be created +sudo mkdir -m 755 /etc/apt/keyrings + +# Download the public signing key for the Kubernetes package repositories +curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg + +# Add the appropriate Kubernetes apt repository +# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list +echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list + +# Update the apt package index, install kubelet, kubeadm and kubectl +sudo apt-get update -y +sudo apt-get install -y kubelet kubeadm kubectl + +sudo apt-mark hold kubelet kubeadm kubectl + +# ------------------------ +# Check Kubernetes version +# ------------------------ +kubectl version + + +# ============================= + +# Run these commands separately +sudo su - +# + +systemctl restart kubelet diff --git a/DEVOPS-main/KUBERNETES/Installing K8s using Kubeadm/Installing Kubeadm in Master.sh b/DEVOPS-main/KUBERNETES/Installing K8s using Kubeadm/Installing Kubeadm in Master.sh new file mode 100644 index 0000000..201dc1e --- /dev/null +++ b/DEVOPS-main/KUBERNETES/Installing K8s using Kubeadm/Installing Kubeadm in Master.sh @@ -0,0 +1,64 @@ +# INSTALLING KUBEADM IN UBUNTU 20.04 +# Reference: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#k8s-install-0 + +# Updating the OS +sudo apt-get update -y +# apt-transport-https may be a dummy package; if so, you can skip that package + +# Installing Docker +sudo apt update -y #(update the OS) +sudo apt install docker.io -y #(install docker) +sudo service docker start #(start docker service) +# Add ec2-user to the docker group so that Docker commands can be run w/o using sudo. +sudo usermod -aG docker $USER && newgrp docker #(add normal user 'docker') +sudo chmod 777 /var/run/docker.sock + +# Install package for Kubernetes apt repository +sudo apt-get install -y apt-transport-https ca-certificates curl gpg + +# In older release less than Ubuntu 22.04 below directory must be created +sudo mkdir -m 755 /etc/apt/keyrings + +# Download the public signing key for the Kubernetes package repositories +curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg + +# Add the appropriate Kubernetes apt repository +# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list +echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list + +# Update the apt package index, install kubelet, kubeadm and kubectl +sudo apt-get update -y +sudo apt-get install -y kubelet kubeadm kubectl + +#Check Kubernetes version +kubectl version + +sudo apt-mark hold kubelet kubeadm kubectl + + +# -------- + +# Initialize Master or Control Plane +# Reference link: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#considerations-about-apiserver-advertise-address-and-controlplaneendpoint + +sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=NumCPU --ignore-preflight-errors=Mem +# (Token will be generated for use in Node) + +mkdir -p $HOME/.kube +sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config +sudo chown $(id -u):$(id -g) $HOME/.kube/config + +kubectl apply -f https://docs.projectcalico.org/v3.18/manifests/calico.yaml +kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/tigera-operator.yaml +kubectl taint nodes --all node-role.kubernetes.io/control-plane- + +kubectl get pods -A +kubectl get nodes -o wide + + +# Note: +# 1. CG group driver setup can be skipped for Docker +# 2. Install only the above commands in Node & then paste the token in the node by becoming root user +# 3. Now check the nodes in master, if the node is still showing 'NotReady' then run systemctl restart kubelet + + diff --git a/DEVOPS-main/KUBERNETES/Installing K8s using Kubeadm/Installing Kubeadm in Master.txt b/DEVOPS-main/KUBERNETES/Installing K8s using Kubeadm/Installing Kubeadm in Master.txt new file mode 100644 index 0000000..201dc1e --- /dev/null +++ b/DEVOPS-main/KUBERNETES/Installing K8s using Kubeadm/Installing Kubeadm in Master.txt @@ -0,0 +1,64 @@ +# INSTALLING KUBEADM IN UBUNTU 20.04 +# Reference: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#k8s-install-0 + +# Updating the OS +sudo apt-get update -y +# apt-transport-https may be a dummy package; if so, you can skip that package + +# Installing Docker +sudo apt update -y #(update the OS) +sudo apt install docker.io -y #(install docker) +sudo service docker start #(start docker service) +# Add ec2-user to the docker group so that Docker commands can be run w/o using sudo. +sudo usermod -aG docker $USER && newgrp docker #(add normal user 'docker') +sudo chmod 777 /var/run/docker.sock + +# Install package for Kubernetes apt repository +sudo apt-get install -y apt-transport-https ca-certificates curl gpg + +# In older release less than Ubuntu 22.04 below directory must be created +sudo mkdir -m 755 /etc/apt/keyrings + +# Download the public signing key for the Kubernetes package repositories +curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg + +# Add the appropriate Kubernetes apt repository +# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list +echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list + +# Update the apt package index, install kubelet, kubeadm and kubectl +sudo apt-get update -y +sudo apt-get install -y kubelet kubeadm kubectl + +#Check Kubernetes version +kubectl version + +sudo apt-mark hold kubelet kubeadm kubectl + + +# -------- + +# Initialize Master or Control Plane +# Reference link: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#considerations-about-apiserver-advertise-address-and-controlplaneendpoint + +sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=NumCPU --ignore-preflight-errors=Mem +# (Token will be generated for use in Node) + +mkdir -p $HOME/.kube +sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config +sudo chown $(id -u):$(id -g) $HOME/.kube/config + +kubectl apply -f https://docs.projectcalico.org/v3.18/manifests/calico.yaml +kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/tigera-operator.yaml +kubectl taint nodes --all node-role.kubernetes.io/control-plane- + +kubectl get pods -A +kubectl get nodes -o wide + + +# Note: +# 1. CG group driver setup can be skipped for Docker +# 2. Install only the above commands in Node & then paste the token in the node by becoming root user +# 3. Now check the nodes in master, if the node is still showing 'NotReady' then run systemctl restart kubelet + + diff --git a/DEVOPS-main/KUBERNETES/Installing K8s using Minikube/Installing Minikube in EC2.sh b/DEVOPS-main/KUBERNETES/Installing K8s using Minikube/Installing Minikube in EC2.sh new file mode 100644 index 0000000..e0ecc4a --- /dev/null +++ b/DEVOPS-main/KUBERNETES/Installing K8s using Minikube/Installing Minikube in EC2.sh @@ -0,0 +1,54 @@ +#!/bin/bash +# ==================================== +# INSTALLING MINIKUBE IN UBUNTU 20.04 +# ==================================== +# Reference: https://minikube.sigs.k8s.io/docs/start/ + +# ------------------------ +# PRE-REQUISITE +# ------------------------ +# Min 2GB Memory, Min 2CPU's, Min 20GB Storage space (Use Instance_type: t2.medium) +# Ports: 22, 80, 443, 6443, 10250, 30000-32767 (Keep all ports open for practise) +# Docker + +# ------------------------ +# INSTALL DOCKER +# ------------------------ +sudo apt update -y #(update the OS) +sudo apt install docker.io -y #(install docker) +sudo service docker start #(start docker service) +# Add ec2-user to the docker group so that Docker commands can be run w/o using sudo. +sudo usermod -aG docker $USER && newgrp docker #(add normal user 'docker') +sudo usermod -aG docker ec2-user +sudo chmod 777 /var/run/docker.sock + +# ------------------------ +# INSTALL MINKUBE +# ------------------------ +curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb +sudo dpkg -i minikube_latest_amd64.deb +minikube start + +# ------------------------ +# INSTALL KUBECTL +# ------------------------ + +# Install package for Kubernetes apt repository +sudo apt-get install -y apt-transport-https ca-certificates curl gpg + +# In older release less than Ubuntu 22.04 below directory must be created +sudo mkdir -m 755 /etc/apt/keyrings + +# Download the public signing key for the Kubernetes package repositories +curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg + +# Add the appropriate Kubernetes apt repository +# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list +echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list + +# Update the apt package index, install kubectl +sudo apt-get update -y +sudo apt-get install -y kubectl + + + diff --git a/DEVOPS-main/KUBERNETES/Installing K8s using Minikube/Installing Minikube in EC2.txt b/DEVOPS-main/KUBERNETES/Installing K8s using Minikube/Installing Minikube in EC2.txt new file mode 100644 index 0000000..e0ecc4a --- /dev/null +++ b/DEVOPS-main/KUBERNETES/Installing K8s using Minikube/Installing Minikube in EC2.txt @@ -0,0 +1,54 @@ +#!/bin/bash +# ==================================== +# INSTALLING MINIKUBE IN UBUNTU 20.04 +# ==================================== +# Reference: https://minikube.sigs.k8s.io/docs/start/ + +# ------------------------ +# PRE-REQUISITE +# ------------------------ +# Min 2GB Memory, Min 2CPU's, Min 20GB Storage space (Use Instance_type: t2.medium) +# Ports: 22, 80, 443, 6443, 10250, 30000-32767 (Keep all ports open for practise) +# Docker + +# ------------------------ +# INSTALL DOCKER +# ------------------------ +sudo apt update -y #(update the OS) +sudo apt install docker.io -y #(install docker) +sudo service docker start #(start docker service) +# Add ec2-user to the docker group so that Docker commands can be run w/o using sudo. +sudo usermod -aG docker $USER && newgrp docker #(add normal user 'docker') +sudo usermod -aG docker ec2-user +sudo chmod 777 /var/run/docker.sock + +# ------------------------ +# INSTALL MINKUBE +# ------------------------ +curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb +sudo dpkg -i minikube_latest_amd64.deb +minikube start + +# ------------------------ +# INSTALL KUBECTL +# ------------------------ + +# Install package for Kubernetes apt repository +sudo apt-get install -y apt-transport-https ca-certificates curl gpg + +# In older release less than Ubuntu 22.04 below directory must be created +sudo mkdir -m 755 /etc/apt/keyrings + +# Download the public signing key for the Kubernetes package repositories +curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg + +# Add the appropriate Kubernetes apt repository +# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list +echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list + +# Update the apt package index, install kubectl +sudo apt-get update -y +sudo apt-get install -y kubectl + + + diff --git a/DEVOPS-main/KUBERNETES/Installing K8s using Minikube/Opening Minikube tunnel.sh b/DEVOPS-main/KUBERNETES/Installing K8s using Minikube/Opening Minikube tunnel.sh new file mode 100644 index 0000000..bd2fd90 --- /dev/null +++ b/DEVOPS-main/KUBERNETES/Installing K8s using Minikube/Opening Minikube tunnel.sh @@ -0,0 +1,2 @@ +# Open the below command in new tab when exposing ports +minikube tunnel \ No newline at end of file diff --git a/DEVOPS-main/KUBERNETES/Installing K8s using Minikube/Opening Minikube tunnel.txt b/DEVOPS-main/KUBERNETES/Installing K8s using Minikube/Opening Minikube tunnel.txt new file mode 100644 index 0000000..bd2fd90 --- /dev/null +++ b/DEVOPS-main/KUBERNETES/Installing K8s using Minikube/Opening Minikube tunnel.txt @@ -0,0 +1,2 @@ +# Open the below command in new tab when exposing ports +minikube tunnel \ No newline at end of file diff --git a/DEVOPS-main/KUBERNETES/K8S_OBJECTS/1 b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/1 new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/1 @@ -0,0 +1 @@ +1 diff --git a/DEVOPS-main/KUBERNETES/K8S_OBJECTS/1. Pod.txt b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/1. Pod.txt new file mode 100644 index 0000000..cc70538 --- /dev/null +++ b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/1. Pod.txt @@ -0,0 +1,23 @@ +--- +apiVersion: v1 +kind: Pod +metadata: + name: my-pod1 +spec: + containers: + - name: container1 + image: httpd:latest +... + +# COMMANDS: +# kubectl apply -f pod.yaml +# kubectl get pods #(to see list of pods) +# kubectl exec -- /bin/bash #(to go inside the pod/container) +# httpd -version #(to see the apache version) +# exit #(to exit from the pod) + +# NOTE: +# Pod can be easily deleted by running below +# kubectl delete pod +# To avoid losing pod, use 'ReplicationController' or 'ReplicaSet' or 'Deployment') +# 'ReplicationController' is old form of K8s & not used anymore \ No newline at end of file diff --git a/DEVOPS-main/KUBERNETES/K8S_OBJECTS/2. ReplicaSet.txt b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/2. ReplicaSet.txt new file mode 100644 index 0000000..37f050d --- /dev/null +++ b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/2. ReplicaSet.txt @@ -0,0 +1,46 @@ +# TIP: +# 1. To use 'ReplicaSet' instead of 'Pod' we need to add 'replicas', 'selectors' & 'template' under spec (RST) +# 2. The entire metadata of pod will go under 'template' (w/ labels added) +# 3. The 'apiVersion' of 'ReplicaSet' is 'apps/v1' + +--- +apiVersion: apps/v1 +kind: ReplicaSet +metadata: + name: my-replicaset +spec: + replicas: 1 + selector: + matchLabels: + name: my-pod1 + template: + metadata: + labels: + name: my-pod1 + spec: + containers: + - name: container1 + image: httpd:latest +... + +# COMMANDS: +# kubectl apply -f .yaml +# kubectl get replicaset #(to check if replicaset is created) +# kubectl get pods #(to see if the pods are in running state) +# kubectl delete pods #(try deleting the pod, it will get deleted & new pod will get created) +# modify the code with more replicas #(you can create more replicas, if required) +# exit #(to exit from the pod) + +# To modify the code, first delete the replicaset +# kubectl delete replicaset +# Then edit the yaml file with desired replicas +# Then apply the yaml file +# kubectl apply -f .yaml + +# NOTE: +# ReplicationController is an old form of K8s, hence we are not learning it practically +# Since 'ReplicaSet' cannot Rollback/ Update, hence we can use 'Deployment' object. +# In real-time, we use 'Deployment' only & not 'ReplicaSet' + + + diff --git a/DEVOPS-main/KUBERNETES/K8S_OBJECTS/3. Deployment.txt b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/3. Deployment.txt new file mode 100644 index 0000000..be6cb23 --- /dev/null +++ b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/3. Deployment.txt @@ -0,0 +1,28 @@ +# TIP: +# 1. Replace 'kind: ReplicaSet' --> 'kind: Deployment' +# 2. Change the name under 'metadata' & create replicas as required + + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: my-deployment +spec: + replicas: 3 + selector: + matchLabels: + name: my-pod1 + template: + metadata: + labels: + name: my-pod1 + spec: + containers: + - name: container1 + image: httpd:latest +... + + +# NOTE: +# Deployment itself cannot expose pods to outside world, we need to combine it with 'Service' \ No newline at end of file diff --git a/DEVOPS-main/KUBERNETES/K8S_OBJECTS/4.1 Service - NodePort.txt b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/4.1 Service - NodePort.txt new file mode 100644 index 0000000..dd598e2 --- /dev/null +++ b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/4.1 Service - NodePort.txt @@ -0,0 +1,25 @@ +# TIP: +# 1. To create 'Service' manifest, remember phrase 'The Service Provider' (T,S,P) +# 2. Add 'type', 'selector' & 'ports' (The Service Provider) +# 3. Here 'port= service-port-no' & 'targetPort= pod-port-no' +# 4. Don't forget to add the 'selector' to select the relevant labelled 'Deployment' + +--- +apiVersion: v1 +kind: Service +metadata: + name: my-service +spec: + type: NodePort + selector: + name: my-pod1 + ports: + - protocol: TCP + port: 80 #(service-port) + targetPort: 80 #(pod-port) +... + +# NOTE: +# ClusterIP gets automatically created along with 'NodePort', which is default behaviour & meant is for cluster internal communication +# To allow networking, open SSH terminal in separate tab & run 'minikube tunnel' +# Then check curl must work in SSH terminal \ No newline at end of file diff --git a/DEVOPS-main/KUBERNETES/K8S_OBJECTS/4.2 Service - LoadBalancer.txt b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/4.2 Service - LoadBalancer.txt new file mode 100644 index 0000000..2f18400 --- /dev/null +++ b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/4.2 Service - LoadBalancer.txt @@ -0,0 +1,25 @@ +# TIP: +# 1. To create 'Service' manifest, remember phrase 'The Service Provider' +# 2. Add 'type', 'selector' & 'ports' (The Service Provider) +# 3. Here 'port= service-port-no' & 'targetPort= pod-port-no' +# 4. Don't forget to add the 'selector' to select the relevant labelled 'Deployment' + +--- +apiVersion: v1 +kind: Service +metadata: + name: my-service +spec: + type: LoadBalancer + selector: + name: my-pod1 + ports: + - protocol: TCP + port: 80 #(service-port) + targetPort: 80 #(pod-port) +... + +# NOTE: +# ClusterIP gets automatically created along with 'NodePort', which is default behaviour & meant is for cluster internal communication +# To allow networking, open SSH terminal in separate tab & run 'minikube tunnel' +# Then check curl must work in SSH terminal \ No newline at end of file diff --git a/DEVOPS-main/KUBERNETES/K8S_OBJECTS/5.1 PV & PVC.txt b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/5.1 PV & PVC.txt new file mode 100644 index 0000000..479833e --- /dev/null +++ b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/5.1 PV & PVC.txt @@ -0,0 +1,42 @@ +# NOTE: +# 1. We need to manually create an EBS from AWS & get the volumeID & enter in below manifest +# 2. EBS must be created in same region as EC2 +# 3. EBS is integrated with PV & Pod is integrated with PVC + +# PersistentVolume yaml file + +--- +apiVersion: v1 +kind: PersistentVolume +metadata: + name: my-pv +spec: + capacity: + storage: 20Gi + volumeMode: Filesystem + accessModes: + - ReadWriteOnce + awsElasticBlockStore: + volumeID: vol-0e4686933f1c2c88e #(Replace with your EBS volume ID) + fsType: ext4 + persistentVolumeReclaimPolicy: Retain +... + +# PersistentVolumeClaim yaml file + +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: my-pvc +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 2Gi + storageClassName: standard #(storage class is standard by default, same can be checked using kubectl get storageclass) + selector: + matchLabels: + name: my-pv +... \ No newline at end of file diff --git a/DEVOPS-main/KUBERNETES/K8S_OBJECTS/5.2 Pod with PV.txt b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/5.2 Pod with PV.txt new file mode 100644 index 0000000..a64fb75 --- /dev/null +++ b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/5.2 Pod with PV.txt @@ -0,0 +1,21 @@ +# NOTE: +1. Pod is integrated using PVC +2. EBS is integrated using PV + +--- +apiVersion: v1 +kind: Pod +metadata: + name: my-pod1 +spec: + containers: + - name: container1 + image: httpd:latest + volumeMounts: + - name: my-volume + mountPath: /data + volumes: + - name: my-volume + persistentVolumeClaim: + claimName: my-pvc #(paste your pvc name here) +... \ No newline at end of file diff --git a/DEVOPS-main/KUBERNETES/K8S_OBJECTS/6.1 ConfigMap.txt b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/6.1 ConfigMap.txt new file mode 100644 index 0000000..1f4eb1f --- /dev/null +++ b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/6.1 ConfigMap.txt @@ -0,0 +1,17 @@ +# NOTE: +# 1. ConfigMap contains configuration data only +# 2. If you want to store any confidential data, then use 'Secrets' + +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: my-configmap +data: + name: "my-app" + marketname: "blue-ocean" + marketID: "bo" + category: "non-prod" + env: "uat" + url: "my-blue-ocean.com" +... \ No newline at end of file diff --git a/DEVOPS-main/KUBERNETES/K8S_OBJECTS/6.2 Pod with ConfigMap.txt b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/6.2 Pod with ConfigMap.txt new file mode 100644 index 0000000..644d9c2 --- /dev/null +++ b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/6.2 Pod with ConfigMap.txt @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: + name: mypod2 +spec: + containers: + - name: mycontainer + image: myimage + volumeMounts: + - name: config-volume + mountPath: /etc/config + volumes: + - name: config-volume + configMap: + name: my-configmap #(must match the name of configMap) diff --git a/DEVOPS-main/KUBERNETES/K8S_OBJECTS/6.3 Pod with ConfigMap.txt b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/6.3 Pod with ConfigMap.txt new file mode 100644 index 0000000..f55bf01 --- /dev/null +++ b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/6.3 Pod with ConfigMap.txt @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: + name: mypod +spec: + containers: + - name: mycontainer + image: myimage + volumeMounts: + - name: config-volume + mountPath: /etc/config + volumes: + - name: config-volume + configMap: + name: my-configmap diff --git a/DEVOPS-main/KUBERNETES/K8S_OBJECTS/7.1 Secret.txt b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/7.1 Secret.txt new file mode 100644 index 0000000..35a3098 --- /dev/null +++ b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/7.1 Secret.txt @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: Secret +metadata: + name: my-database-secret +type: Opaque +data: + username: dXNlcm5hbWU= # base64-encoded username (e.g., "username") + password: cGFzc3dvcmQ= # base64-encoded password (e.g., "password") diff --git a/DEVOPS-main/KUBERNETES/K8S_OBJECTS/7.2 Pod with Secret.txt b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/7.2 Pod with Secret.txt new file mode 100644 index 0000000..a39d266 --- /dev/null +++ b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/7.2 Pod with Secret.txt @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: + name: mypod4 +spec: + containers: + - name: mycontainer + image: httpd:latest + volumeMounts: + - name: secret-volume + mountPath: /etc/secrets + volumes: + - name: secret-volume + secret: + secretName: my-database-secret #(mention your secret name) diff --git a/DEVOPS-main/KUBERNETES/K8S_OBJECTS/8. Namespace.txt b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/8. Namespace.txt new file mode 100644 index 0000000..3b11dd1 --- /dev/null +++ b/DEVOPS-main/KUBERNETES/K8S_OBJECTS/8. Namespace.txt @@ -0,0 +1,17 @@ +# Namespaces can be created by imperative command as below + +kubectl create namespace + +# eg: +kubectl create ns sit +kubectl create ns uat +kubectl create ns dev + +# Example to create pod in sit environment +kubectl apply -f pod.yaml -n sit +kubectl get pods -n sit +kubectl describe pods -n sit + +# NOTE: +# For Non-prod environments we have: DEV, SIT & UAT +# For Production environments we have: STAGING & PROD \ No newline at end of file diff --git a/Jenkinsfile-CI b/Jenkinsfile-CI index f480b2e..7f249f2 100644 --- a/Jenkinsfile-CI +++ b/Jenkinsfile-CI @@ -8,7 +8,11 @@ pipeline { agent any // DECLARE THE VARIABLES HERE: environment { - DOCKER_USERNAME = "nasirpatel" // check the 'ID' in your Jenkins credentials + DOCKER_USERNAME = "iotbands1train" // check the 'ID' in your Jenkins credentials + GITHUB_USERNAME = "iotbands1train" + PROJECT_NAME = "DevopsProject1" + PIPELINE_NAME = "CI-PIPELINE" + } stages { @@ -25,7 +29,7 @@ pipeline { steps { dir ("DevopsProject1"){ script { - git branch: 'main', url: 'https://github.com/pandacloud1/DevopsProject1.git' + git branch: 'main', url: "https://github.com/${GITHUB_USERNAME}/${PROJECT_NAME}.git" } } } diff --git a/README.md b/README.md index 3a74cec..f2d6336 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Devops-Project. -![Tools](https://github.com/pandacloud1/DevopsProject1/assets/134182273/b553e105-136d-4ce4-93ec-540809cdc6ee) +![alt text](image.png) This repository contains the following components: diff --git a/image.png b/image.png new file mode 100644 index 0000000000000000000000000000000000000000..d4ab902f71323387c3ddf549d0e43bac320d6b81 GIT binary patch literal 86356 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 QfdBvi07*qoM6N<$f?k}mD*ylh literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml index 3512c33..e5a3659 100644 --- a/pom.xml +++ b/pom.xml @@ -30,7 +30,16 @@ org.springframework.boot spring-boot-starter-actuator + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + diff --git a/src/main/java/com/javatechie/DevopsIntegrationApplication.java b/src/main/java/com/javatechie/DevopsIntegrationApplication.java index 8084fe6..31e9d6b 100644 --- a/src/main/java/com/javatechie/DevopsIntegrationApplication.java +++ b/src/main/java/com/javatechie/DevopsIntegrationApplication.java @@ -14,6 +14,12 @@ public String message(){ return "Welcome to our DevOps Project !!"; } + @GetMapping("/welcome") + public String welcome(){ + int x=1; + return "Welcome to our DevOps Project !!"+x; + } + public static void main(String[] args) { SpringApplication.run(DevopsIntegrationApplication.class, args); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e69de29..9e91d82 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -0,0 +1,3 @@ +server.port=8080 +# start dispatcherServlet path at /api +server.servlet.context-path=/api \ No newline at end of file diff --git a/target/classes/META-INF/build-info.properties b/target/classes/META-INF/build-info.properties new file mode 100644 index 0000000..ea5bce0 --- /dev/null +++ b/target/classes/META-INF/build-info.properties @@ -0,0 +1,5 @@ +build.artifact=devops-integration +build.group=com.javatechie +build.name=devops-integration +build.time=2024-04-24T02\:27\:54.809Z +build.version=0.0.1-SNAPSHOT diff --git a/target/classes/application.properties b/target/classes/application.properties new file mode 100644 index 0000000..9e91d82 --- /dev/null +++ b/target/classes/application.properties @@ -0,0 +1,3 @@ +server.port=8080 +# start dispatcherServlet path at /api +server.servlet.context-path=/api \ No newline at end of file diff --git a/target/classes/application.yml b/target/classes/application.yml new file mode 100644 index 0000000..c378083 --- /dev/null +++ b/target/classes/application.yml @@ -0,0 +1,8 @@ +management: + endpoints: + web: + exposure: + include: + - "*" + server: + port: 8081 \ No newline at end of file diff --git a/target/classes/com/javatechie/DevopsIntegrationApplication.class b/target/classes/com/javatechie/DevopsIntegrationApplication.class new file mode 100644 index 0000000000000000000000000000000000000000..753dbca111d7eff291ff898e645b9d107392ceec GIT binary patch literal 1308 zcmb7EYflqF6g|_2Ew%C}Z$aJqY>Tiyh%qT40gQ%Ngn%hAe44gH8QktPv$Md@(l1~% z@dx;$jCZyTG_o=A!_1x8Idks0kJ(?pzyAcVjO7dx3=2)wagX^4H==nYh5JUFsBW<7 z8`0L>Nae3}yPj-D%M4NsqZaIX+;6+vjbqU?3^!J!FU=}LvQ(}!q&8Gbx;>+% z-zLE9Zs;4?5p@|z^0wyt%0%&yv*nu7Z8zvz=%MBvajNuZ_f$08hV)x5zr?!lgxTWV zuBFUkoWa=_9tjnWQH~0=Ly6n&2F{LFHYrZANXkxo5Qg*#_d-&bCF3`aqYG%0%If7%JYP-q6kVQy;~qf zD|%KmXK3e=Wn|Np3uM32B7q#u_87FfNprpjAbX2;48s^9)My_yM%EH7(uuv3EEK+w z8KfB=ph;fROkC0o)5S3wlLue{rXsrcq&7i3dy;r!+yN5AcwPhwuoG>CEbUMb_%f7FgvQp6p-6++&*|)a-!ZEJe0Nc$Y?+{w`z^ Rcoxmiqa@gCFKGV~_yaXwK}-Mu literal 0 HcmV?d00001 diff --git a/target/classes/git.properties b/target/classes/git.properties new file mode 100644 index 0000000..504d2f2 --- /dev/null +++ b/target/classes/git.properties @@ -0,0 +1,26 @@ +#Generated by Git-Commit-Id-Plugin +git.branch=main +git.build.host=iotbengals +git.build.time=2024-04-23T21\:26\:04-0500 +git.build.user.email=iot.jacoy@gmail.com +git.build.user.name=iotbands1train +git.build.version=0.0.1-SNAPSHOT +git.closest.tag.commit.count= +git.closest.tag.name= +git.commit.author.time=2024-03-01T23\:08\:12-0600 +git.commit.committer.time=2024-03-01T23\:08\:12-0600 +git.commit.id=a95e90f7500a80564105643ff8e2c9758c44b4cd +git.commit.id.abbrev=a95e90f +git.commit.id.describe=a95e90f-dirty +git.commit.id.describe-short=a95e90f-dirty +git.commit.message.full=Update README.md +git.commit.message.short=Update README.md +git.commit.time=2024-03-01T23\:08\:12-0600 +git.commit.user.email=134182273+pandacloud1@users.noreply.github.com +git.commit.user.name=PandaCloud +git.dirty=true +git.local.branch.ahead=0 +git.local.branch.behind=0 +git.remote.origin.url=https\://github.com/iotbands1train/DevopsProject1.git +git.tags= +git.total.commit.count=92 diff --git a/target/test-classes/com/javatechie/DevopsIntegrationApplicationTests.class b/target/test-classes/com/javatechie/DevopsIntegrationApplicationTests.class new file mode 100644 index 0000000000000000000000000000000000000000..f85b32547331c0f9870abd4726df7a55e82ef3d0 GIT binary patch literal 566 zcmb7B%Sr<=6g`<%t8KNlx)EHs5+7hh#El|UMGyuBTe{Co<21FC44F*zw_FJ>`~W{n zycvs#8*!2QJon`0qIR_Wy4ic~%t`@kb( z9CyUaXY27^i8!Zvc^x)Es?nbS0Uc6{@)|{)JoA;^7c4xN?K)ZC1_2smn_mF(OOyf2 k)D6(0$fMfiJ<%Q=Kf`{LG=7kfekDnO6@muneABD~pBW5`Gynhq literal 0 HcmV?d00001 diff --git a/terraform_files/README.md b/terraform_files/README.md index b768ab8..3250790 100644 --- a/terraform_files/README.md +++ b/terraform_files/README.md @@ -1,7 +1,7 @@ ### TERRAFORM FILES --- -![image](https://github.com/pandacloud1/DevopsProject1/assets/134182273/42370753-d725-4706-a0fa-39d5281e6546) +![alt text](image.png) #### The above Terraform files will create 'Jenkins' & 'K8s' servers #### Master-Server --> Git, Maven, Docker, Trivy, Ansible diff --git a/terraform_files/main.tf b/terraform_files/main.tf index 44092e0..f834df1 100644 --- a/terraform_files/main.tf +++ b/terraform_files/main.tf @@ -2,7 +2,7 @@ # STEP1: CREATING A SECURITY GROUP FOR JENKINS SERVER # Description: Allow SSH, HTTP, HTTPS, 8080, 8081 resource "aws_security_group" "my_security_group1" { - name = "my-security-group1" + name = "my-security-group1-${timestamp()}" description = "Allow SSH, HTTP, HTTPS, 8080 for Jenkins & Maven" # SSH Inbound Rules @@ -89,12 +89,12 @@ resource "aws_instance" "my_ec2_instance1" { host = self.public_ip } - inline = [ + inline = [ # wait for 200sec before EC2 initialization "sleep 200", # Install Git "sudo yum install git -y", - + # Install Jenkins # REF: https://www.jenkins.io/doc/tutorials/tutorial-for-installing-jenkins-on-AWS/ "sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo", diff --git a/terraform_files/node.tf b/terraform_files/node.tf index 688691b..57a387c 100644 --- a/terraform_files/node.tf +++ b/terraform_files/node.tf @@ -2,7 +2,7 @@ # STEP1: CREATING A SECURITY GROUP FOR DOCKER-K8S # Description: K8s requires ports 22, 80, 443, 6443, 8001, 10250, 30000-32767 resource "aws_security_group" "my_security_group2" { - name = "my-security-group4" + name = "my-security-group4-${timestamp()}" description = "Allow K8s ports" # SSH Inbound Rules @@ -100,7 +100,7 @@ resource "aws_instance" "my_ec2_instance2" { host = self.public_ip } - inline = [ + inline = [ "sleep 200", # Install Docker @@ -110,7 +110,7 @@ resource "aws_instance" "my_ec2_instance2" { "sudo systemctl start docker", "sudo systemctl enable docker", "sudo chmod 777 /var/run/docker.sock", - + # Install K8s # REF: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ "sudo setenforce 0", @@ -133,9 +133,9 @@ resource "aws_instance" "my_ec2_instance2" { "kubectl apply -f https://docs.projectcalico.org/v3.18/manifests/calico.yaml", "kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/tigera-operator.yaml", "kubectl taint nodes --all node-role.kubernetes.io/control-plane-", - ] - } - + ] + } + } # STEP3: OUTPUT PUBLIC IP OF EC2 INSTANCE diff --git a/terraform_files/provider.tf b/terraform_files/provider.tf index 325f324..e00f738 100644 --- a/terraform_files/provider.tf +++ b/terraform_files/provider.tf @@ -9,5 +9,5 @@ terraform { } #STEP2: DEFINE THE REGION (N. Virginia) provider "aws" { - region = "us-east-1" + region = "us-east-2" } \ No newline at end of file From b2435817187aeedf29022472c76c78740ac5a6c6 Mon Sep 17 00:00:00 2001 From: iotbands1train Date: Wed, 24 Apr 2024 01:22:34 -0500 Subject: [PATCH 2/5] dfd --- .../Ansible/Amazon_Linux2/ansible.bash | 11 +++++++++ .../Docker/Amazon_Linux2/docker.bash | 7 ++++++ .../Jenkins/Amazon_Linux/jenkins.bash | 9 ++++++++ .../Installation_Scripts/Kubernetes/03-k8s.sh | 23 +++++++++++++++++++ .../Amazon_Linux2/k8s_minikube.bash | 6 ++++- .../Maven/Amazon_Linux2/maven.bash | 11 +++++++++ .../Trivy/Amazon_Linux2/trivy.bash | 13 +++++++++++ DEVOPS-main/Installation_Scripts/java/jdk.sh | 14 +++++++++++ Jenkinsfile-CI | 7 ++---- deployment.yaml | 2 +- target/classes/META-INF/build-info.properties | 2 +- terraform_files/main.tf | 4 ++-- terraform_files/node.tf | 8 +++---- 13 files changed, 103 insertions(+), 14 deletions(-) create mode 100644 DEVOPS-main/Installation_Scripts/Kubernetes/03-k8s.sh create mode 100644 DEVOPS-main/Installation_Scripts/java/jdk.sh diff --git a/DEVOPS-main/Installation_Scripts/Ansible/Amazon_Linux2/ansible.bash b/DEVOPS-main/Installation_Scripts/Ansible/Amazon_Linux2/ansible.bash index 7e6f906..0d655e1 100644 --- a/DEVOPS-main/Installation_Scripts/Ansible/Amazon_Linux2/ansible.bash +++ b/DEVOPS-main/Installation_Scripts/Ansible/Amazon_Linux2/ansible.bash @@ -1,3 +1,14 @@ + +vi ansible.sh + +#!/bin/bash sudo yum update -y sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -y sudo yum install git python python-devel python-pip openssl ansible -y + + + +chmod a+x ansible.sh +./ansible.sh + + diff --git a/DEVOPS-main/Installation_Scripts/Docker/Amazon_Linux2/docker.bash b/DEVOPS-main/Installation_Scripts/Docker/Amazon_Linux2/docker.bash index 721aa30..cd8a838 100644 --- a/DEVOPS-main/Installation_Scripts/Docker/Amazon_Linux2/docker.bash +++ b/DEVOPS-main/Installation_Scripts/Docker/Amazon_Linux2/docker.bash @@ -10,3 +10,10 @@ sudo usermod -aG docker $USER && newgrp docker #(add normal user 'docker') # To avoid below permission error # Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock sudo chmod 777 /var/run/docker.sock + + +# chmod a+x docker.bash +# ./docker.bash + +chmod a+x docker.bash +./docker.bash \ No newline at end of file diff --git a/DEVOPS-main/Installation_Scripts/Jenkins/Amazon_Linux/jenkins.bash b/DEVOPS-main/Installation_Scripts/Jenkins/Amazon_Linux/jenkins.bash index 4b91fde..be25644 100644 --- a/DEVOPS-main/Installation_Scripts/Jenkins/Amazon_Linux/jenkins.bash +++ b/DEVOPS-main/Installation_Scripts/Jenkins/Amazon_Linux/jenkins.bash @@ -1,3 +1,7 @@ + +# jenkins.sh +vi jenkins.sh + #!/bin/bash # REF: (https://www.jenkins.io/doc/tutorials/tutorial-for-installing-jenkins-on-AWS/) # NOTE: @@ -9,6 +13,8 @@ sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/ sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key sudo yum install java-17-amazon-corretto -y sudo yum install jenkins -y +sudo /usr/sbin/alternatives --config java +sudo /usr/sbin/alternatives --config javac sudo systemctl enable jenkins sudo systemctl start jenkins @@ -24,3 +30,6 @@ echo "Your Jenkins Initial Password: $pass" # In case if Jenkins fails to starts, try to set Java version to 11,17,21 using below command # sudo /usr/sbin/alternatives --config java # (Select the relevant Java version: 11,17 or 21) + +chmod a+x jenkins.sh +./jenkins.sh \ No newline at end of file diff --git a/DEVOPS-main/Installation_Scripts/Kubernetes/03-k8s.sh b/DEVOPS-main/Installation_Scripts/Kubernetes/03-k8s.sh new file mode 100644 index 0000000..452a45b --- /dev/null +++ b/DEVOPS-main/Installation_Scripts/Kubernetes/03-k8s.sh @@ -0,0 +1,23 @@ + +vi k8s.bash + + +# install kubectl + +# k8s.bash + +#!/bin/bash +curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" +curl -LO https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl +curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256" +echo "$(cat kubectl.sha256) kubectl" | sha256sum --check +sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl +sudo chmod +x kubectl +sudo mkdir -p ~/.local/bin +sudo mv ./kubectl ~/.local/bin/kubectl +kubectl version + +# execute bash +chmod a+x k8s.bash +./k8s.bash + diff --git a/DEVOPS-main/Installation_Scripts/Kubernetes/Amazon_Linux2/k8s_minikube.bash b/DEVOPS-main/Installation_Scripts/Kubernetes/Amazon_Linux2/k8s_minikube.bash index 4a6701f..43a5734 100644 --- a/DEVOPS-main/Installation_Scripts/Kubernetes/Amazon_Linux2/k8s_minikube.bash +++ b/DEVOPS-main/Installation_Scripts/Kubernetes/Amazon_Linux2/k8s_minikube.bash @@ -18,8 +18,12 @@ sudo minikube start # Install kubectl # REF: https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/ -sudo curl -LO 'https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl' +curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" +curl -LO https://dl.k8s.io/release/v1.30.0/bin/linux/amd64/kubectl +curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256" +echo "$(cat kubectl.sha256) kubectl" | sha256sum --check sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl sudo chmod +x kubectl sudo mkdir -p ~/.local/bin sudo mv ./kubectl ~/.local/bin/kubectl +kubectl version diff --git a/DEVOPS-main/Installation_Scripts/Maven/Amazon_Linux2/maven.bash b/DEVOPS-main/Installation_Scripts/Maven/Amazon_Linux2/maven.bash index 8b664be..92828e8 100644 --- a/DEVOPS-main/Installation_Scripts/Maven/Amazon_Linux2/maven.bash +++ b/DEVOPS-main/Installation_Scripts/Maven/Amazon_Linux2/maven.bash @@ -1,7 +1,18 @@ +vi maven.bash + + + # REF: https://docs.aws.amazon.com/neptune/latest/userguide/iam-auth-connect-prerq.html sudo wget https://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo sudo sed -i s/\$releasever/6/g /etc/yum.repos.d/epel-apache-maven.repo sudo yum install -y apache-maven sudo yum install java-1.8.0-devel -y sudo /usr/sbin/alternatives --config java +sudo /usr/sbin/alternatives --config javac # (When prompted, enter the number for Java 1.8) + +# chmod a+x docker.bash +# ./docker.bash + +chmod a+x maven.bash +./maven.bash \ No newline at end of file diff --git a/DEVOPS-main/Installation_Scripts/Trivy/Amazon_Linux2/trivy.bash b/DEVOPS-main/Installation_Scripts/Trivy/Amazon_Linux2/trivy.bash index 9c0d776..22f490a 100644 --- a/DEVOPS-main/Installation_Scripts/Trivy/Amazon_Linux2/trivy.bash +++ b/DEVOPS-main/Installation_Scripts/Trivy/Amazon_Linux2/trivy.bash @@ -1,3 +1,16 @@ + + +vi trivy.sh + #!/bin/bash # REF: https://aquasecurity.github.io/trivy/v0.18.3/installation/ sudo rpm -ivh https://github.com/aquasecurity/trivy/releases/download/v0.18.3/trivy_0.18.3_Linux-64bit.rpm + + + +chmod a+x trivy.sh +./trivy.sh + + + + diff --git a/DEVOPS-main/Installation_Scripts/java/jdk.sh b/DEVOPS-main/Installation_Scripts/java/jdk.sh new file mode 100644 index 0000000..fd5449d --- /dev/null +++ b/DEVOPS-main/Installation_Scripts/java/jdk.sh @@ -0,0 +1,14 @@ +# java.sh +vi java.sh + +#!/bin/bash +sudo yum update -y +sudo yum install java-1.8.0-openjdk -y +sudo yum install git -y +java -version + +# chmod a+x java.sh +# ./java.sh + +chmod a+x java.sh +./java.sh \ No newline at end of file diff --git a/Jenkinsfile-CI b/Jenkinsfile-CI index 7f249f2..444751c 100644 --- a/Jenkinsfile-CI +++ b/Jenkinsfile-CI @@ -8,11 +8,8 @@ pipeline { agent any // DECLARE THE VARIABLES HERE: environment { - DOCKER_USERNAME = "iotbands1train" // check the 'ID' in your Jenkins credentials - GITHUB_USERNAME = "iotbands1train" - PROJECT_NAME = "DevopsProject1" + DOCKER_USERNAME = "iotbands1train" // check the 'ID' in your Jenkins credentials PIPELINE_NAME = "CI-PIPELINE" - } stages { @@ -29,7 +26,7 @@ pipeline { steps { dir ("DevopsProject1"){ script { - git branch: 'main', url: "https://github.com/${GITHUB_USERNAME}/${PROJECT_NAME}.git" + git branch: 'main', url: "https://github.com/iotbands1train/DevopsProject1.git" } } } diff --git a/deployment.yaml b/deployment.yaml index f2f582f..5e33627 100644 --- a/deployment.yaml +++ b/deployment.yaml @@ -15,6 +15,6 @@ spec: spec: containers: - name: mycontainer - image: nasirpatel/ci-pipeline:latest # replace with your Docker-image pushed on Dockerhub + image: iotbands1train/ci-pipeline:latest # replace with your Docker-image pushed on Dockerhub ports: - containerPort: 8080 diff --git a/target/classes/META-INF/build-info.properties b/target/classes/META-INF/build-info.properties index ea5bce0..21f132f 100644 --- a/target/classes/META-INF/build-info.properties +++ b/target/classes/META-INF/build-info.properties @@ -1,5 +1,5 @@ build.artifact=devops-integration build.group=com.javatechie build.name=devops-integration -build.time=2024-04-24T02\:27\:54.809Z +build.time=2024-04-24T02\:58\:38.081Z build.version=0.0.1-SNAPSHOT diff --git a/terraform_files/main.tf b/terraform_files/main.tf index f834df1..c12bd98 100644 --- a/terraform_files/main.tf +++ b/terraform_files/main.tf @@ -54,7 +54,7 @@ resource "aws_security_group" "my_security_group1" { # Note: i. First create a pem-key manually from the AWS console #      ii. Copy it in the same directory as your terraform code resource "aws_instance" "my_ec2_instance1" { - ami = "ami-0cf10cdf9fcd62d37" + ami = "ami-080e449218d4434fa" instance_type = "t2.medium" vpc_security_group_ids = [aws_security_group.my_security_group1.id] key_name = "My_Key" # paste your key-name here, do not use extension '.pem' @@ -66,7 +66,7 @@ resource "aws_instance" "my_ec2_instance1" { } tags = { - Name = "MASTER-SERVER" + Name = "JENKINS-MASTER SERVER" } user_data = <<-EOF diff --git a/terraform_files/node.tf b/terraform_files/node.tf index 57a387c..14acf01 100644 --- a/terraform_files/node.tf +++ b/terraform_files/node.tf @@ -75,10 +75,10 @@ resource "aws_security_group" "my_security_group2" { # Note: i. First create a pem-key manually from the AWS console #      ii. Copy it in the same directory as your terraform code resource "aws_instance" "my_ec2_instance2" { - ami = "ami-0cf10cdf9fcd62d37" + ami = "ami-080e449218d4434fa" instance_type = "t2.medium" # K8s requires min 2CPU & 4G RAM vpc_security_group_ids = [aws_security_group.my_security_group2.id] - key_name = "My_Key" # paste your key-name here, do not use extension '.pem' + key_name = "My_Key_2" # paste your key-name here, do not use extension '.pem' # Consider EBS volume 30GB root_block_device { @@ -87,7 +87,7 @@ resource "aws_instance" "my_ec2_instance2" { } tags = { - Name = "NODE-SERVER" + Name = "K8s-NODE SERVER" } # STEP3: USING REMOTE-EXEC PROVISIONER TO INSTALL TOOLS @@ -95,7 +95,7 @@ resource "aws_instance" "my_ec2_instance2" { # ESTABLISHING SSH CONNECTION WITH EC2 connection { type = "ssh" - private_key = file("./My_Key.pem") # replace with your key-name + private_key = file("./My_Key_2.pem") # replace with your key-name user = "ec2-user" host = self.public_ip } From fcd6a488e356d0ce729037e3576d3b8c4fe5586b Mon Sep 17 00:00:00 2001 From: iotbands1train Date: Wed, 24 Apr 2024 01:40:07 -0500 Subject: [PATCH 3/5] update --- Jenkinsfile-CD | 8 ++++---- Jenkinsfile-CI | 2 +- deployment.yaml | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Jenkinsfile-CD b/Jenkinsfile-CD index ac4dbbd..83ba4ae 100644 --- a/Jenkinsfile-CD +++ b/Jenkinsfile-CD @@ -6,9 +6,9 @@ pipeline { agent any // DECLARE THE VARIABLES HERE: environment { - NODE_IP = '' // paste your Node-Server private IP here + NODE_IP = '172.31.19.125' // paste your Node-Server private IP here EC2_NAME = "ec2-user" // enter your AWS EC2 username - PIPELINE_NAME = "CI-PIPELINE" // enter your pipeline name here + PIPELINE_NAME = "CI-PIPELINE-V2" // enter your pipeline name here PROJECT_NAME = "DevopsProject1" // enter your Devops project name here } @@ -16,7 +16,7 @@ pipeline { stage("1. Pull Files") { // Copy K8s manifest files from Master-Server workspace to Node-server steps { - sshagent(['my_ec2_creds']) { // install 'ssh agent' plugin & generate 'ssh-agent' pipeline syntax generator + sshagent(['my_key']) { // install 'ssh agent' plugin & generate 'ssh-agent' pipeline syntax generator sh "ssh -o StrictHostKeyChecking=no ${EC2_NAME}@${NODE_IP}" // enter your Node Server's private IP here sh "scp /var/lib/jenkins/workspace/${PIPELINE_NAME}/${PROJECT_NAME}/deployment.yaml ${EC2_NAME}@${NODE_IP}:/home/ec2-user/" sh "scp /var/lib/jenkins/workspace/${PIPELINE_NAME}/${PROJECT_NAME}/service.yaml ${EC2_NAME}@${NODE_IP}:/home/ec2-user/" @@ -37,7 +37,7 @@ pipeline { // i. Ensure to establish passwordless connection between Master & Node first // ii. Your deployment.yaml file must contain the Dockerhub image within the container block steps { - sshagent(['my_ec2_creds']) { // store EC2 username & pem-key in Jenkins credentials + sshagent(['my_key']) { // store EC2 username & pem-key in Jenkins credentials sh "ssh -o StrictHostKeyChecking=no ${EC2_NAME}@${NODE_IP}" // enter your Node-Server private IP here sh "ssh -o StrictHostKeyChecking=no ${EC2_NAME}@${NODE_IP} kubectl apply -f deployment.yaml" sh "ssh -o StrictHostKeyChecking=no ${EC2_NAME}@${NODE_IP} kubectl apply -f service.yaml" diff --git a/Jenkinsfile-CI b/Jenkinsfile-CI index 444751c..c56f6bb 100644 --- a/Jenkinsfile-CI +++ b/Jenkinsfile-CI @@ -9,7 +9,7 @@ pipeline { // DECLARE THE VARIABLES HERE: environment { DOCKER_USERNAME = "iotbands1train" // check the 'ID' in your Jenkins credentials - PIPELINE_NAME = "CI-PIPELINE" + PIPELINE_NAME = "CI-PIPELINE-V2" } stages { diff --git a/deployment.yaml b/deployment.yaml index 5e33627..ef25f2a 100644 --- a/deployment.yaml +++ b/deployment.yaml @@ -15,6 +15,6 @@ spec: spec: containers: - name: mycontainer - image: iotbands1train/ci-pipeline:latest # replace with your Docker-image pushed on Dockerhub + image: iotbands1train/ci-pipeline-v2:latest # replace with your Docker-image pushed on Dockerhub ports: - containerPort: 8080 From f54c59032c61938d5725b9fa52adf5a4578d7fe1 Mon Sep 17 00:00:00 2001 From: iotbands1train Date: Wed, 24 Apr 2024 01:54:31 -0500 Subject: [PATCH 4/5] u2 --- Jenkinsfile-CD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile-CD b/Jenkinsfile-CD index 83ba4ae..c0cc4a2 100644 --- a/Jenkinsfile-CD +++ b/Jenkinsfile-CD @@ -37,7 +37,7 @@ pipeline { // i. Ensure to establish passwordless connection between Master & Node first // ii. Your deployment.yaml file must contain the Dockerhub image within the container block steps { - sshagent(['my_key']) { // store EC2 username & pem-key in Jenkins credentials + sshagent(['my_ec2_creds']) { // store EC2 username & pem-key in Jenkins credentials sh "ssh -o StrictHostKeyChecking=no ${EC2_NAME}@${NODE_IP}" // enter your Node-Server private IP here sh "ssh -o StrictHostKeyChecking=no ${EC2_NAME}@${NODE_IP} kubectl apply -f deployment.yaml" sh "ssh -o StrictHostKeyChecking=no ${EC2_NAME}@${NODE_IP} kubectl apply -f service.yaml" @@ -47,4 +47,4 @@ pipeline { } } } -} +} \ No newline at end of file From 6cbe0ddf5833471360827dfc2a32656220f9963c Mon Sep 17 00:00:00 2001 From: iotbands1train Date: Wed, 24 Apr 2024 06:47:26 -0500 Subject: [PATCH 5/5] 'code' --- .vscode/settings.json | 3 ++- Jenkinsfile-CD | 4 +-- target/classes/META-INF/build-info.properties | 2 +- target/classes/git.properties | 26 +++++++++---------- terraform_files/main.tf | 4 --- 5 files changed, 18 insertions(+), 21 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 4e8a8c9..b20529d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,5 @@ { "FSharp.suggestGitignore": false, - "java.configuration.updateBuildConfiguration": "interactive" + "java.configuration.updateBuildConfiguration": "interactive", + "java.compile.nullAnalysis.mode": "automatic" } \ No newline at end of file diff --git a/Jenkinsfile-CD b/Jenkinsfile-CD index c0cc4a2..a3e0abb 100644 --- a/Jenkinsfile-CD +++ b/Jenkinsfile-CD @@ -6,7 +6,7 @@ pipeline { agent any // DECLARE THE VARIABLES HERE: environment { - NODE_IP = '172.31.19.125' // paste your Node-Server private IP here + NODE_IP = '172.31.30.1' // paste your Node-Server private IP here EC2_NAME = "ec2-user" // enter your AWS EC2 username PIPELINE_NAME = "CI-PIPELINE-V2" // enter your pipeline name here PROJECT_NAME = "DevopsProject1" // enter your Devops project name here @@ -37,7 +37,7 @@ pipeline { // i. Ensure to establish passwordless connection between Master & Node first // ii. Your deployment.yaml file must contain the Dockerhub image within the container block steps { - sshagent(['my_ec2_creds']) { // store EC2 username & pem-key in Jenkins credentials + sshagent(['my_key']) { // store EC2 username & pem-key in Jenkins credentials sh "ssh -o StrictHostKeyChecking=no ${EC2_NAME}@${NODE_IP}" // enter your Node-Server private IP here sh "ssh -o StrictHostKeyChecking=no ${EC2_NAME}@${NODE_IP} kubectl apply -f deployment.yaml" sh "ssh -o StrictHostKeyChecking=no ${EC2_NAME}@${NODE_IP} kubectl apply -f service.yaml" diff --git a/target/classes/META-INF/build-info.properties b/target/classes/META-INF/build-info.properties index 21f132f..e12f226 100644 --- a/target/classes/META-INF/build-info.properties +++ b/target/classes/META-INF/build-info.properties @@ -1,5 +1,5 @@ build.artifact=devops-integration build.group=com.javatechie build.name=devops-integration -build.time=2024-04-24T02\:58\:38.081Z +build.time=2024-04-24T11\:18\:07.818Z build.version=0.0.1-SNAPSHOT diff --git a/target/classes/git.properties b/target/classes/git.properties index 504d2f2..32c196f 100644 --- a/target/classes/git.properties +++ b/target/classes/git.properties @@ -1,26 +1,26 @@ #Generated by Git-Commit-Id-Plugin git.branch=main git.build.host=iotbengals -git.build.time=2024-04-23T21\:26\:04-0500 +git.build.time=2024-04-24T06\:18\:07-0500 git.build.user.email=iot.jacoy@gmail.com git.build.user.name=iotbands1train git.build.version=0.0.1-SNAPSHOT git.closest.tag.commit.count= git.closest.tag.name= -git.commit.author.time=2024-03-01T23\:08\:12-0600 -git.commit.committer.time=2024-03-01T23\:08\:12-0600 -git.commit.id=a95e90f7500a80564105643ff8e2c9758c44b4cd -git.commit.id.abbrev=a95e90f -git.commit.id.describe=a95e90f-dirty -git.commit.id.describe-short=a95e90f-dirty -git.commit.message.full=Update README.md -git.commit.message.short=Update README.md -git.commit.time=2024-03-01T23\:08\:12-0600 -git.commit.user.email=134182273+pandacloud1@users.noreply.github.com -git.commit.user.name=PandaCloud +git.commit.author.time=2024-04-24T01\:54\:31-0500 +git.commit.committer.time=2024-04-24T01\:54\:31-0500 +git.commit.id=f54c59032c61938d5725b9fa52adf5a4578d7fe1 +git.commit.id.abbrev=f54c590 +git.commit.id.describe=f54c590-dirty +git.commit.id.describe-short=f54c590-dirty +git.commit.message.full=u2 +git.commit.message.short=u2 +git.commit.time=2024-04-24T01\:54\:31-0500 +git.commit.user.email=iot.jacoy@gmail.com +git.commit.user.name=iotbands1train git.dirty=true git.local.branch.ahead=0 git.local.branch.behind=0 git.remote.origin.url=https\://github.com/iotbands1train/DevopsProject1.git git.tags= -git.total.commit.count=92 +git.total.commit.count=96 diff --git a/terraform_files/main.tf b/terraform_files/main.tf index c12bd98..65c7059 100644 --- a/terraform_files/main.tf +++ b/terraform_files/main.tf @@ -94,7 +94,6 @@ resource "aws_instance" "my_ec2_instance1" { "sleep 200", # Install Git "sudo yum install git -y", - # Install Jenkins # REF: https://www.jenkins.io/doc/tutorials/tutorial-for-installing-jenkins-on-AWS/ "sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo", @@ -103,7 +102,6 @@ resource "aws_instance" "my_ec2_instance1" { "sudo yum install jenkins -y", "sudo systemctl enable jenkins", "sudo systemctl start jenkins", - # Install Docker # REF: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-docker.html "sudo yum update -y", @@ -114,11 +112,9 @@ resource "aws_instance" "my_ec2_instance1" { # To avoid below permission error # Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock "sudo chmod 666 /var/run/docker.sock", - # Install Trivy # REF: https://aquasecurity.github.io/trivy/v0.18.3/installation/ "sudo rpm -ivh https://github.com/aquasecurity/trivy/releases/download/v0.18.3/trivy_0.18.3_Linux-64bit.rpm", - # Install Ansible "sudo yum update -y", "sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -y",