
Begin your hands-on DevOps journey with daily tasks across Linux, Git, Docker, Kubernetes, and ci/cd pipelines, building confidence, a portfolio, and certificates on completion.
Create a user named Mariam on AppServer1 with a non-interactive shell using useradd -s /sbin/nologin and verify the /etc/passwd entry.
Log in to app server three via ssh and create a temporary user with an expiry date using useradd -e. Confirm expiry with chage -L, showing Jan 28, 2024.
Disable direct ssh root login on all app servers in the Stratos data center by editing sshd_config to set permit root login to no and restarting sshd.
Day 4 of 100 days of DevOps: grant executable and read permissions to a script on AppServer 3 using chmod (a+x and a+rx), verify with ls -l, and run it.
Install core SELinux packages on a Red Hat system, including policy core utils and SELinux policy targeted, then disable SELinux and configure it to stay disabled after the next reboot.
Install the crony package on all app servers, start and enable the cron D service, and configure a root cron job to write hello to /tmp/cron_text every five minutes.
Enable passwordless ssh authentication from the Thor user on the jump host to app servers using rsa key pair generation and ssh-copy-id, then verify connections to app server 1–3.
Install Ansible 4.10.0 on a jump host with pip3, ensuring global accessibility for all users. Verify by checking the version and the global path to confirm system-wide availability.
Diagnose a Malia DB service failure by checking status with systemctl and journalctl, fix owner to mysql:mysql on /var/lib/mysql recursively, restart the service, and validate the connection.
Create a bash script on app server 2 that zips the static website, stores the archive in /backup, and copies it to the Nautilus backup server via passwordless SSH.
Install Tomcat on app server 2, set port 8082, copy root.var from jump host, deploy the war to Tomcat web apps, and verify base URL serves welcome page.
Troubleshoot linux network services by diagnosing apache not reachable on port 5002, adjust iptables and firewall rules, and validate connectivity from the jump host using curl and netstat.
Install iptables on all app servers and configure rules to block port 8082 for everyone except the load balancer host, with rules persisting after reboot.
Diagnose and fix the apache httpd service on multiple app servers by verifying connectivity, identifying port conflicts, stopping conflicting processes, and ensuring httpd runs on port 3003 across all hosts.
Install and configure Nginx on app server 1, deploy a self-signed ssl certificate and key, set permissions, create index.html, and verify https access from the jump host with curl.
Install and start nginx on load balancer, ensure Apache runs on all app servers, and configure nginx with an upstream of three app servers to proxy traffic to port 6300.
Configure a PostgreSQL server by creating a new user and database, granting full permissions, and verifying access via psql from the PostgreSQL user over ssh.
Install httpd on app server 3 and configure apache to listen on port 5001. Copy two site backups from jump host, move to /var/www/html, restart httpd, and verify with curl.
Configure nginx and php-fpm 8.3 on centos stream 9 using a unix socket, install remi repo, serve a php app on port 8097 with document root /var/www/html, tested via curl.
Set up a central git repository on the storage server by installing git with yum and creating a bare repository at /opt/news.git, ready for pushes and clones.
Clone a git repository to the specified directory on a storage server using the Natasha user, verify the target directory exists, and preserve the repository structure without modifying the original.
Fork a git repository using the Gitty UI by signing in as John and forking Sarah/story-block under John’s account. Record steps with screenshots and Loom to share task completion.
Create a new feature branch from the master branch using git on the storage server, handling ownership issues, switching to master, and validating the new branch is active.
Create a new data center branch from master, copy index.html into the repo, commit, merge into master, and push both branches to origin.
Learn how to manage git remotes by adding a new remote dev_apps, copying index.html into the repo, committing on master, and pushing to the new remote for streamlined collaboration.
Learners learn to revert the latest commit using git revert head, preserving history by creating a new undo commit and returning the code to the previous commit.
Master the git cherry-pick workflow by selecting a single commit from the feature branch (update info.txt with hash 3C13712) and applying it to master, then push to origin.
Learn to manage a git pull request by inspecting a clone, reviewing commits on the story/fox and grapes branch, and merging into master via GT UI with Tom as reviewer.
Reset the git history to keep only the initial commit and add data.txt using git reset --hard. Then push the cleaned history to the remote with git push --force.
Learn to restore a specific git stash by listing stashes and applying stash@{1}, then commit and push the restored changes to origin master after logging into the storage server.
Rebase the feature branch onto master to create a clean, linear history without a merge commit, then force-push the rebased feature branch to update the remote.
Resolve git merge conflicts by pulling from origin master, editing story index.txt to include four story titles and fix the moose typo to mouse, then push to origin master.
Install Docker CE and Docker Compose on AppServer3, start and enable the Docker service, and verify the daemon is running on a CentOS Stream system.
Deploy an nginx container on application server 3 using the nginx:alpine image, create and run a detached container named nginx_3, and verify it is running via logs.
Copy an encrypted file from the docker host to the Ubuntu latest container using docker cp, preserving ownership and content. Verify the copy by listing /home with docker exec.
Pull the BusyBox MUSL image on AppServer 1 in Stardust DC, then retag it as BusyBox blog, and verify the new tag with docker images.
Create a new docker image named blog execution from the running ubuntu latest container on app server two using docker commit. Verify the image with docker images.
Install Apache 2 inside KK cloud container on app server 3, then set port 5003 in ports.conf and 000-default.conf, restart and verify Apache is running while keeping the container running.
Create a dockerfile from ubuntu 24.04, install apache 2, and configure it to listen on port 5004 by updating ports.conf and 000-default.conf. Run apache in the foreground for stable container.
Create a docker network named ecommerce using the macvlan driver on app server one, with a defined subnet and ip range. Verify with docker network ls and inspect.
Pull the nginx stable image on app server 2, run a detached container named official, and map host port 6100 to container port 80, then verify with docker ps.
Create a docker compose file to deploy an httpd container named httpd, map host port 5004 to container port 80, and mount a read-only host volume for static content.
Fix and validate a dockerfile by replacing image with from, converting add to run, correcting httpd.conf paths, and ensuring certs and index.html are copied before building the image.
Deploy two services with Docker Compose: a PHP Apache web container on host port 8084 and a MariaDB db container with volumes and environment variables.
Dockerize a Python app, build the Nautilus/python app image, and deploy on app server one by running a container that maps host 8092 to container 3003, then test with curl.
Create a Kubernetes pod using a manifest to deploy an HTTPT container with the latest image, label it HTTPT app, and verify the pod with kubectl on the jump host.
Create a Kubernetes nginx deployment from a manifest, specify the image nginx latest, set two replicas, and ensure the pod template labels app nginx match the selector.
Configure resource requests and limits for a Kubernetes pod using HttpdPod and HttpdContainer with the latest Httpd image. Apply the YAML and verify the pod via kubectl.
Execute rolling updates in Kubernetes by updating nginx deployment image from 1.16 to 1.19 using kubectl set image, watching rollout status to ensure all pods remain operational.
Rollback nginx-deployment to the previous revision using kubectl rollout undo, verify history and rollout status, and complete a rolling revert to the prior image.
Resolve a Kubernetes nginx and php-fpm issue by aligning the shared volume mounts to /var/www/html, updating the pod, and recreating it, then copy index.php to /var/www/html to restore the site.
Learn how to configure a Kubernetes pod with two containers sharing an emptyDir volume, mount it at separate paths, and validate cross-container file visibility.
Implement the sidecar pattern in a Kubernetes pod by running an Nginx server and a log-shipping sidecar that share an emptyDir volume at /bar/log/nginx to ship access and error logs.
Deploy a nginx web server on Kubernetes by creating a deployment named nginx-deployment with three replicas using the nginx-latest image, and expose it via a nodeport service on port 30011.
Create a Kubernetes pod named print envars greeting, configure a Bash container with three environment variables greeting=welcome to, company=status, and group=industries, and print them via a shell command.
Deploy Grafana on Kubernetes by creating a Grafana deployment XFusion and a NodePort service exposing port 32000 to container port 2000; verify the default Grafana login page is accessible.
Diagnose and fix a failing Redis deployment in Kubernetes by inspecting deployment and pods, correcting the image to Alpine and the config map to Redis config, then roll out changes.
create and bind a persistent volume pv-nautilus to a pvc-nautilus, deploy a pod-nautilus using the httpd image, and expose it with a node port service web-nautilus on port 30008.
Discover how init containers run first in Kubernetes, write to a shared volume, and allow the main container to read the file, via a yaml deployment workflow.
Create a generic Kubernetes secret named official from /opt/official.txt, mount it as a read-only file at /opt/games in an Ubuntu pod, and verify access via kubectl exec.
Deploy a two-tiered iron gallery app on kubernetes with a frontend and irondb backend in the iron namespace Nautilus; expose database via cluster IP and gallery via node port.
Troubleshoot and fix a Kubernetes deployment and service by correcting the container image, aligning the service target port to 5000, and validating access via the node port.
Deploy Redis on Kubernetes with RedisAlpine, one replica, and a one cpu RedisContainer; configure MyRedisConfig with RedisConfig max memory 2 MB, mount data and config, expose 6379.
Deploy MySQL on Kubernetes by creating a pv and pvc, mounting at /var/lib/mysql, deploying a MySQL 8.0 image, and exposing via node port 30007 with secrets and env vars.
Deploy a two-tier guest book app on Kubernetes by creating Redis master and slave deployments with services, and a front-end deployment exposed via a node port, in one yaml.
Install Jenkins, a popular ci cd open source tool, on a Red Hat based system via yum, install Java 21, start the service, and create the initial admin user.
Learn to install Git and GitLab plugins in Jenkins, manage plugins via the settings page, and restart Jenkins after installation to verify the plugins are active.
Configure Jenkins access using the project-based metrics authorization strategy: create John, grant overall and job-level read permissions, install the metrics plugin, and verify read-only access.
Are you ready to transform your career and become a job-ready DevOps Engineer? The "100 Days of DevOps" challenge at KodeKloud has already helped thousands of students move from theory to practice by committing to one hour of hands-on learning every day. Now, we are taking that experience to the next level.
This brand-new course is the ultimate companion to the challenge, designed to ensure you never get stuck. While the original challenge provides the tasks, this course delivers the solutions. Over the span of 100 days, you will follow expert-led demo videos that walk you through every single real-life project and micro-task contained in the challenge.
You won’t just be watching; you will be doing. We cover the entire DevOps lifecycle, diving deep into the tools that modern teams actually use—including Linux, Git, Docker, Kubernetes, Jenkins, Terraform, Prometheus, and Ansible. Whether you are troubleshooting a broken pipeline, deploying a multi-node cluster, or automating infrastructure, our instructors are with you every step of the way.
Forget about tutorial hell. This course focuses on "doing." By the end, you won't just have knowledge; you will have a public portfolio of 100 solved problems to show potential employers. Join us to build the muscle memory, confidence, and practical skills required to ace your DevOps interviews and succeed on day one of your new job.