Image for post
Image for post
  • Deploy Webserver using the best Principles, Tools, Techniques of DevOps Culture.

Here I am using Ansible for the configuration management system, Jenkins for CI/CD, Jenkins with Multi-Node Cluster, Build Jobs using DSL Code of Jenkins, for production I am using one of the famous services of AWS,i ,e AWS EKS(Elastic k8s Service).

  • Linux OS(Redhat, Centos).
  • Have an AWS account.
  • Created IAM users with AdministratorAccess Permission.
  • AWS CLIv2 configured in Linux with IAM user.
  • kubectl, eksctl configured in Linux.
  • Ansible, Git installed in Linux.

Step-1)Developing website Code:

Image for post
Image for post
The developer develops the code
Image for post
Image for post
Code pushed in Github

Note: Here one point, here we need one Dockerfile for building our docker iso for a webserver.

Image for post
Image for post
Dockerfile

Explanation of Docker: Here my Dockerfile copy all the code in the respective image for building iso for our webserver.

Step-2)Getting setup ready.

  • Here I am using Jenkins on top of docker, for setting up Jenkins , and we have to first install docker in OS, So for the Configuration Management System, I am using Ansible-Roles.
Image for post
Image for post
Ansible-config file
  • Here my ansible roles path and all the things are configured.
Image for post
Image for post
Ansible-roles
Image for post
Image for post
Ansible-Role Code.
  • To run this code we have to create one playbook and use this role in that playbook.
Image for post
Image for post
Ansible-Playbook
  • Code of Ansible-Playbook:
- hosts: localhost
roles:
- docker_rehl8
  • to run this playbook type:
ansible-playbook FILE_NAME.yml

Dockerfile of Jenkins:

FROM centos
RUN dnf install wget -y
RUN wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins.io/redhat-stable/jenkins.repo
RUN rpm --import http://pkg.jenkins.io/redhat-stable/jenkins.io.key
RUN dnf install java-11-openjdk.x86_64 jenkins -y
RUN dnf install -y openssh-server
RUN dnf install net-tools -y
RUN dnf install git -y
RUN dnf install httpd -y
RUN dnf install which -y
RUN dnf install python36 -y
RUN pip3 install ansible
RUN echo "jenkins ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
RUN echo "java -jar /usr/lib/jenkins/jenkins.war &" >> /root/.bashrc
RUN bash

Output:

Image for post
Image for post
Jenkins iso
Image for post
Image for post
docker installed by ansible-roles
Image for post
Image for post
Jenkins-iso pulled by ansible-roles

Step-3)Jenkins Setup.

  • Only just we need to start Jenkins container, type:
docker run -it --name jenkins1 -p 8082:8080 -v /root/jenkinsdata/:/root/.jenkins rootritesh/jenkins:v1
  • Here they starting container and exposing port 8080 of Jenkins, for making data persistent I mount Jenkins location on /root/jenkinsdata.
  • Now configuring Jenkins:
Image for post
Image for post
  • Copy-paste the password from the terminal.
Image for post
Image for post
  • No need to install plugins right now, close it.
Image for post
Image for post
Jenkins is ready

Step-4)Installing plugins in Jenkins.

  • Go to Manage Jenkins>Plugin Manager.
Image for post
Image for post
  • install these plugin > GitHub, job DSL, pipeline.
  • Click on install without restart
Image for post
Image for post

Step-5)Configure Jenkins

  • Here I using Jenkins Multi-Node Cluster, For configuring it Goto configure> Node> New Node> Add a new Node.
  • Here I am using two nodes one for Developer job building and another for DevOps team.
  • Now in the AWS launch one ec2 and configure it:
$sudo su -- root
$yum install git -y
#yum remove java-1.7.0-openjdk -y
$yum install java-1.8.0 -y
$yum install docker
$docker login (type username and password)
$docker pull centos.
$docker pull rootritesh/webserver-php
  • We need this configuring for a dev job.
Image for post
Image for post
AWS ec2
  • For the first Node, I am using AWS EC2.
Image for post
Image for post
  • Give the credential > Select kind > SSH Username with private key > give username (ec2-user) > Private key > Add it
Image for post
Image for post
  • Save it.
  • The output of the AWS Node.
Image for post
Image for post
AWS node is Connected
  • Second Node which my Base Os of Linux where all things are configured like=> AWS CLI, eksctl, etc.
Image for post
Image for post
Linux node
  • For credentials of Base, OS Linux, Connect vi ssh >provide username and password
  • Save it.
  • The output of the Linux Node.
Image for post
Image for post
Linux Node Connected Successfully
  • Now after that, we need to configure our Email Notification in Jenkins.
  • When our Job fails Jenkins Automatically sends the email to the team.
  • Go to Manage Jenkins > Configure System.
  • At the bottom there option E-mail Notification.
Image for post
Image for post
E-mail Notification
  • It is working, test configured successfully.

Step-5)Jenkins DSL JOB

  • Make one freestyle job name jobdsl.
  • Configure it using the following groovy DSL code.
Image for post
Image for post
job('devjob') {
scm {
github('rootritesh/DevOps_Project')
}
triggers{
scm("* * * * *")
}
label('aws')steps {
shell('''
sudo su -- root
pwd
sudo docker build -t rootritesh/myproserver:v8 .
sudo docker push rootritesh/myproserver:v8
''')}
}
job('prod') {
label('kube')
steps {
shell('''
wget https://raw.githubusercontent.com/rootritesh/AWS-EKS-TASK/master/cluster.yaml
eksctl create cluster -f cluster.yaml
sleep 5
kubectl get pods
if kubectl get deployments | grep myweb
then
echo "Webserver is running"
kubectl describe deployment myweb
else
kubectl create deployment myweb --image=rootritesh/myproserver:v8
kubectl scale deployment myweb --replicas=5
kubectl expose deployment myweb --port=80 --type=LoadBalancer
fi
''')}
}
job('status') {
label('kube')
triggers{
scm("* * * * *")
}
steps {
shell('''
if kubectl get deployment | grep myweb
then
echo "Deployment is There"
else
exit 1
fi
''')
}
publishers {
mailer('rootritesh34@gmail.com', false)
}
}

Explanation: Here I am using Jenkins DSL Groovy language for configuring jobs.

Step-6) Configure Jenkins Pipeline Job.

  • Make one Pipeline job name MYAL.
  • Configure it, using the following code.
Image for post
Image for post
Jenkins Pipeline Job
pipeline {
agent any
stages {
stage('Dev') {
steps {
echo 'building dev jobs'
build job: 'devjob'
}
}
stage('Prod') {
steps {
echo 'building production world'
build job: 'prod'
}
}

stage('checking status') {
steps {
echo 'status'
build job: 'status'
}
}
}
}

Explanation: This Pipeline job is running one by one job which is configured

Step-7)Run Job DSL

  • Goto jobdsl job and build it.
Image for post
Image for post
  • Build it.

Output of jobdsl

Image for post
Image for post
Job build
  • Here our job build successfully

The output of Jobs:

Image for post
Image for post
  • Here our jobs build successfully.
  • Name of jobs:
  • $devjob.
  • $prod(Production)
  • $status.

Step-8) Run the Pipeline Job

  • Now go and build the MYAL pipeline job.
Image for post
Image for post
build it

The output of the Pipeline:

Image for post
Image for post
Pipeline console output

Explanation of jobdsl DSL groovy Code:

Explanation of devjob:

Output of devjob:

Image for post
Image for post
AWS Ec2
  • Here our code has been downloaded successfully.
Image for post
Image for post
docker image
  • Here our Docker image built successfully.
Image for post
Image for post
  • Here our ISO has been pushed into hub.docker.com

Explanation of prod job:

Output of prod job:

Image for post
Image for post
EKS cluster
  • Here EKS cluster is ready.
Image for post
Image for post
clusters
  • Here our Nodegroup has been configured.
Image for post
Image for post
kubectl get deployments
  • Here U can see my all deployments running fine.
Image for post
Image for post
LoadBalancer
  • AWS Loadbalancer created by the service of K8s, for accessing our Website.

Explanation of status job:

Output of status job:

Image for post
Image for post
  • It is the test email send by Jenkins, it means our Jenkins E-mail job working fine.

FINAL Output.

  • Copy Loadbalancer DNS name into the browser for website output.
Image for post
Image for post
Website
  • Here our Website comes, running on EKS cluster, using Loadbalancer.
Image for post
Image for post
Image for post
Image for post
Image for post
Image for post

Final Explanation:

Here I completed this project using END-TO-END Automation, for configuration management I use Ansible. My Devjob running on AWS EC2 using Jenkins multi Node Cluster, and my Production is running on one of the powerful services of AWS i,e AWS EKS provide the best resources, high availability, etc. and at last by status is checking whether my deployment is there or not, if not it sends the email to the teams.

Github Link:

Tech Enthusiast, zeal for learning, and explore the new technologies, loves to do automation in today’s Agile world.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store