From ffc8def4df488c45aed734df6c86e5f970dfe9ce Mon Sep 17 00:00:00 2001 From: RishikeshOps Date: Tue, 17 Jan 2023 14:51:16 +0530 Subject: [PATCH 001/394] Update tasks.md --- 2023/day17/tasks.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/2023/day17/tasks.md b/2023/day17/tasks.md index e69de29bb2..3bedd2c26c 100644 --- a/2023/day17/tasks.md +++ b/2023/day17/tasks.md @@ -0,0 +1,30 @@ +## Day 17 Task: Docker Project for DevOps Engineers. + +# You people are doing amezing in **90daysofdevops**. Today's challange is so special Because You are going to do DevOps project today with Docker. Are You Exited 😍 + +# Dockerfile + +Docker is a tool that makes it easy to run applications in containers. Containers are like small packages that hold everything an application needs to run. To create these containers, developers use something called a Dockerfile. + +A Dockerfile is like a set of instructions for making a container. It tells Docker what base image to use, what commands to run, and what files to include. For example, if you were making a container for a website, the Dockerfile might tell Docker to use an official web server image, copy the files for your website into the container, and start the web server when the container starts. + +For more about Dockerfile visit [here](https://rushikesh-mashidkar.hashnode.dev/dockerfile-docker-compose-swarm-and-volumes) + +task: + +- Create a Dockerfile for a simple web application (e.g. a Node.js or Python app) + +- Build the image using the Dockerfile and run the container + +- Verify that the application is working as expected by accessing it in a web browser + +- Push the image to a public or private repository (e.g. Docker Hub ) + +For Refference Project visit [here](https://youtu.be/Tevxhn6Odc8) + +If you want to dive further, Watch [bootcamp](https://youtube.com/playlist?list=PLlfy9GnSVerRqYJgVYO0UiExj5byjrW8u) + +You can share the learning with everyone over linkedin and tag us along 😃 + +Happy Learning:) + From 81d8ea091e3c3c3906613434143b46cfaa1bea7b Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Tue, 17 Jan 2023 18:38:04 +0530 Subject: [PATCH 002/394] Update tasks.md --- 2023/day17/tasks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2023/day17/tasks.md b/2023/day17/tasks.md index 3bedd2c26c..5a28f4b826 100644 --- a/2023/day17/tasks.md +++ b/2023/day17/tasks.md @@ -1,6 +1,6 @@ ## Day 17 Task: Docker Project for DevOps Engineers. -# You people are doing amezing in **90daysofdevops**. Today's challange is so special Because You are going to do DevOps project today with Docker. Are You Exited 😍 +### You people are doing just amazing in **#90daysofdevops**. Today's challenge is so special Because You are going to do DevOps project today with Docker. Are You Exited 😍 # Dockerfile From bab412bdead0d7197da24d0b48b1c7d118613176 Mon Sep 17 00:00:00 2001 From: RishikeshOps Date: Wed, 18 Jan 2023 10:49:44 +0530 Subject: [PATCH 003/394] Create docker-compose.yaml --- 2023/day18/docker-compose.yaml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 2023/day18/docker-compose.yaml diff --git a/2023/day18/docker-compose.yaml b/2023/day18/docker-compose.yaml new file mode 100644 index 0000000000..b11a5f4a43 --- /dev/null +++ b/2023/day18/docker-compose.yaml @@ -0,0 +1,12 @@ +version : "3.3" +services: + web: + image: nginx:latest + ports: + - "80:80" + db: + image: mysql + ports: + - "3306:3306" + environment: + - "MYSQL_ROOT_PASSWORD=test@123" From 216a60a69a9a7d69c09a437c26406a1a00b8eca4 Mon Sep 17 00:00:00 2001 From: Varsha Verma <55032759+Varsha-Verma@users.noreply.github.com> Date: Wed, 18 Jan 2023 11:17:42 +0530 Subject: [PATCH 004/394] Update tasks.md --- 2023/day18/tasks.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/2023/day18/tasks.md b/2023/day18/tasks.md index e69de29bb2..a9ce7fd71b 100644 --- a/2023/day18/tasks.md +++ b/2023/day18/tasks.md @@ -0,0 +1,38 @@ +# Day 18 Task: Docker for DevOps Engineers + +Till now you have created Docker file and pushed it to the Repository. Let's move forward and dig more on other Docker concepts. +Aj thodi padhai krte hai on Docker Compose 😃 + +## Docker Compose +- Docker Compose is a tool that was developed to help define and share multi-container applications. +- With Compose, we can create a YAML file to define the services and with a single command, can spin everything up or tear it all down. +- Learn more about docker-compose [visit here](https://tecadmin.net/tutorial/docker/docker-compose/) + +## What is YAML? +- YAML is a data serialization language that is often used for writing configuration files. Depending on whom you ask, YAML stands for yet another markup language or YAML ain’t markup language (a recursive acronym), which emphasizes that YAML is for data, not documents. +- YAML is a popular programming language because it is human-readable and easy to understand. +- YAML files use a .yml or .yaml extension. +- Read more about it [here](https://www.redhat.com/en/topics/automation/what-is-yaml) + +## Task-1 + +Learn how to use the docker-compose.yml file, to set up the environment, configure the services and links between different containers, and also to use environment variables in the docker-compose.yml file. + +[Sample docker-compose.yaml file](https://github.com/LondheShubham153/90DaysOfDevOps/blob/master/2023/day18/docker-compose.yaml) + + +## Task-2 +- Pull a pre-existing Docker image from a public repository (e.g. Docker Hub) and run it on your local machine. Run the container as a non-root user (Hint- Use `usermod ` command to give user permission to docker). Make sure you reboot instance after giving permission to user. +- Inspect the container's running processes and exposed ports using the docker inspect command. +- Use the docker logs command to view the container's log output. +- Use the docker stop and docker start commands to stop and start the container. +- Use the docker rm command to remove the container when you're done. + +## How to run Docker commands without sudo? +- Make sure docker is installed and system is updated (This is already been completed as a part of previous tasks): +- sudo usermod -a -G docker $USER +- Reboot the machine. + +For reference you can watch this [video](https://youtu.be/Tevxhn6Odc8) + +You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. Happy Learning :) From 95e18a5608c8eec60fa174b5c3cbf3147a842eb6 Mon Sep 17 00:00:00 2001 From: Sitabja Chatterjee <89836369+sitchatt@users.noreply.github.com> Date: Thu, 19 Jan 2023 20:00:02 +0530 Subject: [PATCH 005/394] Update tasks.md --- 2023/day19/tasks.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/2023/day19/tasks.md b/2023/day19/tasks.md index e69de29bb2..4586aa54e2 100644 --- a/2023/day19/tasks.md +++ b/2023/day19/tasks.md @@ -0,0 +1,33 @@ +# Day 19 Task: Docker for DevOps Engineers + +**Till now you have learned how to create docker-compose.yml file and pushed it to the Repository. Let's move forward and dig more on other Docker-compose.yml concepts.** +**Aaj thodi padhai krte hai on Docker Volume & Docker Network** 😃 + +# Docker-Volume +Docker allows you to create something called volumes. Volumes are like separate storage areas that can be accessed by containers. They allow you to store data, like a database, outside the container, so it doesn't get deleted when the container is deleted. +You can also mount from the same volume and create more containers having same data. +[reference](https://docs.docker.com/storage/volumes/) + +# Docker Network +Docker allows you to create virtual spaces called networks, where you can connect multiple containers (small packages that hold all the necessary files for a specific application to run) together. This way, the containers can communicate with each other and with the host machine (the computer on which the Docker is installed). +When we run a container, it has its own storage space that is only accessible by that specific container. If we want to share that storage space with other containers, we can't do that. [reference](https://docs.docker.com/network/) + + +## Task-1 +- Create a multi-container docker-compose file which will bring *UP* and bring *DOWN* containers in a single shot ( Example - Create application and database container ) + +*hints:* +- Use the `docker-compose up` command with the `-d` flag to start a multi-container application in detached mode. +- Use the `docker-compose scale` command to increase or decrease the number of replicas for a specific service. You can also add [`replicas`](https://stackoverflow.com/questions/63408708/how-to-scale-from-within-docker-compose-file) in deployment file for *auto-scaling*. +- Use the `docker-compose ps` command to view the status of all containers, and `docker-compose logs` to view the logs of a specific service. +- Use the `docker-compose down` command to stop and remove all containers, networks, and volumes associated with the application + +## Task-2 +- Learn how to use Docker Volumes and Named Volumes to share files and directories between multiple containers. +- Create two or more containers that read and write data to the same volume using the `docker run --mount` command. +- Verify that the data is the same in all containers by using the docker exec command to run commands inside each container. +- Use the docker volume ls command to list all volumes and docker volume rm command to remove the volume when you're done. + +## You can use this task as *Project* to add in your resume. + +You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. Happy Learning :) From 681e152e493acb1ed89d3fb0fb4348d91725a6c9 Mon Sep 17 00:00:00 2001 From: Sitabja Chatterjee <89836369+sitchatt@users.noreply.github.com> Date: Fri, 20 Jan 2023 00:05:12 +0530 Subject: [PATCH 006/394] Create sample_project_deployment.yaml --- 2023/day19/sample_project_deployment.yaml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 2023/day19/sample_project_deployment.yaml diff --git a/2023/day19/sample_project_deployment.yaml b/2023/day19/sample_project_deployment.yaml new file mode 100644 index 0000000000..821be80f2b --- /dev/null +++ b/2023/day19/sample_project_deployment.yaml @@ -0,0 +1,20 @@ +version : "3.3" +services: + web: + image: varsha0108/local_django:latest + deploy: + replicas: 2 + ports: + - "8001-8005:8001" + volumes: + - my_django_volume:/app + db: + image: mysql + ports: + - "3306:3306" + environment: + - "MYSQL_ROOT_PASSWORD=test@123" +volumes: + my_django_volume: + external: true + From 3789b5dd6fb2dc6129e2fe7597dec140c23521d5 Mon Sep 17 00:00:00 2001 From: RishikeshOps Date: Fri, 20 Jan 2023 17:38:38 +0530 Subject: [PATCH 007/394] Update tasks.md --- 2023/day20/tasks.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/2023/day20/tasks.md b/2023/day20/tasks.md index e69de29bb2..3ceb56b06b 100644 --- a/2023/day20/tasks.md +++ b/2023/day20/tasks.md @@ -0,0 +1,16 @@ +## Finally!! 🎉 +You have completed✅ the Docker handson and I hope you have learned something interesting from it.🙌 + +Now it's time to take your Docker skills to the next level by creating a comprehensive cheat-sheet of all the commands you've learned so far. This cheat-sheet should include commands for both Docker and Docker-Compose, as well as brief explanations of their usage. +This cheat-sheet will not only help you in the future but also contribute to the DevOps community by providing a useful resource for others.😊🙌 + + +So, put your knowledge and creativity to the test and create a cheat-sheet that truly stands out! 🚀 + +*I have added a [cheatsheet](https://cdn.hashnode.com/res/hashnode/image/upload/v1670863735841/r6xdXpsap.png?auto=compress,format&format=webp) for your reference, Make sure every cheatsheet must be UNIQUE* + +Post it on Linkedin and Spread the knowledge.😃 + +**Happy Learning :)** + + From e14517e9e7498d37299864999e3394f21fd1ebca Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Sat, 21 Jan 2023 18:24:47 +0530 Subject: [PATCH 008/394] Added docker interview questions --- 2023/day21/tasks.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/2023/day21/tasks.md b/2023/day21/tasks.md index e69de29bb2..d841d40367 100644 --- a/2023/day21/tasks.md +++ b/2023/day21/tasks.md @@ -0,0 +1,40 @@ +## Day 21 Task: Docker Important interview Questions. + + +## Docker Interview + Docker is a good topic to ask in DevOps Engineer Interviews, mostly for freshers. + One must surely try these questions in order to be better in Docker + +## Questions + + +- What is the Difference between an Image, Container and Engine? +- What is the Difference between the Docker command COPY vs ADD? +- What is the Difference between the Docker command CMD vs RUN? +- How Will you reduce the size of the Docker image? +- Why and when to use Docker? +- Explain the Docker components and how they interact with each other. +- Explain the terminology: Docker Compose, Docker File, Docker Image, Docker Container? +- In what real scenarios have you used Docker? +- Docker vs Hypervisor? +- What are the advantages and disadvantages of using docker? +- What is a Docker namespace? +- What is a Docker registry? +- What is an entry point? +- How to implement CI/CD in Docker? +- Will data on the container be lost when the docker container exits? +- What is a Docker swarm? +- What are the docker commands for the following: + - view running containers + - command to run the container under a specific name + - command to export a docker + - command to import an already existing docker image + - commands to delete a container + - command to remove all stopped containers, unused networks, build caches, and dangling images? +- What are the common docker practices to reduce the size of Docker Image? + + +These questions will help you in your next DevOps Interview. +*Write a Blog and share it on LinkedIn.* + +**Happy Learning :)** From d7e9950029889a7d4e46e833c8b5ae22ade2ee0c Mon Sep 17 00:00:00 2001 From: Varsha Verma <55032759+Varsha-Verma@users.noreply.github.com> Date: Sun, 22 Jan 2023 00:08:53 +0530 Subject: [PATCH 009/394] Update tasks.md --- 2023/day22/tasks.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/2023/day22/tasks.md b/2023/day22/tasks.md index e69de29bb2..b8c3b57001 100644 --- a/2023/day22/tasks.md +++ b/2023/day22/tasks.md @@ -0,0 +1,28 @@ +# Day-22 : Getting Started with Jenkins 😃 + +**Linux, Git, Git-Hub, Docker finish ho chuka hai to chaliye seekhte hai inko deploy krne ke lye CI-CD tool:** + +## What is Jenkins? +- Jenkins is an open source continuous integration-continuous delivery and deployment (CI/CD) automation software DevOps tool written in the Java programming language. It is used to implement CI/CD workflows, called pipelines. + +- Jenkins is a tool that is used for automation, and it is an open-source server that allows all the developers to build, test and deploy software. It works or runs on java as it is written in java. By using Jenkins we can make a continuous integration of projects(jobs) or end-to-endpoint automation. + +- Jenkins achieves Continuous Integration with the help of plugins. Plugins allow the integration of Various DevOps stages. If you want to integrate a particular tool, you need to install the plugins for that tool. For example Git, Maven 2 project, Amazon EC2, HTML publisher etc. + +**Let us do discuss the necessity of this tool before going ahead to the procedural part for installation:** +- Nowadays, humans are becoming lazy😴 day by day so even having digital screens and just one click button in front of us then also need some automation. + +- Here, I’m referring to that part of automation where we need not have to look upon a process(here called a job) for completion and after it doing another job. For that, we have Jenkins with us. + +Note: By now Jenkins should be installed on your machine(as it was a part of previous tasks, if not follow [Installation Guide](https://youtu.be/OkVtBKqMt7I)) + + +## Tasks: + +**1. What you understood in Jenkin, write a small article in your own words (Don't copy from Internet Directly)** + +**2.Create a freestyle pipeline to print "Hello World!!** +Hint: Use link for [Article](https://www.geeksforgeeks.org/what-is-jenkins) + +Don't forget to post your progress on Linkedin. Till then Happy learning :) + From a11d63c57ff5ff27aafe641da7778b9a1630060f Mon Sep 17 00:00:00 2001 From: RishikeshOps Date: Mon, 23 Jan 2023 02:31:01 +0530 Subject: [PATCH 010/394] Update tasks.md --- 2023/day23/tasks.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/2023/day23/tasks.md b/2023/day23/tasks.md index e69de29bb2..6aa374568f 100644 --- a/2023/day23/tasks.md +++ b/2023/day23/tasks.md @@ -0,0 +1,36 @@ +# Day 23 Task: Jenkins Freestyle Project for DevOps Engineers. + + The Community is absolutely crushing it in the #90daysofdevops journey. Today's challenge is particularly exciting as it entails creating a Jenkins Freestyle Project, an opportunity for DevOps engineers to showcase their skills and push their limits. Who's ready to dive in and make it happen? 😍 + +## What is CI/CD? +- CI or Continuous Integration is the practice of automating the integration of code changes from multiple developers into a single codebase. It is a software development practice where the developers commit their work frequently into the central code repository (Github or Stash). Then there are automated tools that build the newly committed code and do a code review, etc as required upon integration. + The key goals of Continuous Integration are to find and address bugs quicker, make the process of integrating code across a team of developers easier, improve software quality and reduce the time it takes to release new feature updates. + + +- CD or Continuous Delivery is carried out after Continuous Integration to make sure that we can release new changes to our customers quickly in an error-free way. This includes running integration and regression tests in the staging area (similar to the production environment) so that the final release is not broken in production. It ensures to automate the release process so that we have a release-ready product at all times and we can deploy our application at any point in time. + +## What Is a Build Job? +A Jenkins build job contains the configuration for automating a specific task or step in the application building process. These tasks include gathering dependencies, compiling, archiving, or transforming code, and testing and deploying code in different environments. + +Jenkins supports several types of build jobs, such as freestyle projects, pipelines, multi-configuration projects, folders, multibranch pipelines, and organization folders. + +## What is Freestyle Projects ?? 🤔 +A freestyle project in Jenkins is a type of project that allows you to build, test, and deploy software using a variety of different options and configurations. Here are a few tasks that you could complete when working with a freestyle project in Jenkins: + + +# Task-01 +- create a agent for your app. ( which you deployed from docker in earlier task) +- Create a new Jenkins freestyle project for your app. +- In the "Build" section of the project, add a build step to run the "docker build" command to build the image for the container. +- Add a second step to run the "docker run" command to start a container using the image created in step 3. + + +# Task-02 +- Create Jenkins project to run "docker-compose up -d" command to start the multiple containers defined in the compose file (Hint- use day-19 Application & Database docker-compose file) +- Set up a cleanup step in the Jenkins project to run "docker-compose down" command to stop and remove the containers defined in the compose file. + +For Refference jenkins Freestyle Project visit [here](https://youtu.be/wwNWgG5htxs) + +You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. + +Happy Learning:) From cf2842fd9b5b6b98931e108a77b68df60372f713 Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Tue, 24 Jan 2023 18:31:05 +0530 Subject: [PATCH 011/394] added day 24 task --- 2023/day24/tasks.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/2023/day24/tasks.md b/2023/day24/tasks.md index e69de29bb2..b4dec6cccc 100644 --- a/2023/day24/tasks.md +++ b/2023/day24/tasks.md @@ -0,0 +1,37 @@ + +# Day 24 Task: Complete Jenkins CI/CD Project + + + +Let's make a beautiful CI/CD Pipeline for your Node JS Application 😍 + + + +## Did you finish Day 23? + +- Day 23 was all about Jenkins CI/CD, make sure you have done it and understood the concepts. As today You will be doing one Project End to End and adding it to your resume :) + +- As you have worked with Docker and Docker compose, it will be good to use it in a live project. + + +# Task-01 + +- Fork [this](https://github.com/LondheShubham153/node-todo-cicd.git) repository: +- Create a connection to your Jenkins job and your GitHub Repository via GitHub Integration. +- Read About [GitHub WebHooks](https://betterprogramming.pub/how-too-add-github-webhook-to-a-jenkins-pipeline-62b0be84e006) and make sure you have CICD setup +- Refer [this](https://youtu.be/nplH3BzKHPk) video for the entire project + +# Task-02 + - In the Execute shell run the application using Docker compose + - You will have to make a Docker Compose file for this Project (Can be a good open source contribution) + - Run the project and give yourself a treat:) + +For Reference and entire hands-on Project visit [here](https://youtu.be/nplH3BzKHPk) + + + +You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. + + + +Happy Learning:) \ No newline at end of file From 33933812ef2fd6170c2df7cc4f0e91d9a072ee5f Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Wed, 25 Jan 2023 12:03:39 +0530 Subject: [PATCH 012/394] added day 25 --- 2023/day25/tasks.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/2023/day25/tasks.md b/2023/day25/tasks.md index e69de29bb2..2a8e3a513a 100644 --- a/2023/day25/tasks.md +++ b/2023/day25/tasks.md @@ -0,0 +1,31 @@ + +# Day 25 Task: Complete Jenkins CI/CD Project - Continued + + + +I can imagine catching up will be tough so take a small breather today and complete the Jenkins CI/CD project from Day 24. + + + +## Did you finish Day 24? + +- Day 24 will give you an End to End project and adding it to your resume will be a cherry on the top + +- take more time, finish the project and post about it today. + + +# Task-01 + +- Also it's important to keep smaller goals, as its a day-off, a small break, think of a small Goal you can accomplish. +- Write about it using [this template](https://www.linkedin.com/posts/shubhamlondhe1996_taking-resolutions-and-having-goals-for-an-activity-7023858409762373632-s2J8?utm_source=share&utm_medium=member_desktop) +- Have small goals and strategies to achieve them. + +For Reference and entire hands-on Project visit [here](https://youtu.be/nplH3BzKHPk) + + + +You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. + + + +Happy Learning:) \ No newline at end of file From d7ec53bd03e84f78b50269b01b56fd6a6df792ad Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Wed, 25 Jan 2023 13:56:39 +0530 Subject: [PATCH 013/394] added day 25 --- 2023/day25/tasks.md | 48 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/2023/day25/tasks.md b/2023/day25/tasks.md index 2a8e3a513a..968407ac53 100644 --- a/2023/day25/tasks.md +++ b/2023/day25/tasks.md @@ -1,31 +1,67 @@ -# Day 25 Task: Complete Jenkins CI/CD Project - Continued + + +# Day 25 Task: Complete Jenkins CI/CD Project - Continued with Documentation -I can imagine catching up will be tough so take a small breather today and complete the Jenkins CI/CD project from Day 24. + + +I can imagine catching up will be tough so take a small breather today and complete the Jenkins CI/CD project from Day 24 and add a documentation. + + ## Did you finish Day 24? -- Day 24 will give you an End to End project and adding it to your resume will be a cherry on the top -- take more time, finish the project and post about it today. + +- Day 24 will give you an End to End project and adding it to your resume will be a cherry on the top. + +- take more time, finish the project, add a Documentation, add it to your Resume and post about it today. + # Task-01 -- Also it's important to keep smaller goals, as its a day-off, a small break, think of a small Goal you can accomplish. + + +- Document the process from cloning the repository to adding webhooks, and Deployment, etc. as a README , go through [this example](https://github.com/LondheShubham153/fynd-my-movie/blob/master/README.md) + + + +- A well written readme file will help others to understand your project and you will understand how to use the project again without any problems. + + + + +# Task-02 + + + +- Also it's important to keep smaller goals, as its a small task, think of a small Goal you can accomplish. + + + - Write about it using [this template](https://www.linkedin.com/posts/shubhamlondhe1996_taking-resolutions-and-having-goals-for-an-activity-7023858409762373632-s2J8?utm_source=share&utm_medium=member_desktop) -- Have small goals and strategies to achieve them. + + + +- Have small goals and strategies to achieve them, also have a small reward for yourself. + + For Reference and entire hands-on Project visit [here](https://youtu.be/nplH3BzKHPk) + + You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. + + Happy Learning:) \ No newline at end of file From 455a63f48793995af24c272190eb3b05bc66ff69 Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Thu, 26 Jan 2023 23:14:24 +0530 Subject: [PATCH 014/394] added day 26 --- 2023/day26/tasks.md | 63 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/2023/day26/tasks.md b/2023/day26/tasks.md index e69de29bb2..4679283bc5 100644 --- a/2023/day26/tasks.md +++ b/2023/day26/tasks.md @@ -0,0 +1,63 @@ +# Day 26 Task: Jenkins Declarative Pipeline + + +One of the most important parts of your DevOps and CICD journey is a Declarative Pipeline Syntax of Jenkins + + +## Some terms for your Knowledge + +**What is Pipeline -** A pipeline is a collection of steps or jobs interlinked in a sequence. + +**Declarative:** Declarative is a more recent and advanced implementation of a pipeline as a code. + +**Scripted:** Scripted was the first and most traditional implementation of the pipeline as a code in Jenkins. It was designed as a general-purpose DSL (Domain Specific Language) built with Groovy. + +# Why you should have a Pipeline + +The definition of a Jenkins Pipeline is written into a text file (called a [`Jenkinsfile`](https://www.jenkins.io/doc/book/pipeline/jenkinsfile)) which in turn can be committed to a project’s source control repository. +This is the foundation of "Pipeline-as-code"; treating the CD pipeline as a part of the application to be versioned and reviewed like any other code. + +**Creating a `Jenkinsfile` and committing it to source control provides a number of immediate benefits:** + +- Automatically creates a Pipeline build process for all branches and pull requests. + +- Code review/iteration on the Pipeline (along with the remaining source code). + + +# Pipeline syntax + +````groovy +pipeline { + agent any + stages { + stage('Build') { + steps { + // + } + } + stage('Test') { + steps { + // + } + } + stage('Deploy') { + steps { + // + } + } + } +} +```` + + +# Task-01 + +- Create a New Job, this time select Pipeline instead of Freestyle Project. +- Follow the Official Jenkins [Hello world example](https://www.jenkins.io/doc/pipeline/tour/hello-world/) +- Complete the example using the Declarative pipeline +- In case of any issues feel free to post on any Groups, [Discord](https://discord.gg/Q6ntmMtH) or [Telegram](https://t.me/trainwithshubham) + +You can post your progress on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challenge. + + +Happy Learning:) \ No newline at end of file From 767b125686dcce00f31fc52148fe3e89f5b51833 Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Fri, 27 Jan 2023 20:56:08 +0530 Subject: [PATCH 015/394] Added day 27 --- 2023/day27/tasks.md | 59 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/2023/day27/tasks.md b/2023/day27/tasks.md index e69de29bb2..9af724ba30 100644 --- a/2023/day27/tasks.md +++ b/2023/day27/tasks.md @@ -0,0 +1,59 @@ + +# Day 27 Task: Jenkins Declarative Pipeline with Docker + + + +Day 26 was all about a Declarative pipeline, now its time to level up things, let's integrate Docker and your Jenkins declarative pipeline + + + +## Use your Docker Build and Run Knowledge + + + +**docker build -** you can use `sh 'docker build . -t ' ` in your pipeline stage block to run the docker build command. (Make sure you have docker installed with correct permissions. + + + +**docker run:** you can use `sh 'docker run -d '` in your pipeline stage block to build the container. + + + +**How will the stages look** +````groovy +stages { + stage('Build') { + steps { + sh 'docker build -t trainwithshubham/django-app:latest' + } + } + } +```` + + + + +# Task-01 + + + +- Create a docker-integrated Jenkins declarative pipeline +- Use the above-given syntax using `sh` inside the stage block +- You will face errors in case of running a job twice, as the docker container will be already created, so for that do task 2 + +# Task-02 + + + +- Create a docker-integrated Jenkins declarative pipeline using the `docker` groovy syntax inside the stage block. +- You won't face errors, you can Follow [this documentation](https://tempora-mutantur.github.io/jenkins.io/github_pages_test/doc/book/pipeline/docker/) + +- Complete your previous projects using this Declarative pipeline approach + +- In case of any issues feel free to post on any Groups, [Discord](https://discord.gg/Q6ntmMtH) or [Telegram](https://t.me/trainwithshubham) + +Are you enjoying the #90DaysOfDevOps Challenge? +Let me know how are feeling after 4 weeks of DevOps Learnings, + + +Happy Learning:) \ No newline at end of file From d8db96c28173e8a273f302437234fddf6cc55bbd Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Sat, 28 Jan 2023 21:42:28 +0530 Subject: [PATCH 016/394] added day 28 --- 2023/day28/tasks.md | 57 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/2023/day28/tasks.md b/2023/day28/tasks.md index e69de29bb2..4de3715dd7 100644 --- a/2023/day28/tasks.md +++ b/2023/day28/tasks.md @@ -0,0 +1,57 @@ + + + +# Day 28 Task: Jenkins Agents + + + + + +An agent is typically a machine or container that connects to a Jenkins master and is designed to perform the tasks when directed by the master. + + + +A single, monolithic Jenkins installation can work great for a small team with a relatively small number of projects. As your needs grow, however, it often becomes necessary to scale up. Jenkins provides a way to do this called “master to agent connection.” Instead of serving the Jenkins UI and running build jobs all on a single system, you can provide Jenkins with agents to handle the execution of jobs while the master serves the Jenkins UI and acts as a control node. + + + +# Task-01 + + + + + +- Create an agent by setting up a node on Jenkins + +- Create a new AWS EC2 Instance and connect it to master(Where Jenkins is installed) + +- The connection of master and agent requires SSH and the public-private key pair exchange + +- You can follow [this article](https://www.linkedin.com/posts/chetanrakhra_devops-project-share-activity-7017885886461698048-os5f?utm_source=share&utm_medium=member_android) for the same + + + +# Task-02 + + + + + +- Run your previous Jobs (which you built on Day 26, and Day 27) on the new agent + +- Use labels for the agent, your master server should trigger builds for the agent server. + + + +- In case of any issues feel free to post on any Groups, [Discord](https://discord.gg/Q6ntmMtH) or [Telegram](https://t.me/trainwithshubham) + + + +Are you enjoying the #90DaysOfDevOps Challenge? + +Let me know how are feeling after 4 weeks of DevOps Learning. + + + + +Happy Learning:) \ No newline at end of file From 608bb260c31d5045c75b814f4666907051823cd3 Mon Sep 17 00:00:00 2001 From: RishikeshOps Date: Sat, 28 Jan 2023 22:06:07 +0530 Subject: [PATCH 017/394] Update tasks.md --- 2023/day28/tasks.md | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/2023/day28/tasks.md b/2023/day28/tasks.md index 4de3715dd7..8964c5066d 100644 --- a/2023/day28/tasks.md +++ b/2023/day28/tasks.md @@ -1,19 +1,25 @@ - - - # Day 28 Task: Jenkins Agents - - +# Jenkins Master (Server) +Jenkins’s server or master node holds all key configurations. Jenkins master server is like a control server that orchestrates all the workflow defined in the pipelines. For example, scheduling a job, monitoring the jobs, etc. -An agent is typically a machine or container that connects to a Jenkins master and is designed to perform the tasks when directed by the master. +# Jenkins Agent +An agent is typically a machine or container that connects to a Jenkins master and this agent that actually execute all the steps mentioned in a Job. When you create a Jenkins job, you have to assign an agent to it. Every agent has a label as a unique identifier. - +When you trigger a Jenkins job from the master, the actual execution happens on the agent node that is configured in the job. A single, monolithic Jenkins installation can work great for a small team with a relatively small number of projects. As your needs grow, however, it often becomes necessary to scale up. Jenkins provides a way to do this called “master to agent connection.” Instead of serving the Jenkins UI and running build jobs all on a single system, you can provide Jenkins with agents to handle the execution of jobs while the master serves the Jenkins UI and acts as a control node. - +

+ +## Pre-requisites +Let’s say we’re starting with a fresh Ubuntu 22.04 Linux installation. To get an agent working make sure you install Java ( same version as jenkins master server ) and Docker on it. + +` +Note:- +While creating an agent, be sure to separate rights, permissions, and ownership for jenkins users. +` # Task-01 @@ -25,7 +31,8 @@ A single, monolithic Jenkins installation can work great for a small team with a - Create a new AWS EC2 Instance and connect it to master(Where Jenkins is installed) -- The connection of master and agent requires SSH and the public-private key pair exchange +- The connection of master and agent requires SSH and the public-private key pair exchange. +- Verify its status under "Nodes" section. - You can follow [this article](https://www.linkedin.com/posts/chetanrakhra_devops-project-share-activity-7017885886461698048-os5f?utm_source=share&utm_medium=member_android) for the same @@ -54,4 +61,4 @@ Let me know how are feeling after 4 weeks of DevOps Learning. -Happy Learning:) \ No newline at end of file +Happy Learning:) From bcb13d4808e437af34c912cb38e8482eed1b997b Mon Sep 17 00:00:00 2001 From: Varsha Verma <55032759+Varsha-Verma@users.noreply.github.com> Date: Sun, 29 Jan 2023 00:00:39 +0530 Subject: [PATCH 018/394] Update tasks.md --- 2023/day29/tasks.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/2023/day29/tasks.md b/2023/day29/tasks.md index e69de29bb2..c50a711d45 100644 --- a/2023/day29/tasks.md +++ b/2023/day29/tasks.md @@ -0,0 +1,32 @@ +## Day 29 Task: Jenkins Important interview Questions. + +

+ + +## Jenkins Interview + Here are some Jenkins-specific questions related to Docker that one can use during a DevOps Engineer interview: + +## Questions + +1. What’s the difference between continuous integration, continuous delivery, and continuous deployment? +2. Benefits of CI/CD +3. What is meant by CI-CD? +4. What is Jenkins Pipeline? +5. How do you configure the job in Jenkins? +6. Where do you find errors in Jenkins? +7. In Jenkins how can you find log files? +8. Jenkins workflow and write a script for this workflow? +9. How to create continuous deployment in Jenkins? +10. How build job in Jenkins? +11. Why we use pipeline in Jenkins? +12. Is Only Jenkins enough for automation? +13. How will you handle secrets? +14. Explain diff stages in CI-CD setup +15. Name some of the plugins in Jenkin? + + + +These questions will help you in your next DevOps Interview. +Write a Blog and share it on LinkedIn. + +*Happy Learning :)* From 0fb8d2bf7a0a78c7816a83979d33b27b4863c8f4 Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Mon, 30 Jan 2023 19:21:13 +0530 Subject: [PATCH 019/394] added day 30 --- 2023/day30/tasks.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/2023/day30/tasks.md b/2023/day30/tasks.md index e69de29bb2..448e904fe0 100644 --- a/2023/day30/tasks.md +++ b/2023/day30/tasks.md @@ -0,0 +1,37 @@ + +## Day 30 Task: Kubernetes Architecture + + + +

+ + + +## Kubernetes Overview + +With the widespread adoption of [containers](https://cloud.google.com/containers) among organizations, Kubernetes, the container-centric management software, has become a standard to deploy and operate containerized applications and is one of the most important parts of DevOps. + +Originally developed at Google and released as open-source in 2014. Kubernetes builds on 15 years of running Google's containerized workloads and the valuable contributions from the open-source community. Inspired by Google’s internal cluster management system, [Borg](https://research.google.com/pubs/pub43438.html), + + +## Tasks + + + +1. What is Kubernetes? Write in your own words and why do we call it k8s? + +2. What are the benefits of using k8s? + +3. Explain the architecture of Kubernetes, refer to [this video](https://youtu.be/FqfoDUhzyDo) + +4. What is Control Plane? + +5. Write the difference between kubectl and kubelets. + +6. Explain the role of the API server. + +Kubernetes architecture is important, so make sure you spend a day understanding it. [This video](https://youtu.be/FqfoDUhzyDo) will surely help you. + + + +*Happy Learning :)* \ No newline at end of file From f895d871ea925115f0d14107c76de80211ec6587 Mon Sep 17 00:00:00 2001 From: Sitabja Chatterjee <89836369+sitchatt@users.noreply.github.com> Date: Mon, 30 Jan 2023 23:18:04 +0530 Subject: [PATCH 020/394] Update tasks.md --- 2023/day31/tasks.md | 84 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/2023/day31/tasks.md b/2023/day31/tasks.md index e69de29bb2..1e21fc8c90 100644 --- a/2023/day31/tasks.md +++ b/2023/day31/tasks.md @@ -0,0 +1,84 @@ +## Yee! You learned one of the top most important tool "Kubernetes" in your previous task. + +## What about doing some hands-on now? +Let's read about mini-kube and implement *k8s* in our local machine + +1) **What is mini-kube?** + +*Ans*:- Minikube is a tool which quickly sets up a local Kubernetes cluster on macOS, Linux, and Windows. It can deploy as a VM, a container, or on bare-metal. + +Minikube is a pared-down version of Kubernetes that gives you all the benefits of Kubernetes with a lot less effort. +This makes it an interesting option for users who are new to containers, and also for projects in the world of edge computing and the Internet of Things. + +2) **Features of mini-kube** + +*Ans* :- +(a) Supports the latest Kubernetes release (+6 previous minor versions) +(b) Cross-platform (Linux, macOS, Windows) +(c) Deploy as a VM, a container, or on bare-metal +(d) Multiple container runtimes (CRI-O, containerd, docker) +(e) Direct API endpoint for blazing fast image load and build +(f) Advanced features such as LoadBalancer, filesystem mounts, FeatureGates, and network policy +(g) Addons for easily installed Kubernetes applications +(h) Supports common CI environments + +# Lets install this amazing tool now + +## For installation you can Visit [this page](https://minikube.sigs.k8s.io/docs/start/) + + +``` bash = +$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 + +$ sudo install minikube-linux-amd64 /usr/local/bin/minikube + +$ Install docker + +$ docker system prune + +$ minikube delete + +$ minikube start --driver-docker + +$ 18101028500 + +$ sudo usermod -aG + +$ kubectl get po + +$ sudo snap + +$ kubectl + +$ Tec1810$USER && newgrp docker + +$ sudo snap kubectl + +$ po -A + +$ status + +$ get node + +$ kubectl --classic +``` + + +If you want to try alternative way, you can follow below steps: +check [this](https://k8s-docs.netlify.app/en/docs/tasks/tools/install-minikube/) + +## Let's understand the concept **pod** + +*Ans:-* + +Pods are the smallest deployable units of computing that you can create and manage in Kubernetes. + +A Pod (as in a pod of whales or pea pod) is a group of one or more containers, with shared storage and network resources, and a specification for how to run the containers. A Pod's contents are always co-located and co-scheduled, and run in a shared context. A Pod models an application-specific "logical host": it contains one or more application containers which are relatively tightly coupled. + +You can read more about pod from [here](https://kubernetes.io/docs/concepts/workloads/pods/) . + +# Now quickly do a task: +## Create your first pod on kuberneters through minikube. +We are suggesting you to make a nginx pod , but you can always show your creativity and do on your own. + +## Having issue? Don't worry , adding sample yaml file for pod creation, you can always refer. From 35677ea22a1430fd52104ed6002ce38b8b488f93 Mon Sep 17 00:00:00 2001 From: Sitabja Chatterjee <89836369+sitchatt@users.noreply.github.com> Date: Mon, 30 Jan 2023 23:22:55 +0530 Subject: [PATCH 021/394] Create pod.yml --- 2023/day31/pod.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 2023/day31/pod.yml diff --git a/2023/day31/pod.yml b/2023/day31/pod.yml new file mode 100644 index 0000000000..cfc02a372d --- /dev/null +++ b/2023/day31/pod.yml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Pod +metadata: + name: nginx +spec: + containers: + - name: nginx + image: nginx:1.14.2 + ports: + - containerPort: 80 + + +# After creating this file , run below command: +# kubectl apply -f From 99274c44efe8c83d60a2e19eb394de9dc52bfabd Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Tue, 31 Jan 2023 17:49:27 +0530 Subject: [PATCH 022/394] added day 31 changes --- 2023/day31/tasks.md | 102 +++++++++++++++++++++++++------------------- 1 file changed, 58 insertions(+), 44 deletions(-) diff --git a/2023/day31/tasks.md b/2023/day31/tasks.md index 1e21fc8c90..ddf75673f5 100644 --- a/2023/day31/tasks.md +++ b/2023/day31/tasks.md @@ -1,84 +1,98 @@ -## Yee! You learned one of the top most important tool "Kubernetes" in your previous task. -## What about doing some hands-on now? -Let's read about mini-kube and implement *k8s* in our local machine +## Day 30 Task: Launching your First Kubernetes Cluster with Nginx running -1) **What is mini-kube?** + + +### Awesome! You learned the architecture of one of the top most important tool "Kubernetes" in your previous task. + + + +## What about doing some hands-on now? + +Let's read about minikube and implement *k8s* in our local machine + + + +1) **What is minikube?** + + *Ans*:- Minikube is a tool which quickly sets up a local Kubernetes cluster on macOS, Linux, and Windows. It can deploy as a VM, a container, or on bare-metal. -Minikube is a pared-down version of Kubernetes that gives you all the benefits of Kubernetes with a lot less effort. + + +Minikube is a pared-down version of Kubernetes that gives you all the benefits of Kubernetes with a lot less effort. + This makes it an interesting option for users who are new to containers, and also for projects in the world of edge computing and the Internet of Things. -2) **Features of mini-kube** + + +2) **Features of minikube** + + + +*Ans* :- -*Ans* :- (a) Supports the latest Kubernetes release (+6 previous minor versions) + (b) Cross-platform (Linux, macOS, Windows) + (c) Deploy as a VM, a container, or on bare-metal -(d) Multiple container runtimes (CRI-O, containerd, docker) -(e) Direct API endpoint for blazing fast image load and build -(f) Advanced features such as LoadBalancer, filesystem mounts, FeatureGates, and network policy -(g) Addons for easily installed Kubernetes applications -(h) Supports common CI environments -# Lets install this amazing tool now +(d) Multiple container runtimes (CRI-O, containerd, docker) -## For installation you can Visit [this page](https://minikube.sigs.k8s.io/docs/start/) +(e) Direct API endpoint for blazing fast image load and build +(f) Advanced features such as LoadBalancer, filesystem mounts, FeatureGates, and network policy -``` bash = -$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 +(g) Addons for easily installed Kubernetes applications -$ sudo install minikube-linux-amd64 /usr/local/bin/minikube +(h) Supports common CI environments -$ Install docker + -$ docker system prune +## Task-01: -$ minikube delete +## Install minikube on your local -$ minikube start --driver-docker + -$ 18101028500 +For installation, you can Visit [this page](https://minikube.sigs.k8s.io/docs/start/). -$ sudo usermod -aG + -$ kubectl get po +If you want to try an alternative way, you can check [this](https://k8s-docs.netlify.app/en/docs/tasks/tools/install-minikube/). -$ sudo snap + -$ kubectl +## Let's understand the concept **pod** -$ Tec1810$USER && newgrp docker + -$ sudo snap kubectl +*Ans:-* -$ po -A + -$ status +Pods are the smallest deployable units of computing that you can create and manage in Kubernetes. -$ get node + -$ kubectl --classic -``` +A Pod (as in a pod of whales or pea pod) is a group of one or more containers, with shared storage and network resources, and a specification for how to run the containers. A Pod's contents are always co-located and co-scheduled, and run in a shared context. A Pod models an application-specific "logical host": it contains one or more application containers which are relatively tightly coupled. + -If you want to try alternative way, you can follow below steps: -check [this](https://k8s-docs.netlify.app/en/docs/tasks/tools/install-minikube/) +You can read more about pod from [here](https://kubernetes.io/docs/concepts/workloads/pods/) . -## Let's understand the concept **pod** + -*Ans:-* +## Task-02: -Pods are the smallest deployable units of computing that you can create and manage in Kubernetes. +## Create your first pod on Kubernetes through minikube. -A Pod (as in a pod of whales or pea pod) is a group of one or more containers, with shared storage and network resources, and a specification for how to run the containers. A Pod's contents are always co-located and co-scheduled, and run in a shared context. A Pod models an application-specific "logical host": it contains one or more application containers which are relatively tightly coupled. +We are suggesting you make an nginx pod, but you can always show your creativity and do it on your own. -You can read more about pod from [here](https://kubernetes.io/docs/concepts/workloads/pods/) . + -# Now quickly do a task: -## Create your first pod on kuberneters through minikube. -We are suggesting you to make a nginx pod , but you can always show your creativity and do on your own. +**Having an issue? Don't worry, adding a sample yaml file for pod creation, you can always refer that.** -## Having issue? Don't worry , adding sample yaml file for pod creation, you can always refer. +*Happy Learning :)* \ No newline at end of file From 7c94b8e0b87b5b4545e1dd85b57cdcd083672da9 Mon Sep 17 00:00:00 2001 From: RishikeshOps Date: Wed, 1 Feb 2023 23:18:50 +0530 Subject: [PATCH 023/394] Create Deployment.yml --- 2023/day32/Deployment.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 2023/day32/Deployment.yml diff --git a/2023/day32/Deployment.yml b/2023/day32/Deployment.yml new file mode 100644 index 0000000000..a5e8b28f86 --- /dev/null +++ b/2023/day32/Deployment.yml @@ -0,0 +1,21 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: todo-app + labels: + app: todo +spec: + replicas: 1 + selector: + matchLabels: + app: todo + template: + metadata: + labels: + app: todo + spec: + containers: + - name: todo + image: rishikeshops/todo-app + ports: + - containerPort: 3000 From 070974e52334a7876637dc4efa99a4454c7ae4aa Mon Sep 17 00:00:00 2001 From: Sitabja Chatterjee <89836369+sitchatt@users.noreply.github.com> Date: Wed, 1 Feb 2023 23:56:45 +0530 Subject: [PATCH 024/394] Update tasks.md --- 2023/day32/tasks.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/2023/day32/tasks.md b/2023/day32/tasks.md index e69de29bb2..6988d5a3f8 100644 --- a/2023/day32/tasks.md +++ b/2023/day32/tasks.md @@ -0,0 +1,13 @@ +# Congratulation ! on your learning on K8s on Day-31 + +## Today's task let's keep it very simple. + +## Task-1: +**Create one Deployment file to deploy a sample todo-app on K8s using "Auto-healing" and "Auto-Scaling" feature** + +Let's make your resume shine with one more project ;) + + +**Having an issue? Don't worry, adding a sample deployment file , you can always refer that.*** + +Happy Learning :) From 97ec05c0f5be61d3cbf62fd33e7d460d1c670eff Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Thu, 2 Feb 2023 00:13:30 +0530 Subject: [PATCH 025/394] minor changes --- 2023/day31/tasks.md | 2 +- 2023/day32/tasks.md | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/2023/day31/tasks.md b/2023/day31/tasks.md index ddf75673f5..8fb0afe038 100644 --- a/2023/day31/tasks.md +++ b/2023/day31/tasks.md @@ -1,5 +1,5 @@ -## Day 30 Task: Launching your First Kubernetes Cluster with Nginx running +## Day 31 Task: Launching your First Kubernetes Cluster with Nginx running diff --git a/2023/day32/tasks.md b/2023/day32/tasks.md index 6988d5a3f8..68657d951d 100644 --- a/2023/day32/tasks.md +++ b/2023/day32/tasks.md @@ -1,13 +1,28 @@ -# Congratulation ! on your learning on K8s on Day-31 + +## Day 32 Task: Launching your Kubernetes Cluster with Deployment + +### Congratulation ! on your learning on K8s on Day-31 + +## What is Deployment in k8s + +A Deployment provides a configuration for updates for Pods and ReplicaSets. + +You describe a desired state in a Deployment, and the Deployment Controller changes the actual state to the desired state at a controlled rate. You can define Deployments to create new replicas for scaling, or to remove existing Deployments and adopt all their resources with new Deployments. ## Today's task let's keep it very simple. ## Task-1: **Create one Deployment file to deploy a sample todo-app on K8s using "Auto-healing" and "Auto-Scaling" feature** +- add a deployment.yml file (sample is kept in the folder for your reference) +- apply the deployment to your k8s (minikube) cluster by command +`kubectl apply -f deployment.yml` + Let's make your resume shine with one more project ;) -**Having an issue? Don't worry, adding a sample deployment file , you can always refer that.*** +**Having an issue? Don't worry, adding a sample deployment file , you can always refer that or wathch [this video]()** + + Happy Learning :) From 880194bc9ef9ea2eb6694a6177d7b64e8bf8ea01 Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Thu, 2 Feb 2023 00:19:56 +0530 Subject: [PATCH 026/394] minor changes --- 2023/day32/Deployment.yml | 2 +- 2023/day32/tasks.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/2023/day32/Deployment.yml b/2023/day32/Deployment.yml index a5e8b28f86..8f3814196b 100644 --- a/2023/day32/Deployment.yml +++ b/2023/day32/Deployment.yml @@ -5,7 +5,7 @@ metadata: labels: app: todo spec: - replicas: 1 + replicas: 2 selector: matchLabels: app: todo diff --git a/2023/day32/tasks.md b/2023/day32/tasks.md index 68657d951d..089768d40b 100644 --- a/2023/day32/tasks.md +++ b/2023/day32/tasks.md @@ -21,7 +21,7 @@ You describe a desired state in a Deployment, and the Deployment Controller chan Let's make your resume shine with one more project ;) -**Having an issue? Don't worry, adding a sample deployment file , you can always refer that or wathch [this video]()** +**Having an issue? Don't worry, adding a sample deployment file , you can always refer that or wathch [this video](https://youtu.be/ONrbWFJXLLk)** From 31ead437a56f7333dd4f483c662ba72ef255e535 Mon Sep 17 00:00:00 2001 From: Rushikesh Mashidkar Date: Thu, 2 Feb 2023 16:50:33 +0530 Subject: [PATCH 027/394] Update tasks.md --- 2023/day33/tasks.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/2023/day33/tasks.md b/2023/day33/tasks.md index e69de29bb2..ba43ece1d8 100644 --- a/2023/day33/tasks.md +++ b/2023/day33/tasks.md @@ -0,0 +1,28 @@ +# Day 33 Task: Working with Namespaces and Services in Kubernetes +### Congrats🎊🎉 on updating your Deployment yesterday💥🙌 +## What are Namespaces and Services in k8s +In Kubernetes, Namespaces are used to create isolated environments for resources. Each Namespace is like a separate cluster within the same physical cluster. Services are used to expose your Pods and Deployments to the network. Read more about Namespace [Here](https://kubernetes.io/docs/concepts/workloads/pods/user-namespaces/) + +# Today's task: +## Task 1: +- Create a Namespace for your Deployment + +- Use the command `kubectl create namespace ` to create a Namespace + +- Update the deployment.yml file to include the Namespace + +- Apply the updated deployment using the command: + `kubectl apply -f deployment.yml -n ` + +- Verify that the Namespace has been created by checking the status of the Namespaces in your cluster. + +## Task 2: +- Read about Services, Load Balancing, and Networking in Kubernetes. Refer official documentation of kubernetes [Link](https://kubernetes.io/docs/concepts/services-networking/) + +Need help with Namespaces? Check out this [video](https://youtu.be/K3jNo4z5Jx8) for assistance. + +Keep growing your Kubernetes knowledge💥🙌 + +Happy Learning! :) + + From f3cca587a6eca2f8c897fe5e8d985ef5ce2e3f01 Mon Sep 17 00:00:00 2001 From: Rushikesh Mashidkar Date: Fri, 3 Feb 2023 17:34:24 +0530 Subject: [PATCH 028/394] Update tasks.md --- 2023/day34/tasks.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/2023/day34/tasks.md b/2023/day34/tasks.md index e69de29bb2..6d838c5d44 100644 --- a/2023/day34/tasks.md +++ b/2023/day34/tasks.md @@ -0,0 +1,31 @@ +# Day 34 Task: Working with Services in Kubernetes +### Congratulation🎊 on your learning on Deployments in K8s on Day-33 +## What are Services in K8s +In Kubernetes, Services are objects that provide stable network identities to Pods and abstract away the details of Pod IP addresses. Services allow Pods to receive traffic from other Pods, Services, and external clients. + + +## Task-1: +- Create a Service for your todo-app Deployment from Day-32 +- Create a Service definition for your todo-app Deployment in a YAML file. +- Apply the Service definition to your K8s (minikube) cluster using the `kubectl apply -f service.yml -n ` command. +- Verify that the Service is working by accessing the todo-app using the Service's IP and Port in your Namespace. + +## Task-2: +- Create a ClusterIP Service for accessing the todo-app from within the cluster +- Create a ClusterIP Service definition for your todo-app Deployment in a YAML file. +- Apply the ClusterIP Service definition to your K8s (minikube) cluster using the `kubectl apply -f cluster-ip-service.yml -n ` command. +- Verify that the ClusterIP Service is working by accessing the todo-app from another Pod in the cluster in your Namespace. + +## Task-3: +- Create a LoadBalancer Service for accessing the todo-app from outside the cluster +- Create a LoadBalancer Service definition for your todo-app Deployment in a YAML file. +- Apply the LoadBalancer Service definition to your K8s (minikube) cluster using the `kubectl apply -f load-balancer-service.yml -n ` command. +- Verify that the LoadBalancer Service is working by accessing the todo-app from outside the cluster in your Namespace. + + +Struggling with Services? Take a look at this video for a step-by-step [guide](https://youtu.be/OJths_RojFA). + +Need help with Services in Kubernetes? Check out the Kubernetes [documentation](https://kubernetes.io/docs/concepts/services-networking/service/) for assistance. + +Happy Learning :) + From eb5c1b856828d45b479fac4ca3b8f037aafe4491 Mon Sep 17 00:00:00 2001 From: Rushikesh Mashidkar Date: Sat, 4 Feb 2023 18:45:43 +0530 Subject: [PATCH 029/394] Update tasks.md --- 2023/day35/tasks.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/2023/day35/tasks.md b/2023/day35/tasks.md index e69de29bb2..1ab1d3577b 100644 --- a/2023/day35/tasks.md +++ b/2023/day35/tasks.md @@ -0,0 +1,31 @@ +# Day 35: Mastering ConfigMaps and Secrets in Kubernetes🔒🔑🛡️ + +### 👏🎉 Yay! Yesterday we conquered Namespaces and Services 💪💻🔗🚀 + +## What are ConfigMaps and Secrets in k8s +In Kubernetes, ConfigMaps and Secrets are used to store configuration data and secrets, respectively. ConfigMaps store configuration data as key-value pairs, while Secrets store sensitive data in an encrypted form. + +- *Example :- Imagine you're in charge of a big spaceship (Kubernetes cluster) with lots of different parts (containers) that need information to function properly. +ConfigMaps are like a file cabinet where you store all the information each part needs in simple, labeled folders (key-value pairs). +Secrets, on the other hand, are like a safe where you keep the important, sensitive information that shouldn't be accessible to just anyone (encrypted data). +So, using ConfigMaps and Secrets, you can ensure each part of your spaceship (Kubernetes cluster) has the information it needs to work properly and keep sensitive information secure! 🚀* +- Read more about [ConfigMap](https://kubernetes.io/docs/concepts/configuration/configmap/) & [Secret](https://kubernetes.io/docs/concepts/configuration/secret/). +## Today's task: +## Task 1: +- Create a ConfigMap for your Deployment +- Create a ConfigMap for your Deployment using a file or the command line +- Update the deployment.yml file to include the ConfigMap +- Apply the updated deployment using the command: `kubectl apply -f deployment.yml -n ` +- Verify that the ConfigMap has been created by checking the status of the ConfigMaps in your Namespace. + +## Task 2: +- Create a Secret for your Deployment +- Create a Secret for your Deployment using a file or the command line +- Update the deployment.yml file to include the Secret +- Apply the updated deployment using the command: `kubectl apply -f deployment.yml -n ` +- Verify that the Secret has been created by checking the status of the Secrets in your Namespace. + +Need help with ConfigMaps and Secrets? Check out this [video](https://youtu.be/FAnQTgr04mU) for assistance. + + +Keep learning and expanding your knowledge of Kubernetes💥🙌 From bb638bae8cadfde149327a33f16ce94d82e31151 Mon Sep 17 00:00:00 2001 From: Rushikesh Mashidkar Date: Sat, 4 Feb 2023 23:00:58 +0530 Subject: [PATCH 030/394] Create pv.yml --- 2023/day36/pv.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 2023/day36/pv.yml diff --git a/2023/day36/pv.yml b/2023/day36/pv.yml new file mode 100644 index 0000000000..9546aba56a --- /dev/null +++ b/2023/day36/pv.yml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: PersistentVolume +metadata: + name: pv-todo-app +spec: + capacity: + storage: 1Gi + accessModes: + - ReadWriteOnce + persistentVolumeReclaimPolicy: Retain + hostPath: + path: "/tmp/data" From 2f6e7dc904d330fe7671401588d72be02da35454 Mon Sep 17 00:00:00 2001 From: Rushikesh Mashidkar Date: Sat, 4 Feb 2023 23:02:39 +0530 Subject: [PATCH 031/394] Create pvc.yml --- 2023/day36/pvc.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 2023/day36/pvc.yml diff --git a/2023/day36/pvc.yml b/2023/day36/pvc.yml new file mode 100644 index 0000000000..3d9dce14d8 --- /dev/null +++ b/2023/day36/pvc.yml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: pvc-todo-app +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 500Mi From df349c95b666670054cb0f0094c6497c2d0a425f Mon Sep 17 00:00:00 2001 From: Rushikesh Mashidkar Date: Sat, 4 Feb 2023 23:05:38 +0530 Subject: [PATCH 032/394] Create Deployment.yml --- 2023/day36/Deployment.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 2023/day36/Deployment.yml diff --git a/2023/day36/Deployment.yml b/2023/day36/Deployment.yml new file mode 100644 index 0000000000..3c9c1c7cbc --- /dev/null +++ b/2023/day36/Deployment.yml @@ -0,0 +1,26 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: todo-app-deployment +spec: + replicas: 1 + selector: + matchLabels: + app: todo-app + template: + metadata: + labels: + app: todo-app + spec: + containers: + - name: todo-app + image: rishikeshops/todo-app + ports: + - containerPort: 8000 + volumeMounts: + - name: todo-app-data + mountPath: /app + volumes: + - name: todo-app-data + persistentVolumeClaim: + claimName: pvc-todo-app From a1375ad9e7991236f807c0ddbd8968b3cfee0e22 Mon Sep 17 00:00:00 2001 From: Rushikesh Mashidkar Date: Sat, 4 Feb 2023 23:55:08 +0530 Subject: [PATCH 033/394] Update tasks.md --- 2023/day36/tasks.md | 49 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/2023/day36/tasks.md b/2023/day36/tasks.md index e69de29bb2..1d2993d3d7 100644 --- a/2023/day36/tasks.md +++ b/2023/day36/tasks.md @@ -0,0 +1,49 @@ +# Day 36 Task: Managing Persistent Volumes in Your Deployment 💥 + +🙌 Kudos to you for conquering ConfigMaps and Secrets in Kubernetes yesterday. + +🔥 You're on fire! 🔥 + +## What are Persistent Volumes in k8s + +In Kubernetes, a Persistent Volume (PV) is a piece of storage in the cluster that has been provisioned by an administrator. A Persistent Volume Claim (PVC) is a request for storage by a user. The PVC references the PV, and the PV is bound to a specific node. Read official documentation of [Persistent Volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/). + +⏰ Wait, wait, wait! 📣 Attention all #90daysofDevOps Challengers. 💪 + +Before diving into today's task, don't forget to share your thoughts on the #90daysofDevOps challenge 💪 Fill out our feedback form (https://lnkd.in/gcgvrq8b) to help us improve and provide the best experience 🌟 Your participation and support is greatly appreciated 🙏 Let's continue to grow together 🌱 + +## Today's tasks: + +### Task 1: + +Add a Persistent Volume to your Deployment todo app. + +- Create a Persistent Volume using a file on your node. [Template](https://github.com/LondheShubham153/90DaysOfDevOps/blob/94e3970819e097a5b8edea40fe565d583419f912/2023/day36/pv.yml) + +- Create a Persistent Volume Claim that references the Persistent Volume. [Template](https://github.com/LondheShubham153/90DaysOfDevOps/blob/94e3970819e097a5b8edea40fe565d583419f912/2023/day36/pvc.yml) + +- Update your deployment.yml file to include the Persistent Volume Claim. After Applying pv.yml pvc.yml your deployment file look like this [Template](https://github.com/LondheShubham153/90DaysOfDevOps/blob/94e3970819e097a5b8edea40fe565d583419f912/2023/day36/Deployment.yml) + +- Apply the updated deployment using the command: `kubectl apply -f deployment.yml` + +- Verify that the Persistent Volume has been added to your Deployment by checking the status of the Pods and Persistent Volumes in your cluster. Use this commands `kubectl get pods` , + +`kubectl get pv` + +⚠️ Don't forget: To apply changes or create files in your Kubernetes deployments, each file must be applied separately. ⚠️ + +### Task 2: + +Accessing data in the Persistent Volume, + +- Connect to a Pod in your Deployment using command : `kubectl exec -it -- /bin/bash + +` + +- Verify that you can access the data stored in the Persistent Volume from within the Pod + +Need help with Persistent Volumes? Check out this [video](https://youtu.be/U0_N3v7vJys) for assistance. + +Keep up the excellent work🙌💥 + +Happy Learning :) From 0575861019dfb02e35c81b971519b9f5bddd9015 Mon Sep 17 00:00:00 2001 From: Sitabja Chatterjee <89836369+sitchatt@users.noreply.github.com> Date: Mon, 6 Feb 2023 22:25:03 +0530 Subject: [PATCH 034/394] Update tasks.md --- 2023/day37/tasks.md | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/2023/day37/tasks.md b/2023/day37/tasks.md index e69de29bb2..dec7eba46c 100644 --- a/2023/day37/tasks.md +++ b/2023/day37/tasks.md @@ -0,0 +1,45 @@ +## Day 37 Task: Kubernetes Important interview Questions. + +## Questions + +1.What is Kubernetes and why it is important? + +2.What is difference between docker swarm and kubernetes? + +3.How does Kubernetes handle network communication between containers? + +4.How does Kubernetes handle scaling of applications? + +5.What is a Kubernetes Deployment and how does it differ from a ReplicaSet? + +6.Can you explain the concept of rolling updates in Kubernetes? + +7.How does Kubernetes handle network security and access control? + +8.Can you give an example of how Kubernetes can be used to deploy a highly available application? + +9.What is namespace is kubernetes? Which namespace any pod takes if we don't specify any namespace? + +10.How ingress helps in kubernetes? + +11.Explain different types of services in kubernetes? + +12.Can you explain the concept of self-healing in Kubernetes and give examples of how it works? + +13.How does Kubernetes handle storage management for containers? + +14.How does the NodePort service work? + +15.What is a multinode cluster and single-node cluster in Kubernetes? + +16.Difference between create and apply in kubernetes? + + + + + +## These questions will help you in your next DevOps Interview. + +*Write a Blog and share it on LinkedIn.* + +***Happy Learning :)*** From eae21f3121445525849172c1e46bc22df427ec78 Mon Sep 17 00:00:00 2001 From: Varsha Verma <55032759+Varsha-Verma@users.noreply.github.com> Date: Tue, 7 Feb 2023 19:19:54 +0530 Subject: [PATCH 035/394] Update tasks.md --- 2023/day38/tasks.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/2023/day38/tasks.md b/2023/day38/tasks.md index e69de29bb2..c376ba9072 100644 --- a/2023/day38/tasks.md +++ b/2023/day38/tasks.md @@ -0,0 +1,23 @@ +# Day 38 Getting Started with AWS Basics☁ +![AWS](https://user-images.githubusercontent.com/115981550/217238286-6c6bc6e7-a1ac-4d12-98f3-f95ff5bf53fc.png) + + +Congratulations!!!! you have come so far. Don't let your excuses break your consistency. Let's begin our new Journey with Cloud☁. By this time you have created multiple EC2 instances, if not let's begin the journey: +## AWS: +Amazon Web Services is one of the most popular Cloud Provider that has free tier too for students and Cloud enthutiasts for their Handson while learning (Create your free account today to explore more on it). + +Read from [here](https://aws.amazon.com/what-is-aws/) + +## IAM: +AWS Identity and Access Management (IAM) is a web service that helps you securely control access to AWS resources. With IAM, you can centrally manage permissions that control which AWS resources users can access. You use IAM to control who is authenticated (signed in) and authorized (has permissions) to use resources. +Read from [here](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) + +Get to know IAM more deeply [Click Here!!](https://www.youtube.com/watch?v=ORB4eY8EydA) + +### Task1: +Create an IAM user with username of your own wish and grant EC2 Access. Launch your Linux instance through the IAM user that you created now and install jenkins and docker on your machine via single Shell Script. + +### Task2: +In this task you need to prepare a devops team of avengers. Create 3 IAM users of avengers and assign them in devops groups with IAM policy. + +Post your progress on Linkedin. Till then Happy Learning :) From 8cd88e5c8bd29fa78ff9e5916506a016c5243772 Mon Sep 17 00:00:00 2001 From: Varsha Verma <55032759+Varsha-Verma@users.noreply.github.com> Date: Wed, 8 Feb 2023 19:29:16 +0530 Subject: [PATCH 036/394] Update tasks.md --- 2023/day39/tasks.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/2023/day39/tasks.md b/2023/day39/tasks.md index e69de29bb2..020797e89c 100644 --- a/2023/day39/tasks.md +++ b/2023/day39/tasks.md @@ -0,0 +1,37 @@ +# Day 39 AWS and IAM Basics☁ +![AWS](https://miro.medium.com/max/1400/0*dIzXLQn6aBClm1TJ.png) + + + +By this time you have created multiple EC2 instances, and post installation manually installed applications like Jenkins, docker etc. +Now let's switch to little automation part. Sounds interesting??🤯 + +## AWS: +Amazon Web Services is one of the most popular Cloud Provider that has free tier too for students and Cloud enthutiasts for their Handson while learning (Create your free account today to explore more on it). + +Read from [here](https://aws.amazon.com/what-is-aws/) + +## User Data in AWS: +- When you launch an instance in Amazon EC2, you have the option of passing user data to the instance that can be used to perform common automated configuration tasks and even run scripts after the instance starts. You can pass two types of user data to Amazon EC2: shell scripts and cloud-init directives. +- You can also pass this data into the launch instance wizard as plain text, as a file (this is useful for launching instances using the command line tools), or as base64-encoded text (for API calls). +- This will save time and manual effort everytime you launch an instance and want to install any application on it like apache, docker, Jenkins etc + +Read more from [here](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html) + +## IAM: +AWS Identity and Access Management (IAM) is a web service that helps you securely control access to AWS resources. With IAM, you can centrally manage permissions that control which AWS resources users can access. You use IAM to control who is authenticated (signed in) and authorized (has permissions) to use resources. +Read from [here](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) + +Get to know IAM more deeply🏊[Click Here!!](https://www.youtube.com/watch?v=ORB4eY8EydA) + + +### Task1: +- Launch EC2 instance with already installed Jenkins on it. Once server shows up in console, hit the IP address in browser and you Jenkins page should be visible. +- Take screenshot of Userdata and Jenkins page, this will verify the task completion. + +### Task2: +- Read more on IAM Roles and explain the IAM Users, Groups and Roles in your own terms. +- Create three Roles named: DevOps-User, Test-User and Admin. + + +Post your progress on Linkedin. Till then Happy Learning :) From f8c0b13bbcc96819037877273c7215ea7765518d Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Thu, 9 Feb 2023 20:38:36 +0530 Subject: [PATCH 037/394] Added day 40 task --- 2023/day40/tasks.md | 62 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/2023/day40/tasks.md b/2023/day40/tasks.md index e69de29bb2..4f6b9462ef 100644 --- a/2023/day40/tasks.md +++ b/2023/day40/tasks.md @@ -0,0 +1,62 @@ + +# Day 40 AWS EC2 Automation ☁ + +![AWS](https://www.eginnovations.com/blog/wp-content/uploads/2021/09/Amazon-AWS-Cloud-Topimage-1.jpg) + + + + + +I hope your journey with AWS cloud and automation is going well [](https://emojipedia.org/emoji/%F0%9F%98%8D/) +### 😍 + + + +## Automation in EC2: + +Amazon EC2 or Amazon Elastic Compute Cloud can give you secure, reliable, high-performance, and cost-effective computing infrastructure to meet demanding business needs. + +Also, if you know a few things, you can automate many things. + +Read from [here](https://aws.amazon.com/ec2/) + + + +## Launch template in AWS EC2: + +- You can make a launch template with the configuration information you need to start an instance. You can save launch parameters in launch templates so you don't have to type them in every time you start a new instance. +- For example, a launch template can have the AMI ID, instance type, and network settings that you usually use to launch instances. +- You can tell the Amazon EC2 console to use a certain launch template when you start an instance. + + + +Read more from [here](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html) + + + +## Instance Types: + +Amazon EC2 has a large number of instance types that are optimised for different uses. The different combinations of CPU, memory, storage and networking capacity in instance types give you the freedom to choose the right mix of resources for your apps. Each instance type comes with one or more instance sizes, so you can adjust your resources to meet the needs of the workload you want to run. + +Read from [here](https://aws.amazon.com/ec2/instance-types/?trk=32f4fbd0-ffda-4695-a60c-8857fab7d0dd&sc_channel=ps&s_kwcid=AL!4422!3!536392685920!e!!g!!ec2%20instance%20types&ef_id=CjwKCAiA0JKfBhBIEiwAPhZXD_O1-3qZkRa-KScynbwjvHd3l4UHSTfKuigd5ZPukXoDXu-v3MtC7hoCafEQAvD_BwE:G:s&s_kwcid=AL!4422!3!536392685920!e!!g!!ec2%20instance%20types) + +## AMI: + +An Amazon Machine Image (AMI) is an image that AWS supports and keeps up to date. It contains the information needed to start an instance. When you launch an instance, you must choose an AMI. When you need multiple instances with the same configuration, you can launch them from a single AMI. + + +### Task1: + +- Create a launch template with Amazon Linux 2 AMI and t2.micro instance type with Jenkins and Docker setup (You can use the Day 39 User data script for installing the required tools. + +- Create 3 Instances using Launch Template, there must be an option that shows number of instances to be launched ,can you find it? :) + +- You can go one step ahead and create an auto-scaling group, sounds tough? + +Check [this](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-launch-template.html#create-launch-template-for-auto-scaling) out + + + +Post your progress on Linkedin. + +Happy Learning :) \ No newline at end of file From 75cac1a09b741f4978c2465e273cd0f70378e420 Mon Sep 17 00:00:00 2001 From: Rushikesh Mashidkar Date: Fri, 10 Feb 2023 22:52:07 +0530 Subject: [PATCH 038/394] Update tasks.md --- 2023/day41/tasks.md | 48 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/2023/day41/tasks.md b/2023/day41/tasks.md index e69de29bb2..5420ee07e5 100644 --- a/2023/day41/tasks.md +++ b/2023/day41/tasks.md @@ -0,0 +1,48 @@ +# Day 41: Setting up an Application Load Balancer with AWS EC2 🚀 ☁ + +![LB2](https://user-images.githubusercontent.com/115981550/218145297-d55fe812-32b7-4242-a4f8-eb66312caa2c.png) + +### Hi, I hope you had a great day yesterday learning about the launch template and instances in EC2. Today, we are going to dive into one of the most important concepts in EC2: Load Balancing. + +## What is Load Balancing? +Load balancing is the distribution of workloads across multiple servers to ensure consistent and optimal resource utilization. It is an essential aspect of any large-scale and scalable computing system, as it helps you to improve the reliability and performance of your applications. + +## Elastic Load Balancing: +**Elastic Load Balancing (ELB)** is a service provided by Amazon Web Services (AWS) that automatically distributes incoming traffic across multiple EC2 instances. ELB provides three types of load balancers: + +Read more from [here](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) + +1) **Application Load Balancer (ALB)** - _operates at layer 7 of the OSI model and is ideal for applications that require advanced routing and microservices._ + +- Read more from [here](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html) + + +2) **Network Load Balancer (NLB)** - _operates at layer 4 of the OSI model and is ideal for applications that require high throughput and low latency._ + +- Read more from [here](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/introduction.html) + + +3) **Classic Load Balancer (CLB)** - _operates at layer 4 of the OSI model and is ideal for applications that require basic load balancing features._ +- Read more [here](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/introduction.html) + +## 🎯 Today's Tasks: + +### Task 1: +- launch 2 EC2 instances with an Ubuntu AMI and use User Data to install the Apache Web Server. +- Modify the index.html file to include your name so that when your Apache server is hosted, it will display your name also do it for 2nd instance which include " TrainWithShubham Community is Super Aweasome :) ". +- Copy the public IP address of your EC2 instances. +- Open a web browser and paste the public IP address into the address bar. +- You should see a webpage displaying information about your PHP installation. + +### Task 2: +- Create an Application Load Balancer (ALB) in EC2 using the AWS Management Console. +- Add EC2 instances which you launch in task-1 to the ALB as target groups. +- Verify that the ALB is working properly by checking the health status of the target instances and testing the load balancing capabilities. + +![LoadBalancer](https://user-images.githubusercontent.com/115981550/218143557-26ec33ce-99a7-4db6-a46f-1cf48ed77ae0.png) + +Need help with task? Check out this [Blog for assistance](https://rushikesh-mashidkar.hashnode.dev/create-an-application-load-balancer-elastic-load-balancing-using-aws-ec2-instance). + +Don't forget to share your progress on LinkedIn and have a great day🙌💥 + +Happy Learning! 😃 From 4a197a72c4a6ae15fbbdb38359773e23af0bf1d3 Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Sun, 12 Feb 2023 00:04:09 +0530 Subject: [PATCH 039/394] Added day 42 --- 2023/day42/tasks.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/2023/day42/tasks.md b/2023/day42/tasks.md index e69de29bb2..1d9aaf8c28 100644 --- a/2023/day42/tasks.md +++ b/2023/day42/tasks.md @@ -0,0 +1,28 @@ +# Day 42: IAM Programmatic access and AWS CLI 🚀 ☁ + +Today is more of a reading excercise and getting some programmatic access for your AWS account + +## IAM Programmatic access + +In order to access your AWS account from a terminal or system, you can use AWS Access keys and AWS Secret Access keys +Watch [this video](https://youtu.be/XYKqL5GFI-I) for more details. + +## AWS CLI + +The AWS Command Line Interface (AWS CLI) is a unified tool to manage your AWS services. With just one tool to download and configure, you can control multiple AWS services from the command line and automate them through scripts. + +The AWS CLI v2 offers several new features including improved installers, new configuration options such as AWS IAM Identity Center (successor to AWS SSO), and various interactive features. + + +## Task-01 + +- Create AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY from AWS Console. + +## Task-02 + +- Setup and install AWS CLI and configure your account credentials + + +Let me know if you have any issues while doing the task. + +Happy Learning :) \ No newline at end of file From 247c48a1977ae23bc850400b3913828a4990c415 Mon Sep 17 00:00:00 2001 From: Rushikesh Mashidkar Date: Sun, 12 Feb 2023 23:11:53 +0530 Subject: [PATCH 040/394] Create aws-cli.md --- 2023/day43/aws-cli.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 2023/day43/aws-cli.md diff --git a/2023/day43/aws-cli.md b/2023/day43/aws-cli.md new file mode 100644 index 0000000000..8c0f23fe2f --- /dev/null +++ b/2023/day43/aws-cli.md @@ -0,0 +1,21 @@ +Here are some commonly used AWS CLI commands for Amazon S3: + +`aws s3 ls` - This command lists all of the S3 buckets in your AWS account. + +`aws s3 mb s3://bucket-name` - This command creates a new S3 bucket with the specified name. + +`aws s3 rb s3://bucket-name` - This command deletes the specified S3 bucket. + +`aws s3 cp file.txt s3://bucket-name` - This command uploads a file to an S3 bucket. + +`aws s3 cp s3://bucket-name/file.txt .` - This command downloads a file from an S3 bucket to your local file system. + +`aws s3 sync local-folder s3://bucket-name` - This command syncs the contents of a local folder with an S3 bucket. + +`aws s3 ls s3://bucket-name` - This command lists the objects in an S3 bucket. + +`aws s3 rm s3://bucket-name/file.txt` - This command deletes an object from an S3 bucket. + +`aws s3 presign s3://bucket-name/file.txt` - This command generates a pre-signed URL for an S3 object, which can be used to grant temporary access to the object. + +`aws s3api list-buckets` - This command retrieves a list of all S3 buckets in your AWS account, using the S3 API. From ed9a7e001d70f2f5f619eae0e18527ac4f514d40 Mon Sep 17 00:00:00 2001 From: Rushikesh Mashidkar Date: Sun, 12 Feb 2023 23:28:19 +0530 Subject: [PATCH 041/394] Update tasks.md --- 2023/day43/tasks.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/2023/day43/tasks.md b/2023/day43/tasks.md index e69de29bb2..645e66d05c 100644 --- a/2023/day43/tasks.md +++ b/2023/day43/tasks.md @@ -0,0 +1,26 @@ +# Day 43: S3 Programmatic access with AWS-CLI 💻 📁 +Hi, I hope you had a great day yesterday. Today as part of the #90DaysofDevOps Challenge we will be exploring most commonly used service in AWS i.e S3. + +![s3](https://user-images.githubusercontent.com/115981550/218308379-a2e841cf-6b77-4d02-bfbe-20d1bae09b20.png) + +# S3 +Amazon Simple Storage Service (Amazon S3) is an object storage service that provides a secure and scalable way to store and access data on the cloud. It is designed for storing any kind of data, such as text files, images, videos, backups, and more. +Read more [here](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) +## Task-01 +- Launch an EC2 instance using the AWS Management Console and connect to it using Secure Shell (SSH). +- Create an S3 bucket and upload a file to it using the AWS Management Console. +- Access the file from the EC2 instance using the AWS Command Line Interface (AWS CLI). + +Read more about S3 using aws-cli [here](https://docs.aws.amazon.com/cli/latest/reference/s3/index.html) + +## Task-02 +- Create a snapshot of the EC2 instance and use it to launch a new EC2 instance. +- Download a file from the S3 bucket using the AWS CLI. +- Verify that the contents of the file are the same on both EC2 instances. + +Added Some Useful commands to complete the task. [Click here for commands](https://github.com/LondheShubham153/90DaysOfDevOps/blob/833a67ac4ec17b992934cd6878875dccc4274f56/2023/day43/aws-cli.md) + + +Let me know if you have any questions or face any issues while doing the tasks.🚀 + +Happy Learning :) From 47cb60f1320afce3638e160a0a36f5297d269d25 Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Mon, 13 Feb 2023 22:58:41 +0530 Subject: [PATCH 042/394] added day 44 --- 2023/day44/tasks.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/2023/day44/tasks.md b/2023/day44/tasks.md index e69de29bb2..d78e66b479 100644 --- a/2023/day44/tasks.md +++ b/2023/day44/tasks.md @@ -0,0 +1,22 @@ +# Day 44: Relational Database Service in AWS + +Amazon Relational Database Service (Amazon RDS) is a collection of managed services that makes it simple to set up, operate, and scale databases in the cloud + +## Task-01 + +- Create a Free tier RDS instance of MySQL +- Create an EC2 instance +- Create an IAM role with RDS access +- Assign the role to EC2 so that your EC2 Instance can connect with RDS +- Once the RDS instance is up and running, get the credentials and connect your EC2 instance using a MySQL client. + +Hint: + +You should install mysql client on EC2, and connect the Host and Port of RDS with this client. + +Post the screenshots once your EC2 instance can connect a MySQL server, that will be a small win for you. + +Watch [this video](https://youtu.be/MrA6Rk1Y82E) for reference. + +Happy Learning + From 1e09b358d4cf98dc08fa972d98ca55a7ab0efc57 Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Tue, 14 Feb 2023 22:05:14 +0530 Subject: [PATCH 043/394] Added day 45 --- 2023/day45/tasks.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/2023/day45/tasks.md b/2023/day45/tasks.md index e69de29bb2..cf74143722 100644 --- a/2023/day45/tasks.md +++ b/2023/day45/tasks.md @@ -0,0 +1,17 @@ +# Day 45: Deploy Wordpress website on AWS + +Over 30% of all websites on the internet use WordPress as their content management system (CMS). It is most often used to run blogs, but it can also be used to run e-commerce sites, message boards, and many other popular things. This guide will show you how to set up a WordPress blog site. + + + +## Task-01 + +- As WordPress requires a MySQL database to store its data ,create an RDS as you did in Day 44 + +To configure this WordPress site, you will create the following resources in AWS: +- An Amazon EC2 instance to install and host the WordPress application. +- An Amazon RDS for MySQL database to store your WordPress data. +- Setup the server and post your new Wordpress app. + +Happy Learning :) + From 333e7ba7c2b932b4ebd250368aea9f0d55186bf2 Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Tue, 14 Feb 2023 22:07:38 +0530 Subject: [PATCH 044/394] Added day 45 --- 2023/day45/tasks.md | 1 + 1 file changed, 1 insertion(+) diff --git a/2023/day45/tasks.md b/2023/day45/tasks.md index cf74143722..a29eb03d32 100644 --- a/2023/day45/tasks.md +++ b/2023/day45/tasks.md @@ -13,5 +13,6 @@ To configure this WordPress site, you will create the following resources in AWS - An Amazon RDS for MySQL database to store your WordPress data. - Setup the server and post your new Wordpress app. +Read [this](https://aws.amazon.com/getting-started/hands-on/deploy-wordpress-with-amazon-rds/) for a detailed explanation Happy Learning :) From b5b45799a14ba663c92d7c823ee6048c50f95cf5 Mon Sep 17 00:00:00 2001 From: Sitabja Chatterjee <89836369+sitchatt@users.noreply.github.com> Date: Thu, 16 Feb 2023 15:08:29 +0530 Subject: [PATCH 045/394] Created Day-46 Task | CloudWatch & SNS --- 2023/day46/tasks.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/2023/day46/tasks.md b/2023/day46/tasks.md index e69de29bb2..fa3a12a918 100644 --- a/2023/day46/tasks.md +++ b/2023/day46/tasks.md @@ -0,0 +1,34 @@ +# Day-46: Set up CloudWatch alarms and SNS topic in AWS + +Hey learners, you have been using aws services atleast for last 45 days. Have you ever wondered what happen if for any service is charging you bill continously and you don't know till you loose all your pocket money ? + +Hahahaha😁, Well! we, as a responsible community ,always try to make it under free tier , but it's good to know and setup something , which will inform you whenever bill touches a Threshold. + +## What is Amazon CloudWatch? +Amazon CloudWatch monitors your Amazon Web Services (AWS) resources and the applications you run on AWS in real time. You can use CloudWatch to collect and track metrics, which are variables you can measure for your resources and applications. + +Read more about cloudwatch from the official documentation [here](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html) + + +## What is Amazon SNS? + +Amazon Simple Notification Service is a notification service provided as part of Amazon Web Services since 2010. It provides a low-cost infrastructure for mass delivery of messages, predominantly to mobile users. + +Read more about it [here](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) + + +## Task : + +- Create a CloudWatch alarm that monitors your billing and send an email to you when a it reaches $2. + +(You can keep it for your future use) + +- Delete your billing Alarm that you created now. + +(Now you also know how to delete as well. ) + +Need help with Cloudwatch? Check out this [official documentation](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html) for assistance. + +Keep growing your AWS knowledge💥🙌 + +Happy Learning! :) From fdd299ff523b85b0189e7250d617ec002228dd84 Mon Sep 17 00:00:00 2001 From: Sitabja Chatterjee <89836369+sitchatt@users.noreply.github.com> Date: Fri, 17 Feb 2023 22:42:59 +0530 Subject: [PATCH 046/394] Created Day48 Task | Overview and setting Up ECS --- 2023/day48/tasks.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/2023/day48/tasks.md b/2023/day48/tasks.md index e69de29bb2..76c6ae8e77 100644 --- a/2023/day48/tasks.md +++ b/2023/day48/tasks.md @@ -0,0 +1,40 @@ +# Day-48 - ECS + +Today will be a great learning for sure. I know many of you may not know about the term "ECS". As you know, 90 Days Of DevOps Challange is mostly about 'learning new' , let's learn then ;) + +## What is ECS ? +- ECS (Elastic Container Service) is a fully-managed container orchestration service provided by Amazon Web Services (AWS). It allows you to run and manage Docker containers on a cluster of virtual machines (EC2 instances) without having to manage the underlying infrastructure. + +With ECS, you can easily deploy, manage, and scale your containerized applications using the AWS Management Console, the AWS CLI, or the API. ECS supports both "Fargate" and "EC2 launch types", which means you can run your containers on AWS-managed infrastructure or your own EC2 instances. + +ECS also integrates with other AWS services, such as Elastic Load Balancing, Auto Scaling, and Amazon VPC, allowing you to build scalable and highly available applications. Additionally, ECS has support for Docker Compose and Kubernetes, making it easy to adopt existing container workflows. + +Overall, ECS is a powerful and flexible container orchestration service that can help simplify the deployment and management of containerized applications in AWS. + +## Difference between EKS and ECS ? +- EKS (Elastic Kubernetes Service) and ECS (Elastic Container Service) are both container orchestration platforms provided by Amazon Web Services (AWS). While both platforms allow you to run containerized applications in the AWS cloud, there are some differences between the two. + +**Architecture**: +ECS is based on a centralized architecture, where there is a control plane that manages the scheduling of containers on EC2 instances. On the other hand, EKS is based on a distributed architecture, where the Kubernetes control plane is distributed across multiple EC2 instances. + +**Kubernetes Support**: +EKS is a fully managed Kubernetes service, meaning that it supports Kubernetes natively and allows you to run your Kubernetes workloads on AWS without having to manage the Kubernetes control plane. ECS, on the other hand, has its own orchestration engine and does not support Kubernetes natively. + +**Scaling**: +EKS is designed to automatically scale your Kubernetes cluster based on demand, whereas ECS requires you to configure scaling policies for your tasks and services. + +**Flexibility**: +EKS provides more flexibility than ECS in terms of container orchestration, as it allows you to customize and configure Kubernetes to meet your specific requirements. ECS is more restrictive in terms of the options available for container orchestration. + +**Community**: +Kubernetes has a large and active open-source community, which means that EKS benefits from a wide range of community-driven development and support. ECS, on the other hand, has a smaller community and is largely driven by AWS itself. + +In summary, EKS is a good choice if you want to use Kubernetes to manage your containerized workloads on AWS, while ECS is a good choice if you want a simpler, more managed platform for running your containerized applications. + +# Task : +Set up ECS (Elastic Container Service) in AWS with cluster type as EC2 and configure it by installing Docker and the ECS agent. + + + + + From 024bcbbd66302477fb2f99467e3f9d477022f7e1 Mon Sep 17 00:00:00 2001 From: Rushikesh Mashidkar Date: Sat, 18 Feb 2023 08:13:47 +0530 Subject: [PATCH 047/394] Update tasks.md --- 2023/day47/tasks.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/2023/day47/tasks.md b/2023/day47/tasks.md index e69de29bb2..6c05ca3067 100644 --- a/2023/day47/tasks.md +++ b/2023/day47/tasks.md @@ -0,0 +1,19 @@ +# Day 47: Test Knowledge on aws 💻 📈 +Today, we will be test the aws knowledge on services in AWS, as part of the 90 Days of DevOps Challenge. + + +## Task-01 + +- Launch an EC2 instance using the AWS Management Console and connect to it using SSH. +- Install a web server on the EC2 instance and deploy a simple web application. +- Monitor the EC2 instance using Amazon CloudWatch and troubleshoot any issues that arise. + +## Task-02 +- Create an Auto Scaling group using the AWS Management Console and configure it to launch EC2 instances in response to changes in demand. +- Use Amazon CloudWatch to monitor the performance of the Auto Scaling group and the EC2 instances and troubleshoot any issues that arise. +- Use the AWS CLI to view the state of the Auto Scaling group and the EC2 instances and verify that the correct number of instances are running. + + +We hope that these tasks will give you hands-on experience with aws services and help you understand how these services work together. If you have any questions or face any issues while doing the tasks, please let us know. + +Happy Learning :) From 05634d3d365c83f5c5a66377a99e14175cd941cc Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Sun, 19 Feb 2023 21:10:41 +0530 Subject: [PATCH 048/394] Update tasks.md --- 2023/day48/tasks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2023/day48/tasks.md b/2023/day48/tasks.md index 76c6ae8e77..311d19ba10 100644 --- a/2023/day48/tasks.md +++ b/2023/day48/tasks.md @@ -32,7 +32,7 @@ Kubernetes has a large and active open-source community, which means that EKS be In summary, EKS is a good choice if you want to use Kubernetes to manage your containerized workloads on AWS, while ECS is a good choice if you want a simpler, more managed platform for running your containerized applications. # Task : -Set up ECS (Elastic Container Service) in AWS with cluster type as EC2 and configure it by installing Docker and the ECS agent. +Set up ECS (Elastic Container Service) by setting up Nginx on ECS. From 2e840137fdd9a713c7be7dc0da8e779e7c3426bc Mon Sep 17 00:00:00 2001 From: Sitabja Chatterjee <89836369+sitchatt@users.noreply.github.com> Date: Sun, 19 Feb 2023 22:17:14 +0530 Subject: [PATCH 049/394] Created Day-49 Task | AWS Interview Question --- 2023/day49/tasks.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/2023/day49/tasks.md b/2023/day49/tasks.md index e69de29bb2..2c94e34eb9 100644 --- a/2023/day49/tasks.md +++ b/2023/day49/tasks.md @@ -0,0 +1,23 @@ +# Day 49 - INTERVIEW QUESTIONS ON AWS + +Hey people, we have listened to your suggestions and we are looking forward to get more! +As you people have asked to put more interview based questions as part of Daily Task, So here it it :) + +## INTERVIEW QUESTIONS: +- Name 5 aws services you have used and what's the use cases? +- What are the tools used to send logs to the cloud environment? +- What are IAM Roles? How do you create /manage them? +- How to upgrade or downgrade a system with zero downtime? +- What is infrastructure as code and how do you use it? +- What is a load balancer? Give scenarios of each kind of balancer based on your experience. +- What is CloudFormation and why is it used for? +- Difference between AWS CloudFormation and AWS Elastic Beanstalk? +- What are the kinds of security attacks that can occur on the cloud? And how can we minimize them? +- Can we recover the EC2 instance when we have lost the key? +- What is a gateway? +- What is the difference between the Amazon Rds, Dynamodb, and Redshift? +- Do you prefer to host a website on S3? What's the reason if your answer is either yes or no? + + +Let's share your answer on LinkedIn in best possible way thinking you are in a interview table. +Happy Learning !! :) From 33c4407c3aa3faa4afd9c5c3f59c759ae3231505 Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Mon, 20 Feb 2023 23:01:01 +0530 Subject: [PATCH 050/394] added day 50 task --- 2023/day50/tasks.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/2023/day50/tasks.md b/2023/day50/tasks.md index e69de29bb2..d57c85f16d 100644 --- a/2023/day50/tasks.md +++ b/2023/day50/tasks.md @@ -0,0 +1,30 @@ +# Day 50: Your CI/CD pipeline on AWS 🚀 ☁ + +What if I tell you, in next 4 days, you'll be making a CI/CD pipeline on AWS with these tools. + +- CodeCommit +- CodeBuild +- CodeDeploy +- CodePipeline +- S3 + +## What is CodeCommit ? +- CodeCommit is a managed source control service by AWS that allows users to store, manage, and version their source code and artifacts securely and at scale. It supports Git, integrates with other AWS services, enables collaboration through branch and merge workflows, and provides audit logs and compliance reports to meet regulatory requirements and track changes. Overall, CodeCommit provides developers with a reliable and efficient way to manage their codebase and set up a CI/CD pipeline for their software development projects. + +# Task-01 : +- Set up a code repository on CodeCommit and clone it on your local. +- You need to setup GitCredentials in your AWS IAM. +- Use those credentials in your local and then clone the repository from CodeCommit + +# Task-02 : +- Add a new file from local and commit to your local branch +- Push the local changes to CodeCommit repository. + +For more details watch [this](https://youtu.be/p5i3cMCQ760) video. + +Happy Learning :) + + + + + From 2b1f1e2171e66fc3ff92fb71d69675ac4969839a Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Tue, 21 Feb 2023 23:50:09 +0530 Subject: [PATCH 051/394] Added code build tasks --- 2023/day50/tasks.md | 2 +- 2023/day51/tasks.md | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/2023/day50/tasks.md b/2023/day50/tasks.md index d57c85f16d..3e8796ab66 100644 --- a/2023/day50/tasks.md +++ b/2023/day50/tasks.md @@ -1,4 +1,4 @@ -# Day 50: Your CI/CD pipeline on AWS 🚀 ☁ +# Day 50: Your CI/CD pipeline on AWS - Part-1 🚀 ☁ What if I tell you, in next 4 days, you'll be making a CI/CD pipeline on AWS with these tools. diff --git a/2023/day51/tasks.md b/2023/day51/tasks.md index e69de29bb2..4544ac0c30 100644 --- a/2023/day51/tasks.md +++ b/2023/day51/tasks.md @@ -0,0 +1,30 @@ +# Day 51: Your CI/CD pipeline on AWS - Part 2 🚀 ☁ + +On your journey of making a CI/CD pipeline on AWS with these tools, you completed AWS CodeCommit. + +Next few days you'll learn these tools/services: + +- CodeBuild +- CodeDeploy +- CodePipeline +- S3 + +## What is CodeBuild ? +- AWS CodeBuild is a fully managed build service in the cloud. CodeBuild compiles your source code, runs unit tests, and produces artifacts that are ready to deploy. CodeBuild eliminates the need to provision, manage, and scale your own build servers. + +# Task-01 : +- Read about Buildspec file for Codebuild. +- create a simple index.html file in CodeCommit Repository +- you have to build the index.html using nginx server + +# Task-02 : +- Add buildspec.yaml file to CodeCommit Repository and complete the build process. + +For more details watch [this](https://youtu.be/p5i3cMCQ760) video. + +Happy Learning :) + + + + + From 3566ffb48be08f7bf8c244461a166c433f13ce8d Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Thu, 23 Feb 2023 00:18:53 +0530 Subject: [PATCH 052/394] Added day 52 --- 2023/day52/tasks.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/2023/day52/tasks.md b/2023/day52/tasks.md index e69de29bb2..c26b7221b2 100644 --- a/2023/day52/tasks.md +++ b/2023/day52/tasks.md @@ -0,0 +1,32 @@ +# Day 52: Your CI/CD pipeline on AWS - Part 3 🚀 ☁ + +On your journey of making a CI/CD pipeline on AWS with these tools, you completed AWS CodeCommit & CodeBuild. + +Next few days you'll learn these tools/services: + +- CodeDeploy +- CodePipeline +- S3 + +## What is CodeDeploy ? +- AWS CodeDeploy is a deployment service that automates application deployments to Amazon EC2 instances, on-premises instances, serverless Lambda functions, or Amazon ECS services. + + +CodeDeploy can deploy application content that runs on a server and is stored in Amazon S3 buckets, GitHub repositories, or Bitbucket repositories. CodeDeploy can also deploy a serverless Lambda function. You do not need to make changes to your existing code before you can use CodeDeploy. + +# Task-01 : +- Read about Appspec.yaml file for CodeDeploy. +- Deploy index.html file on EC2 machine using nginx +- you have to setup a CodeDeploy agent in order to deploy code on EC2 + +# Task-02 : +- Add appspec.yaml file to CodeCommit Repository and complete the deployment process. + +For more details watch [this](https://youtu.be/IUF-pfbYGvg) video. + +Happy Learning :) + + + + + From 93113118a2fd202dbb8ac44dfc1002b2fb9e28e0 Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Thu, 23 Feb 2023 23:30:39 +0530 Subject: [PATCH 053/394] Added day 53 --- 2023/day53/tasks.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/2023/day53/tasks.md b/2023/day53/tasks.md index e69de29bb2..27ee2502c8 100644 --- a/2023/day53/tasks.md +++ b/2023/day53/tasks.md @@ -0,0 +1,24 @@ +# Day 53: Your CI/CD pipeline on AWS - Part 4 🚀 ☁ + +On your journey of making a CI/CD pipeline on AWS with these tools, you completed AWS CodeCommit, CodeBuild & CodeDeploy. + +Finish Off in style with AWS CodePipeline + + +## What is CodePipeline ? +- CodePipeline builds, tests, and deploys your code every time there is a code change, based on the release process models you define. +Think of it as a CI/CD Pipeline service + + +# Task-01 : +- Create a Deployment group of Ec2 Instance. +- Create a CodePipeline that gets the code from CodeCommit, Builds the code using CodeBuild and deploys it to a Deployment Group. + +For more details watch [this](https://youtu.be/IUF-pfbYGvg) video. + +Happy Learning :) + + + + + From bf425bb92fd9c4b87deeec065ef34bb5f2c46204 Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Sat, 25 Feb 2023 00:07:16 +0530 Subject: [PATCH 054/394] Added day 54 --- 2023/day54/tasks.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/2023/day54/tasks.md b/2023/day54/tasks.md index e69de29bb2..cf037be2a6 100644 --- a/2023/day54/tasks.md +++ b/2023/day54/tasks.md @@ -0,0 +1,17 @@ +# Day 54: Understanding Infrastructure as Code and Configuration Management + +## What's the difference bhaiyya? + +When it comes to the cloud, Infrastructure as Code (IaC) and Configuration Management (CM) are inseparable. With IaC, a descriptive model is used for infrastructure management. To name a few examples of infrastructure: networks, virtual computers, and load balancers. Using an IaC model always results in the same setting. + +Throughout the lifecycle of a product, Configuration Management (CM) ensures that the performance, functional and physical inputs, requirements, design, and operations of that product remain consistent. + +# Task-01 + +- Read more about IaC and Config. Management Tools +- Give differences on both with suitable examples +- What are most commont IaC and Config management Tools? + +Write a blog on this topic in the most creative way and post it on linkedIn :) + +happy learning... \ No newline at end of file From 302043e9413fe3c205149c1f2ceaaff0667ac7b8 Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Sun, 26 Feb 2023 00:13:12 +0530 Subject: [PATCH 055/394] Added day 55 --- 2023/day55/tasks.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/2023/day55/tasks.md b/2023/day55/tasks.md index e69de29bb2..3a727c7bf1 100644 --- a/2023/day55/tasks.md +++ b/2023/day55/tasks.md @@ -0,0 +1,26 @@ +# Day 55: Understanding Configuration Management with Ansible + +## What's this Ansible? + +Ansible is an open-source automation tool, or platform, used for IT tasks such as configuration management, application deployment, intraservice orchestration, and provisioning + +# Task-01 +- Installation of Ansible on AWS EC2 (Master Node) +`sudo apt-add-repository ppa:ansible/ansible` `sudo apt update` +`sudo apt install ansible` + +# Task-02 +- read more about Hosts file +`sudo nano /etc/ansible/hosts ansible-inventory --list -y` + + +# Task-03 + +- Setup 2 more EC2 instances with same Private keys as the previous instance (Node) +- Copy the private key to master server where Ansible is setup +- Try a ping command using ansible to the Nodes. + + +Write a blog on this topic with screenshots in the most creative way and post it on linkedIn :) + +happy learning... \ No newline at end of file From bd421c10aa75a9264e3a06021ba8bc3412219867 Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Sun, 26 Feb 2023 23:45:06 +0530 Subject: [PATCH 056/394] added ansible adhoc commands --- 2023/day56/tasks.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/2023/day56/tasks.md b/2023/day56/tasks.md index e69de29bb2..3c9de5bac2 100644 --- a/2023/day56/tasks.md +++ b/2023/day56/tasks.md @@ -0,0 +1,16 @@ +# Day 56: Understanding Ad-hoc comands in Ansible + +Ansible ad hoc commands are one-liners designed to achieve a very specific task they are like quick snippets and your compact swiss army knife when you want to do a quick task across multiple machines. + +To put simply, Ansible ad hoc commands are one-liner Linux shell commands and playbooks are like a shell script, a collective of many commands with logic. + +Ansible ad hoc commands come handy when you want to perform a quick task. + +# Task-01 + +- write an ansible ad hoc ping command to ping 3 servers from inventory file +- Write an ansible ad hoc command to check uptime + +- You can refer to [this](https://www.middlewareinventory.com/blog/ansible-ad-hoc-commands/) blog to understand the different examples of ad-hoc commands and try out them, post the screenshots in a blog with an explanation. + +happy Learning :) \ No newline at end of file From ee14bef7aab76405682c7a388ea32c62b8332a38 Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Sun, 26 Feb 2023 23:47:54 +0530 Subject: [PATCH 057/394] added ansible adhoc commands --- 2023/day56/tasks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2023/day56/tasks.md b/2023/day56/tasks.md index 3c9de5bac2..bdb95b6670 100644 --- a/2023/day56/tasks.md +++ b/2023/day56/tasks.md @@ -1,4 +1,4 @@ -# Day 56: Understanding Ad-hoc comands in Ansible +# Day 56: Understanding Ad-hoc commands in Ansible Ansible ad hoc commands are one-liners designed to achieve a very specific task they are like quick snippets and your compact swiss army knife when you want to do a quick task across multiple machines. From 86fe269ceab99d8969858cfcbac07b7cb081f54b Mon Sep 17 00:00:00 2001 From: NarayanadasuRakesh <126420803+NarayanadasuRakesh@users.noreply.github.com> Date: Mon, 27 Feb 2023 02:11:54 +0530 Subject: [PATCH 058/394] Update basic_linux_commands.md Spelling mistake (chnage) --- 2023/day02/basic_linux_commands.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2023/day02/basic_linux_commands.md b/2023/day02/basic_linux_commands.md index e260f0a5d8..24bb7fe1e3 100644 --- a/2023/day02/basic_linux_commands.md +++ b/2023/day02/basic_linux_commands.md @@ -21,7 +21,7 @@ Examples: - ``` cd - ``` --> Go to the last working directory. -- ``` cd ..``` --> chnage directory to one step back. +- ``` cd ..``` --> change directory to one step back. - ``` cd ../..``` --> Change directory to 2 levels back. From 84a5e9b92356fc47b8e785ac6e1abce8049ccdda Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Mon, 27 Feb 2023 23:38:12 +0530 Subject: [PATCH 059/394] added day 57 --- 2023/day57/tasks.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/2023/day57/tasks.md b/2023/day57/tasks.md index e69de29bb2..5f3d8cd2f1 100644 --- a/2023/day57/tasks.md +++ b/2023/day57/tasks.md @@ -0,0 +1,12 @@ +# Day 57: Ansible Hands-on with video + +Ansible is fun, you saw in last few days how easy it is. + +Let's make it fun now, by using a video explanation for Ansible. + +# Task-01 + +- Write a Blog explanation for the [ansible video](https://youtu.be/SGB7EdiP39E) + + +happy Learning :) \ No newline at end of file From 8bb7e5ea9c8e28c19c7f3fac5dca61aeb22b5730 Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Wed, 1 Mar 2023 01:28:43 +0530 Subject: [PATCH 060/394] added day 58 ansible playbooks --- 2023/day58/tasks.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/2023/day58/tasks.md b/2023/day58/tasks.md index e69de29bb2..da4793a84c 100644 --- a/2023/day58/tasks.md +++ b/2023/day58/tasks.md @@ -0,0 +1,21 @@ +# Day 57: Ansible Playbooks + +Ansible playbooks run multiple tasks, assign roles, and define configurations, deployment steps, and variables. If you’re using multiple servers, Ansible playbooks organize the steps between the assembled machines or servers and get them organized and running in the way the users need them to. Consider playbooks as the equivalent of instruction manuals. + +# Task-01 + +- Write an ansible playbook to create a file on a different server + +- Write an ansible playbook to create a new user. + +- Write an ansible playbook to install docker on a group of servers + +Watch [this](https://youtu.be/089mRKoJTzo) video to learn about ansible Playbooks + +# Task-02 + +- Write a blog about writing ansible playbooks with the best practices. + +Let me or anyone in the community know if you face any challenges + +happy Learning :) \ No newline at end of file From 150e9bbe7cc4c837034d84db0cd272fb883429e5 Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Wed, 1 Mar 2023 23:49:57 +0530 Subject: [PATCH 061/394] Added ansible project --- 2023/day59/tasks.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/2023/day59/tasks.md b/2023/day59/tasks.md index e69de29bb2..64df85cf09 100644 --- a/2023/day59/tasks.md +++ b/2023/day59/tasks.md @@ -0,0 +1,26 @@ +# Day 57: Ansible Project 🔥 + +Ansible playbooks are amazing, as you learned yesterday. +What if you deploy a simple web app using ansible, sounds like a good project, right? + +# Task-01 + +- create 3 EC2 instances . make sure all three are created with same key pair + +- Install Ansible in host server + +- copy the private key from local to Host server (Ansible_host) at (/home/ubuntu/.ssh) + +- access the inventory file using sudo vim /etc/ansible/hosts + +- Create a playbook to install Nginx + +- deploy a sample webpage using the ansible playbook + +Read [this](https://medium.com/@sandeep010498/learn-ansible-with-real-time-project-cf6a0a512d45) Blog by [Sandeep Singh](https://medium.com/@sandeep010498) to clear all your doubts + + + +Let me or anyone in the community know if you face any challenges + +happy Learning :) \ No newline at end of file From 1eb697ed5e751573b6fa3025842a988f9a914b4c Mon Sep 17 00:00:00 2001 From: Vaishnavi Shinde <61554336+Vaishvs@users.noreply.github.com> Date: Thu, 2 Mar 2023 22:36:01 +0530 Subject: [PATCH 062/394] Update tasks.md --- 2023/day60/tasks.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/2023/day60/tasks.md b/2023/day60/tasks.md index e69de29bb2..4fd1b21cc9 100644 --- a/2023/day60/tasks.md +++ b/2023/day60/tasks.md @@ -0,0 +1,24 @@ +# Day 58- Terraform🔥 +Hello Learners , you guys are doing every task by creating an ec2 instance (mostly). Today let’s automate this process . How to do it ? Well Terraform is the solution . +## What is Terraform? + Terraform is an infrastructure as code (IaC) tool that allows you to create, manage, and update infrastructure + resources such as virtual machines, networks, and storage in a repeatable, scalable, and automated way. + + +## Task 1: +Install Terraform on your system +Refer this [link](https://phoenixnap.com/kb/how-to-install-terraform) for installation + +## Task 2: Answer below questions +- Why we use terraform? +- What is Infrastructure as Code (IaC)? +- What is Resource? +- What is Provider? +- Whats is State file in terraform? What’s the importance of it ? +- What is Desired and Current State? + +You can prepare for tomorrow's task from [here](https://www.youtube.com/live/965CaSveIEI?feature=share)🚀🚀 + +We Hope this tasks will help you understand how to write a basic Terraform configuration file, how to authenticate with AWS, and how to create an EC2 instance. +Don’t forget to post in on LinkedIn. +Happy Learning:) From dbfce1ff2c7c3ae508286d6dad369c7748834d78 Mon Sep 17 00:00:00 2001 From: Rashi Chaubal <12rashic@gmail.com> Date: Fri, 3 Mar 2023 15:34:35 +0530 Subject: [PATCH 063/394] Added Day 61 Task --- 2023/day61/tasks.md | 46 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/2023/day61/tasks.md b/2023/day61/tasks.md index e69de29bb2..872494ef80 100644 --- a/2023/day61/tasks.md +++ b/2023/day61/tasks.md @@ -0,0 +1,46 @@ +Day 61- Terraform🔥 + +Hope you've already got the gist of What Working with Terraform would be like . Lets begin +with day 2 of Terraform ! + + + +Task 1: +find purpose of basic Terraform commands which you'll use often + +1. `terraform init` + +2. `terraform init -upgrade` + +3.`terraform plan` + +4.`terraform apply` + +5.`terraform validate` + +6.`terraform fmt` + +7. `terraform destroy` + + + +Task 2: + Create a folder and use `Terraform Init` command. +- Create 2 EC2 instances(t2.micro) with Ubuntu AMI with a single terraform script . + Rest keep in default as of now. +- Use `terraform Destroy` command as you learned above and stop the EC2 instance. + + + + +Also along with these tasks its important to know about Terraform in general- +Who are Terraform's main competitors? +The main competitors are: + +Ansible +Packer +Cloud Foundry +Kubernetes + + +Don't forget to share your learnings on Linkedin ! Happy Learning :) From cb31a12c157ef9129a815a16a163321ea96f4290 Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Sat, 4 Mar 2023 23:35:20 +0530 Subject: [PATCH 064/394] Added Terraform Tasks for Day 62 --- 2023/day58/tasks.md | 2 +- 2023/day59/tasks.md | 2 +- 2023/day60/tasks.md | 3 +- 2023/day61/tasks.md | 19 ++++++------ 2023/day62/tasks.md | 70 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 84 insertions(+), 12 deletions(-) diff --git a/2023/day58/tasks.md b/2023/day58/tasks.md index da4793a84c..f59b59184d 100644 --- a/2023/day58/tasks.md +++ b/2023/day58/tasks.md @@ -1,4 +1,4 @@ -# Day 57: Ansible Playbooks +# Day 58: Ansible Playbooks Ansible playbooks run multiple tasks, assign roles, and define configurations, deployment steps, and variables. If you’re using multiple servers, Ansible playbooks organize the steps between the assembled machines or servers and get them organized and running in the way the users need them to. Consider playbooks as the equivalent of instruction manuals. diff --git a/2023/day59/tasks.md b/2023/day59/tasks.md index 64df85cf09..deabdbacd7 100644 --- a/2023/day59/tasks.md +++ b/2023/day59/tasks.md @@ -1,4 +1,4 @@ -# Day 57: Ansible Project 🔥 +# Day 59: Ansible Project 🔥 Ansible playbooks are amazing, as you learned yesterday. What if you deploy a simple web app using ansible, sounds like a good project, right? diff --git a/2023/day60/tasks.md b/2023/day60/tasks.md index 4fd1b21cc9..20b77cfd56 100644 --- a/2023/day60/tasks.md +++ b/2023/day60/tasks.md @@ -1,4 +1,4 @@ -# Day 58- Terraform🔥 +# Day 60 - Terraform🔥 Hello Learners , you guys are doing every task by creating an ec2 instance (mostly). Today let’s automate this process . How to do it ? Well Terraform is the solution . ## What is Terraform? Terraform is an infrastructure as code (IaC) tool that allows you to create, manage, and update infrastructure @@ -20,5 +20,6 @@ Refer this [link](https://phoenixnap.com/kb/how-to-install-terraform) for instal You can prepare for tomorrow's task from [here](https://www.youtube.com/live/965CaSveIEI?feature=share)🚀🚀 We Hope this tasks will help you understand how to write a basic Terraform configuration file, how to authenticate with AWS, and how to create an EC2 instance. + Don’t forget to post in on LinkedIn. Happy Learning:) diff --git a/2023/day61/tasks.md b/2023/day61/tasks.md index 872494ef80..ac75b19205 100644 --- a/2023/day61/tasks.md +++ b/2023/day61/tasks.md @@ -1,34 +1,34 @@ -Day 61- Terraform🔥 +# Day 61- Terraform🔥 Hope you've already got the gist of What Working with Terraform would be like . Lets begin with day 2 of Terraform ! -Task 1: +## Task 1: find purpose of basic Terraform commands which you'll use often 1. `terraform init` 2. `terraform init -upgrade` -3.`terraform plan` +3. `terraform plan` -4.`terraform apply` +4. `terraform apply` -5.`terraform validate` +5. `terraform validate` -6.`terraform fmt` +6. `terraform fmt` 7. `terraform destroy` -Task 2: - Create a folder and use `Terraform Init` command. +## Task 2: + Create a folder and use `terraform init` command. - Create 2 EC2 instances(t2.micro) with Ubuntu AMI with a single terraform script . Rest keep in default as of now. -- Use `terraform Destroy` command as you learned above and stop the EC2 instance. +- Use `terraform destroy` command as you learned above and stop the EC2 instance. @@ -42,5 +42,6 @@ Packer Cloud Foundry Kubernetes +Want a Free video Course for terraform? Click [here](https://bit.ly/tws-terraform) Don't forget to share your learnings on Linkedin ! Happy Learning :) diff --git a/2023/day62/tasks.md b/2023/day62/tasks.md index e69de29bb2..cc62914995 100644 --- a/2023/day62/tasks.md +++ b/2023/day62/tasks.md @@ -0,0 +1,70 @@ +# Day 62 - Terraform with Docker 🔥 + +Terraform needs to be told which provider to be used in the automation, hence we need to give the provider name with source and version. +For Docker, we can use this block of code in your main.tf + +## Blocks and Resources in Terraform + +## Terraform block + +## Task-01 +- Create a Terraform script with Blocks and Resources + +``` +terraform { + required_providers { + docker = { + source = "kreuzwerker/docker" + version = "~> 2.21.0" +} +} +} +``` +### Note: kreuzwerker/docker, is shorthand for registry.terraform.io/kreuzwerker/docker. + +## Provider Block +The provider block configures the specified provider, in this case, docker. A provider is a plugin that Terraform uses to create and manage your resources. + +``` +provider "docker" {} +``` + +## Resource +Use resource blocks to define components of your infrastructure. A resource might be a physical or virtual component such as a Docker container, or it can be a logical resource such as a Heroku application. + +Resource blocks have two strings before the block: the resource type and the resource name. In this example, the first resource type is docker_image and the name is Nginx. + +## Task-02 +- Create a resource Block for an nginx docker image + +Hint: +``` +resource "docker_image" "nginx" { + name = "nginx:latest" + keep_locally = false +} +``` +- Create a resource Block for running a docker container for nginx + +``` +resource "docker_container" "nginx" { + image = docker_image.nginx.latest + name = "tutorial" + ports { + internal = 80 + external = 80 + } +} +``` + +Note: In case Docker is not installed + +`sudo apt-get install docker.io` +`sudo docker ps` +`sudo chown $USER /var/run/docker.sock` + +# Video Course + +I can imagine, Terraform can be tricky, so best to use a Free video Course for terraform [here](https://bit.ly/tws-terraform) + +Happy Learning :) \ No newline at end of file From a385b524075a3e768fc7cd2f429590b13a4fa06e Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Sat, 4 Mar 2023 23:37:08 +0530 Subject: [PATCH 065/394] Update tasks.md --- 2023/day62/tasks.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2023/day62/tasks.md b/2023/day62/tasks.md index cc62914995..496f819f2b 100644 --- a/2023/day62/tasks.md +++ b/2023/day62/tasks.md @@ -1,4 +1,4 @@ -# Day 62 - Terraform with Docker 🔥 +# Day 62 - Terraform and Docker 🔥 Terraform needs to be told which provider to be used in the automation, hence we need to give the provider name with source and version. For Docker, we can use this block of code in your main.tf @@ -67,4 +67,4 @@ Note: In case Docker is not installed I can imagine, Terraform can be tricky, so best to use a Free video Course for terraform [here](https://bit.ly/tws-terraform) -Happy Learning :) \ No newline at end of file +Happy Learning :) From 1451ef98093c48de07cb15444a2f68d550c0f5e8 Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Mon, 6 Mar 2023 00:01:41 +0530 Subject: [PATCH 066/394] Update tasks.md --- 2023/day61/tasks.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/2023/day61/tasks.md b/2023/day61/tasks.md index ac75b19205..432b09761e 100644 --- a/2023/day61/tasks.md +++ b/2023/day61/tasks.md @@ -24,15 +24,6 @@ find purpose of basic Terraform commands which you'll use often -## Task 2: - Create a folder and use `terraform init` command. -- Create 2 EC2 instances(t2.micro) with Ubuntu AMI with a single terraform script . - Rest keep in default as of now. -- Use `terraform destroy` command as you learned above and stop the EC2 instance. - - - - Also along with these tasks its important to know about Terraform in general- Who are Terraform's main competitors? The main competitors are: From 045bd6371a7ec55bec518faceb911bdb19dab44f Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Mon, 6 Mar 2023 00:10:28 +0530 Subject: [PATCH 067/394] Added day 63 terraform variables --- 2023/day63/tasks.md | 60 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/2023/day63/tasks.md b/2023/day63/tasks.md index e69de29bb2..282a77f776 100644 --- a/2023/day63/tasks.md +++ b/2023/day63/tasks.md @@ -0,0 +1,60 @@ +# Day 63 - Terraform Variables + +variables in Terraform are quite important, as you need to hold values of names of instance, configs , etc. + +We can create a variables.tf file which will hold all the variables. + +``` +variable "filename" { +default = "/home/ubuntu/terrform-tutorials/terraform-variables/demo-var.txt" +} +``` +``` +variable "content" { +default = "This is coming from a variable which was updated" +} +``` +These variables can be accessed by var object in main.tf + +## Task-01 + +- Create a local file using Terraform +Hint: +``` +resource "local_file" "devops" { +filename = var.filename +content = var.content +} +``` + +## Data Types in Terraform + +## Map +``` +variable "file_contents" { +type = map +default = { +"statement1" = "this is cool" +"statement2" = "this is cooler" +} +} +``` + +## Task-02 + +- Use terraform to demonstrate usage of List, Set and Object datatypes +- Put proper screenshots of the outputs + + +Use `terraform refresh` + +To refresh the state by your configuration file, reloads the variables + + + + +# Video Course + +I can imagine, Terraform can be tricky, so best to use a Free video Course for terraform [here](https://bit.ly/tws-terraform) + +Happy Learning :) From 777c18170bcea9f0e3c7a90000428c4d4940627d Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Mon, 6 Mar 2023 23:41:39 +0530 Subject: [PATCH 068/394] added terraform with aws --- 2023/day60/tasks.md | 2 +- 2023/day64/tasks.md | 64 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/2023/day60/tasks.md b/2023/day60/tasks.md index 20b77cfd56..9ae7ca2bcb 100644 --- a/2023/day60/tasks.md +++ b/2023/day60/tasks.md @@ -19,7 +19,7 @@ Refer this [link](https://phoenixnap.com/kb/how-to-install-terraform) for instal You can prepare for tomorrow's task from [here](https://www.youtube.com/live/965CaSveIEI?feature=share)🚀🚀 -We Hope this tasks will help you understand how to write a basic Terraform configuration file, how to authenticate with AWS, and how to create an EC2 instance. +We Hope this tasks will help you understand how to write a basic Terraform configuration file and basic commands on Terraform. Don’t forget to post in on LinkedIn. Happy Learning:) diff --git a/2023/day64/tasks.md b/2023/day64/tasks.md index e69de29bb2..33a01e89e3 100644 --- a/2023/day64/tasks.md +++ b/2023/day64/tasks.md @@ -0,0 +1,64 @@ +# Day 64 - Terraform with AWS + +Provisioning on AWS is quite easy and straightforward with Terraform. + + +## Prerequisites +### AWS CLI installed + +The AWS Command Line Interface (AWS CLI) is a unified tool to manage your AWS services. With just one tool to download and configure, you can control multiple AWS services from the command line and automate them through scripts. + +### AWS IAM user + +IAM (Identity Access Management) AWS Identity and Access Management (IAM) is a web service that helps you securely control access to AWS resources. You use IAM to control who is authenticated (signed in) and authorized (has permissions) to use resources. + +*In order to connect your AWS account and Terraform, you need the access keys and secret access keys exported to your machine.* + +``` +export AWS_ACCESS_KEY_ID= +export AWS_SECRET_ACCESS_KEY= +``` + +### Install required providers + +``` +terraform { + required_providers { + aws = { + source = "hashicorp/aws" + version = "~> 4.16" +} +} + required_version = ">= 1.2.0" +} +``` +Add the region where you want your instances to be +``` +provider "aws" { +region = "us-east-1" +} +``` + +## Task-01 + +- Provision an AWS EC2 instance using Terraform + +Hint: + +``` +resource "aws_instance" "aws_ec2_test" { + count = 4 + ami = "ami-08c40ec9ead489470" + instance_type = "t2.micro" + tags = { + Name = "TerraformTestServerInstance" + } +} +``` + +# Video Course + +I can imagine, Terraform can be tricky, so best to use a Free video Course for terraform [here](https://bit.ly/tws-terraform) + +Happy Learning :) + From b6670fd57febc50e37ba4f0bd09b899814198bd8 Mon Sep 17 00:00:00 2001 From: Rushikesh Mashidkar Date: Tue, 7 Mar 2023 15:33:43 +0530 Subject: [PATCH 069/394] Update tasks.md --- 2023/day65/tasks.md | 56 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/2023/day65/tasks.md b/2023/day65/tasks.md index e69de29bb2..85d342d854 100644 --- a/2023/day65/tasks.md +++ b/2023/day65/tasks.md @@ -0,0 +1,56 @@ +# Day 65 - Working with Terraform Resources 🚀 +Yesterday, we saw how to create a Terraform script with Blocks and Resources. Today, we will dive deeper into Terraform resources. + +## Understanding Terraform Resources +A resource in Terraform represents a component of your infrastructure, such as a physical server, a virtual machine, a DNS record, or an S3 bucket. Resources have attributes that define their properties and behaviors, such as the size and location of a virtual machine or the domain name of a DNS record. + +When you define a resource in Terraform, you specify the type of resource, a unique name for the resource, and the attributes that define the resource. Terraform uses the resource block to define resources in your Terraform configuration. + +## Task 1: Create a security group +To allow traffic to the EC2 instance, you need to create a security group. Follow these steps: + +In your main.tf file, add the following code to create a security group: +``` +resource "aws_security_group" "web_server" { + name_prefix = "web-server-sg" + + ingress { + from_port = 80 + to_port = 80 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + } +} +``` +- Run terraform init to initialize the Terraform project. + +- Run terraform apply to create the security group. + +## Task 2: Create an EC2 instance +- Now you can create an EC2 instance with Terraform. Follow these steps: + +- In your main.tf file, add the following code to create an EC2 instance: +``` +resource "aws_instance" "web_server" { + ami = "ami-0557a15b87f6559cf" + instance_type = "t2.micro" + key_name = "my-key-pair" + security_groups = [ + aws_security_group.web_server.name + ] + + user_data = <<-EOF + #!/bin/bash + echo "

Welcome to my website!

" > index.html + nohup python -m SimpleHTTPServer 80 & + EOF +} +``` +Note: Replace the ami and key_name values with your own. You can find a list of available AMIs in the AWS documentation. + +Run terraform apply to create the EC2 instance. + +## Task 3: Access your website +- Now that your EC2 instance is up and running, you can access the website you just hosted on it. Follow these steps: + +Happy Terraforming! From 1c88e61203c4d98dc9c649ec4d1dd95a575d913e Mon Sep 17 00:00:00 2001 From: Rushikesh Mashidkar Date: Wed, 8 Mar 2023 23:37:34 +0530 Subject: [PATCH 070/394] Update tasks.md --- 2023/day66/tasks.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/2023/day66/tasks.md b/2023/day66/tasks.md index e69de29bb2..a686c57e12 100644 --- a/2023/day66/tasks.md +++ b/2023/day66/tasks.md @@ -0,0 +1,23 @@ +# Day 66 - Terraform Hands-on Project - Build Your Own AWS Infrastructure with Ease using Infrastructure as Code (IaC) Techniques(Interview Questions) ☁️ + +Welcome back to your Terraform journey. + +In the previous tasks, you have learned about the basics of Terraform, its configuration file, and creating an EC2 instance using Terraform. Today, we will explore more about Terraform and create multiple resources. + +## Task: +- Create a VPC (Virtual Private Cloud) with CIDR block 10.0.0.0/16 +- Create a public subnet with CIDR block 10.0.1.0/24 in the above VPC. +- Create a private subnet with CIDR block 10.0.2.0/24 in the above VPC. +- Create an Internet Gateway (IGW) and attach it to the VPC. +- Create a route table for the public subnet and associate it with the public subnet. This route table should have a route to the Internet Gateway. +- Launch an EC2 instance in the public subnet with the following details: +- AMI: ami-0557a15b87f6559cf +- Instance type: t2.micro +- Security group: Allow SSH access from anywhere +- User data: Use a shell script to install Apache and host a simple website +- Create an Elastic IP and associate it with the EC2 instance. +- Open the website URL in a browser to verify that the website is hosted successfully. + +#### This Terraform hands-on task is designed to test your proficiency in using Terraform for Infrastructure as Code (IaC) on AWS. You will be tasked with creating a VPC, subnets, an internet gateway, and launching an EC2 instance with a web server running on it. This task will showcase your skills in automating infrastructure deployment using Terraform. It's a popular interview question for companies looking for candidates with hands-on experience in Terraform. That's it for today. + +Happy Terraforming:) From db2c9185786f73bcee13622a49c8eceb413d44f7 Mon Sep 17 00:00:00 2001 From: Rushikesh Mashidkar Date: Fri, 10 Mar 2023 23:35:51 +0530 Subject: [PATCH 071/394] Update tasks.md --- 2023/day67/tasks.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/2023/day67/tasks.md b/2023/day67/tasks.md index e69de29bb2..af5d810aae 100644 --- a/2023/day67/tasks.md +++ b/2023/day67/tasks.md @@ -0,0 +1,18 @@ +# Day 67: AWS S3 Bucket Creation and Management +## AWS S3 Bucket + +Amazon S3 (Simple Storage Service) is an object storage service that offers industry-leading scalability, data availability, security, and performance. It can be used for a variety of use cases, such as storing and retrieving data, hosting static websites, and more. + +In this task, you will learn how to create and manage S3 buckets in AWS. + +## Task +- Create an S3 bucket using Terraform. +- Configure the bucket to allow public read access. +- Create an S3 bucket policy that allows read-only access to a specific IAM user or role. +- Enable versioning on the S3 bucket. + +## Resources + +[Terraform S3 bucket resource](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket) + +Good luck and happy learning! From fbcddf2d68b88506f81a2911c9c27a9e3c03b778 Mon Sep 17 00:00:00 2001 From: Rushikesh Mashidkar Date: Sat, 11 Mar 2023 22:41:58 +0530 Subject: [PATCH 072/394] Update tasks.md --- 2023/day68/tasks.md | 60 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/2023/day68/tasks.md b/2023/day68/tasks.md index e69de29bb2..ee53e04797 100644 --- a/2023/day68/tasks.md +++ b/2023/day68/tasks.md @@ -0,0 +1,60 @@ +# Day 68 - Scaling with Terraform 🚀 +Yesterday, we learned how to AWS S3 Bucket with Terraform. Today, we will see how to scale our infrastructure with Terraform. + +## Understanding Scaling +Scaling is the process of adding or removing resources to match the changing demands of your application. As your application grows, you will need to add more resources to handle the increased load. And as the load decreases, you can remove the extra resources to save costs. + +Terraform makes it easy to scale your infrastructure by providing a declarative way to define your resources. You can define the number of resources you need and Terraform will automatically create or destroy the resources as needed. + +## Task 1: Create an Auto Scaling Group +Auto Scaling Groups are used to automatically add or remove EC2 instances based on the current demand. Follow these steps to create an Auto Scaling Group: + +- In your main.tf file, add the following code to create an Auto Scaling Group: +``` +resource "aws_launch_configuration" "web_server_as" { + image_id = "ami-005f9685cb30f234b" + instance_type = "t2.micro" + security_groups = [aws_security_group.web_server.name] + + user_data = <<-EOF + #!/bin/bash + echo "

You're doing really Great

" > index.html + nohup python -m SimpleHTTPServer 80 & + EOF +} + +resource "aws_autoscaling_group" "web_server_asg" { + name = "web-server-asg" + launch_configuration = aws_launch_configuration.web_server_lc.name + min_size = 1 + max_size = 3 + desired_capacity = 2 + health_check_type = "EC2" + load_balancers = [aws_elb.web_server_lb.name] + vpc_zone_identifier = [aws_subnet.public_subnet_1a.id, aws_subnet.public_subnet_1b.id] +} + + +``` + +- Run terraform apply to create the Auto Scaling Group. + + +## Task 2: Test Scaling +- Go to the AWS Management Console and select the Auto Scaling Groups service. + +- Select the Auto Scaling Group you just created and click on the "Edit" button. + +- Increase the "Desired Capacity" to 3 and click on the "Save" button. + +- Wait a few minutes for the new instances to be launched. + +- Go to the EC2 Instances service and verify that the new instances have been launched. + +- Decrease the "Desired Capacity" to 1 and wait a few minutes for the extra instances to be terminated. + +- Go to the EC2 Instances service and verify that the extra instances have been terminated. + +Congratulations🎊🎉 You have successfully scaled your infrastructure with Terraform. + +Happy Learning :) From 34a6127c832a853a2d30846f9b2da8f7bfc0152b Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Tue, 14 Mar 2023 00:41:01 +0530 Subject: [PATCH 073/394] added task 69 --- 2023/day69/tasks.md | 204 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 204 insertions(+) diff --git a/2023/day69/tasks.md b/2023/day69/tasks.md index e69de29bb2..4fa53e9de3 100644 --- a/2023/day69/tasks.md +++ b/2023/day69/tasks.md @@ -0,0 +1,204 @@ + +# Day 69 - Meta-Arguments in Terraform + + + +When you define a resource block in Terraform, by default, this specifies one resource that will be created. To manage several of the same resources, you can use either count or for_each, which removes the need to write a separate block of code for each one. Using these options reduces overhead and makes your code neater. + + + +count is what is known as a ‘meta-argument’ defined by the Terraform language. Meta-arguments help achieve certain requirements within the resource block. + + + +## Count + + + +The count meta-argument accepts a whole number and creates the number of instances of the resource specified. + + + +When each instance is created, it has its own distinct infrastructure object associated with it, so each can be managed separately. When the configuration is applied, each object can be created, destroyed, or updated as appropriate. + + + +eg. + + + +``` + +terraform { + +required_providers { + +aws = { + +source = "hashicorp/aws" + +version = "~> 4.16" + +} + +} + +required_version = ">= 1.2.0" + +} + + + +provider "aws" { + +region = "us-east-1" + +} + + + +resource "aws_instance" "server" { + +count = 4 + + + +ami = "ami-08c40ec9ead489470" + +instance_type = "t2.micro" + + + +tags = { + +Name = "Server ${count.index}" + +} + +} + + + +``` + + + +## for_each + + + +Like the count argument, the for_each meta-argument creates multiple instances of a module or resource block. However, instead of specifying the number of resources, the for_each meta-argument accepts a map or a set of strings. This is useful when multiple resources are required that have different values. Consider our Active directory groups example, with each group requiring a different owner. + + + + +``` + +terraform { + +required_providers { + +aws = { + +source = "hashicorp/aws" + +version = "~> 4.16" + +} + +} + +required_version = ">= 1.2.0" + +} + + + +provider "aws" { + +region = "us-east-1" + +} + + + +locals { + +ami_ids = toset([ + +"ami-0b0dcb5067f052a63", + +"ami-08c40ec9ead489470", + +]) + +} + + + +resource "aws_instance" "server" { + +for_each = local.ami_ids + + + +ami = each.key + +instance_type = "t2.micro" + +tags = { + +Name = "Server ${each.key}" + +} + +} + + + +Multiple key value iteration + +locals { + +ami_ids = { + +"linux" :"ami-0b0dcb5067f052a63", + +"ubuntu": "ami-08c40ec9ead489470", + +} + +} + + + +resource "aws_instance" "server" { + +for_each = local.ami_ids + + + +ami = each.value + +instance_type = "t2.micro" + + + +tags = { + +Name = "Server ${each.key}" + +} + +} + +``` + + + +## Task-01 + +- Create the above Infrastructure as code and demonstrate the use of Count and for_each. +- Write about meta-arguments and its use in Terraform. + +Happy learning :) \ No newline at end of file From 4e753dfb8d6554212fafbd7d8147884bae4392f2 Mon Sep 17 00:00:00 2001 From: Varsha Verma <55032759+Varsha-Verma@users.noreply.github.com> Date: Tue, 14 Mar 2023 19:04:44 +0530 Subject: [PATCH 074/394] Update tasks.md --- 2023/day70/tasks.md | 78 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/2023/day70/tasks.md b/2023/day70/tasks.md index e69de29bb2..a2ab69473c 100644 --- a/2023/day70/tasks.md +++ b/2023/day70/tasks.md @@ -0,0 +1,78 @@ +# Day 70 - Terraform Modules + +- Modules are containers for multiple resources that are used together. A module consists of a collection of .tf and/or .tf.json files kept together in a directory +- A module can call other modules, which lets you include the child module's resources into the configuration in a concise way. +- Modules can also be called multiple times, either within the same configuration or in separate configurations, allowing resource configurations to be packaged and re-used. + +### Below is the format on how to use modules: +``` +# Creating a AWS EC2 Instance +resource "aws_instance" "server-instance" { + # Define number of instance + instance_count = var.number_of_instances + + # Instance Configuration + ami = var.ami + instance_type = var.instance_type + subnet_id = var.subnet_id + vpc_security_group_ids = var.security_group + + # Instance Tagsid + tags = { + Name = "${var.instance_name}" + } +} +``` + +``` +# Server Module Variables +variable "number_of_instances" { + description = "Number of Instances to Create" + type = number + default = 1 +} + +variable "instance_name" { + description = "Instance Name" +} + +variable "ami" { + description = "AMI ID" + default = "ami-xxxx" +} + +variable "instance_type" { + description = "Instance Type" +} + +variable "subnet_id" { + description = "Subnet ID" +} + +variable "security_group" { + description = "Security Group" + type = list(any) +} +``` + +``` +# Server Module Output +output "server_id" { + description = "Server ID" + value = aws_instance.server-instance.id +} + +``` + +## Task-01 + +Explain the below in your own words and it shouldnt be copied from Internet 😉 +- Write about different modules Terraform. +- Difference between Root Module and Child Module. +- Is modules and Namespaces are same? Justify your answer for both Yes/No + + + +You all are doing great, and you have come so far. Well Done Everyone🎉 + +Thode mehnat aur krni hai bas to lge rho tab tak.....Happy learning :) From 427e3d9b4d3d3b8c5863af44eaaa93a0a94c9c94 Mon Sep 17 00:00:00 2001 From: Varsha Verma <55032759+Varsha-Verma@users.noreply.github.com> Date: Thu, 16 Mar 2023 00:21:09 +0530 Subject: [PATCH 075/394] Update tasks.md Terraform Interview Questions --- 2023/day71/tasks.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/2023/day71/tasks.md b/2023/day71/tasks.md index e69de29bb2..5d163104e2 100644 --- a/2023/day71/tasks.md +++ b/2023/day71/tasks.md @@ -0,0 +1,36 @@ +# Day 71 - Let's prepare for some interview questions of Terraform 🔥 + +### 1. What is Terraform and how it is different from other IaaC tools? +### 2. How do you call a main.tf module? +### 3. What exactly is Sentinel? Can you provide few examples where we can use for Sentinel policies? +### 4. You have a Terraform configuration file that defines an infrastructure deployment. However, there are multiple instances of the same resource that need to be created. How would you modify the configuration file to achieve this? +### 5. You want to know from which paths Terraform is loading providers referenced in your Terraform configuration (*.tf files). You need to enable debug messages to find this out. Which of the following would achieve this? + +A. Set the environment variable TF_LOG=TRACE + +B. Set verbose logging for each provider in your Terraform configuration + +C. Set the environment variable TF_VAR_log=TRACE + +D. Set the environment variable TF_LOG_PATH + + +### 6. Below command will destroy everything that is being created in the infrastructure. Tell us how would you save any particular resource while destroying the complete infrastructure. + +``` +terraform destroy +``` + + +### 7. Which module is used to store .tfstate file in S3? +### 8. How do you manage sensitive data in Terraform, such as API keys or passwords? +### 9. You are working on a Terraform project that needs to provision an S3 bucket, and a user with read and write access to the bucket. What resources would you use to accomplish this, and how would you configure them? +### 10. Who maintains Terraform providers? +### 11. How can we export data from one module to another? + + + + + +# +Waiting for your responses😉.....Till then Happy learning :) From 7fad3503b1c49cd95c2a5ac427589db84c497bca Mon Sep 17 00:00:00 2001 From: Chetan Rakhra <58957605+chxtan@users.noreply.github.com> Date: Fri, 17 Mar 2023 01:52:54 +0530 Subject: [PATCH 076/394] Day -72 - Task Added. --- 2023/day72/tasks.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/2023/day72/tasks.md b/2023/day72/tasks.md index e69de29bb2..ddde6eedee 100644 --- a/2023/day72/tasks.md +++ b/2023/day72/tasks.md @@ -0,0 +1,13 @@ +Day 72 - Grafana🔥 + +Hello Learners , you guys are doing really a good job. You will not be there 24*7 to monitor your resources. So, Today let’s monitor the resources in a smart way with - Grafana 🎉 + +Task 1: +------------------------------------------------------------------------------------------------------------- +> What is Grafana? What are the features of Grafana? +> Why Grafana? +> What type of monitoring can be done via Grafana? +> What databases work with Grafana? +> What are metrics and visualizations in Grafana? +> What is the difference between Grafana vs Prometheus? +------------------------------------------------------------------------------------------------------------- From 7f34153e4ccc04f608ed433a568a58fb9b161792 Mon Sep 17 00:00:00 2001 From: Chetan Rakhra <58957605+chxtan@users.noreply.github.com> Date: Fri, 17 Mar 2023 21:20:32 +0530 Subject: [PATCH 077/394] Day - 73 - Task Added. --- 2023/day73/tasks.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/2023/day73/tasks.md b/2023/day73/tasks.md index e69de29bb2..c683a0099f 100644 --- a/2023/day73/tasks.md +++ b/2023/day73/tasks.md @@ -0,0 +1,13 @@ +Day 73 - Grafana 🔥 +Hope you are now clear with the basics of grafana, like why we use, where we use, what can we do with this and so on. + +Now, let's do some practical stuff. + +-------------------------------------------------------------------------------------------------------------------- +Task: + +> Setup grafana in your local environment on AWS EC2. + +-------------------------------------------------------------------------------------------------------------------- + +Ref: https://www.linkedin.com/posts/chetanrakhra_devops-project-share-activity-7042518379030556672-ZZA-?utm_source=share&utm_medium=member_desktop From ce8b8b930d00047da99903284503c524b5aa8d54 Mon Sep 17 00:00:00 2001 From: Sitabja Chatterjee <89836369+sitchatt@users.noreply.github.com> Date: Sat, 18 Mar 2023 23:54:11 +0530 Subject: [PATCH 078/394] Created day-74 Task | Connecting EC2 with Grafana --- 2023/day74/tasks.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/2023/day74/tasks.md b/2023/day74/tasks.md index e69de29bb2..db9af05362 100644 --- a/2023/day74/tasks.md +++ b/2023/day74/tasks.md @@ -0,0 +1,17 @@ +# Day 74 - Connecting EC2 with Grafana . + +You guys did amazing job last day setting up Grafana on Local 🔥. + +Now, let's do one step ahead. + +------------------------------------------------------------------------------ +Task: + +Connect an Linux and one Windows EC2 instance with Grafana and monitor the different components of the server. + +------------------------------------------------------------------------------ + +Don't forget to share this amazing work over LinkedIn and Tag us. + +## Happy Learning :) + From 890cf2a62b76cc17da17588df401c6abfb2d80cc Mon Sep 17 00:00:00 2001 From: Suman Prasad Date: Sun, 19 Mar 2023 14:36:09 +0530 Subject: [PATCH 079/394] Modified the Introduction of Readme file --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c1cc43144e..e7e8b11809 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,9 @@ # #90DaysOfDevOps Challenge ## Learn, Upskill, Grow with the Community -This repository is a Challenge for the DevOps Community to get stronger in DevOps. -This challenge starts on the 1st January 2023 and in the next 90 Days we promise ourselves to become better at DevOps. +Join our DevOps community challenge starting on January 1st, 2023 and embark on a 90-day journey to become a better DevOps practitioner. This repository serves as an open invitation to all DevOps enthusiasts who are looking to enhance their skills and knowledge. By participating in this challenge, you will have the opportunity to learn from others in the community, collaborate with like-minded individuals, and ultimately strengthen your DevOps abilities. -The reason for making this Public is so that others can learn from the community and help each other grow. +Let's come together to grow and achieve new heights in DevOps! ## Steps: - Fork[https://github.com/LondheShubham153/90DaysOfDevOps/fork] the Repo. From 867748ec11e2d5dfd4c6ed9d65c89f884ed574cf Mon Sep 17 00:00:00 2001 From: Sitabja Chatterjee <89836369+sitchatt@users.noreply.github.com> Date: Tue, 21 Mar 2023 00:12:06 +0530 Subject: [PATCH 080/394] Created Day 74 task | Sending Docker Log to Grafana --- 2023/day75/tasks.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/2023/day75/tasks.md b/2023/day75/tasks.md index e69de29bb2..50e6c33a85 100644 --- a/2023/day75/tasks.md +++ b/2023/day75/tasks.md @@ -0,0 +1,30 @@ +# Day 75 - Sending Docker Log to Grafana + +We have monitored ,😉 that you guys are understanding and doing amazing with monitoring tool. 👌 + + +Today, make it little bit more complex but interesting 😍 and let's add one more **Project** 🔥 to your resume. + +------------------------------------------------------------------------------ +## Task: + +- Install *Docker* and start docker service on a Linux EC2 through ***USER DATA*** . +- Create 2 Docker containers and run any basic application on those containers. +- Now intregrate the docker containers and share the real time logs with Grafana. +- You can stop one container and see the changes. + +------------------------------------------------------------------------------ + + +You can use [this video](https://youtu.be/y3SGHbixmJw) for your refernce. But it's always better to find your own way of doing. 😊 + + +## Bonus : +- As you have done this amazing task, here is one bonus link.❤️ + +## You can use this [refernce video](https://youtu.be/CCi957AnSfc) to intregrate *Prmotehus* with *Grafana* and monitor Docker containers. Seems interesting ? + + +Don't forget to share this amazing work over LinkedIn and Tag us. + +## Happy Learning :) From d0f230e5e8bd1c0fa57753c15edfcb47616460ab Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Tue, 21 Mar 2023 00:36:01 +0530 Subject: [PATCH 081/394] added day 75 tasks --- 2023/day75/tasks.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/2023/day75/tasks.md b/2023/day75/tasks.md index 50e6c33a85..2d95f2059d 100644 --- a/2023/day75/tasks.md +++ b/2023/day75/tasks.md @@ -8,10 +8,10 @@ Today, make it little bit more complex but interesting 😍 and let's add one mo ------------------------------------------------------------------------------ ## Task: -- Install *Docker* and start docker service on a Linux EC2 through ***USER DATA*** . -- Create 2 Docker containers and run any basic application on those containers. -- Now intregrate the docker containers and share the real time logs with Grafana. -- You can stop one container and see the changes. +- Install *Docker* and start docker service on a Linux EC2 through [USER DATA](https://github.com/LondheShubham153/90DaysOfDevOps/blob/0999394e87192863b5c190a90896249c31ce31af/2023/day39/tasks.md) . +- Create 2 Docker containers and run any basic application on those containers (A simple todo app will work). +- Now intregrate the docker containers and share the real time logs with Grafana (Your Instance should be connected to Grafana and Docker plugin should be enabled on grafana). +- Check the logs or docker container name on Grafana UI. ------------------------------------------------------------------------------ @@ -22,7 +22,7 @@ You can use [this video](https://youtu.be/y3SGHbixmJw) for your refernce. But it ## Bonus : - As you have done this amazing task, here is one bonus link.❤️ -## You can use this [refernce video](https://youtu.be/CCi957AnSfc) to intregrate *Prmotehus* with *Grafana* and monitor Docker containers. Seems interesting ? +## You can use this [refernce video](https://youtu.be/CCi957AnSfc) to intregrate *Prometheus* with *Grafana* and monitor Docker containers. Seems interesting ? Don't forget to share this amazing work over LinkedIn and Tag us. From 1dd79a74bc1288b246e88df6b2b05e5ae7b7a8b7 Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Tue, 21 Mar 2023 23:49:38 +0530 Subject: [PATCH 082/394] added day 76 --- 2023/day76/tasks.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/2023/day76/tasks.md b/2023/day76/tasks.md index e69de29bb2..9202cf3f6e 100644 --- a/2023/day76/tasks.md +++ b/2023/day76/tasks.md @@ -0,0 +1,30 @@ +# Day 76 Build a Grafana dashboard + +A dashboard gives you an at-a-glance view of your data and lets you track metrics through different visualizations. + +Dashboards consist of panels, each representing a part of the story you want your dashboard to tell. + +Every panel consists of a query and a visualization. The query defines what data you want to display, whereas the visualization defines how the data is displayed. + +## Task 01 +- In the sidebar, hover your cursor over the Create (plus sign) icon and then click Dashboard. + +- Click Add a new panel. + +- In the Query editor below the graph, enter the query from earlier and then press Shift + Enter: + +```sum(rate(tns_request_duration_seconds_count[5m])) by(route)``` + +- In the Legend field, enter {{route}} to rename the time series in the legend. The graph legend updates when you click outside the field. + +- In the Panel editor on the right, under Settings, change the panel title to “Traffic”. + +- Click Apply in the top-right corner to save the panel and go back to the dashboard view. + +- Click the Save dashboard (disk) icon at the top of the dashboard to save your dashboard. + +- Enter a name in the Dashboard name field and then click Save. + +Read [this](https://grafana.com/tutorials/grafana-fundamentals/) in case you have any questions + +Do share some amazing Dashboards with the community \ No newline at end of file From 743364ee74b938b28d7fd2185e3eced54dcdb4f8 Mon Sep 17 00:00:00 2001 From: LondheShubham153 Date: Sat, 25 Mar 2023 01:09:11 +0530 Subject: [PATCH 083/394] Added grafana alerting --- 2023/day77/tasks.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/2023/day77/tasks.md b/2023/day77/tasks.md index e69de29bb2..76556664d3 100644 --- a/2023/day77/tasks.md +++ b/2023/day77/tasks.md @@ -0,0 +1,12 @@ +# Day 77 Alerting + +Grafana Alerting allows you to learn about problems in your systems moments after they occur. Create, manage, and take action on your alerts in a single, consolidated view, and improve your team’s ability to identify and resolve issues quickly. + +Grafana Alerting is available for Grafana OSS, Grafana Enterprise, or Grafana Cloud. With Mimir and Loki alert rules you can run alert expressions closer to your data and at massive scale, all managed by the Grafana UI you are already familiar with. + +## Task-01 +- Setup [Grafana cloud](https://grafana.com/products/cloud/) +- Setup sample alerting + +Check out [this blog](https://grafana.com/docs/grafana/latest/alerting/) for more details + From 75ed1b060e14bb3a5158d2e27dbd705a25bc6ffb Mon Sep 17 00:00:00 2001 From: Chetan Rakhra <58957605+chxtan@users.noreply.github.com> Date: Sun, 26 Mar 2023 00:43:13 +0530 Subject: [PATCH 084/394] Day - 78 - Task Added. --- 2023/day78/tasks.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/2023/day78/tasks.md b/2023/day78/tasks.md index e69de29bb2..68a740b7da 100644 --- a/2023/day78/tasks.md +++ b/2023/day78/tasks.md @@ -0,0 +1,13 @@ +Day - 78 (Grafana Cloud) + +------------------------------------------------------------------------------------------------------------ + + +Task - 01 +1. Setup alerts for EC2 instance. +2. Setup alerts for AWS Billing Alerts. + + +------------------------------------------------------------------------------------------------------------ + +For Reference: https://www.linkedin.com/posts/chetanrakhra_devops-project-share-activity-7044695663913148416-LfvD?utm_source=share&utm_medium=member_desktop From 592758e1a9200ad0528a1c6beb9014b3f05f3ffd Mon Sep 17 00:00:00 2001 From: Chetan Rakhra <58957605+chxtan@users.noreply.github.com> Date: Wed, 29 Mar 2023 00:57:49 +0530 Subject: [PATCH 085/394] Task - 79 - Added. --- 2023/day79/tasks.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/2023/day79/tasks.md b/2023/day79/tasks.md index e69de29bb2..18f4ccae80 100644 --- a/2023/day79/tasks.md +++ b/2023/day79/tasks.md @@ -0,0 +1,18 @@ +Day 79 - Prometheus 🔥 + +Now, the next step is to learn about the Prometheus. +It's an open-source system for monitoring services and alerts based on a time series data model. Prometheus collects data and metrics from different services and stores them according to a unique identifier—the metric name—and a time stamp. + +Tasks: + +--------------------------------------------------------------------------------------------------------------------------------------------------------- + +1. What is the Architecture of Prometheus Monitoring? +2. What are the Features of Prometheus? +3. What are the Components of Prometheus? +4. What database is used by Prometheus? +5. What is the default data retention period in Prometheus? + +--------------------------------------------------------------------------------------------------------------------------------------------------------- + +Ref: https://www.devopsschool.com/blog/top-50-prometheus-interview-questions-and-answers/ From 8f8278ff32c2cbc1b2218904366b44234e243405 Mon Sep 17 00:00:00 2001 From: TrainWithShubham Date: Tue, 4 Apr 2023 00:06:21 +0530 Subject: [PATCH 086/394] Added 5 new projects --- 2023/day80/tasks.md | 17 +++++++++++++++++ 2023/day81/tasks.md | 17 +++++++++++++++++ 2023/day82/tasks.md | 17 +++++++++++++++++ 2023/day83/tasks.md | 17 +++++++++++++++++ 2023/day84/tasks.md | 17 +++++++++++++++++ 5 files changed, 85 insertions(+) diff --git a/2023/day80/tasks.md b/2023/day80/tasks.md index e69de29bb2..a65b015a9f 100644 --- a/2023/day80/tasks.md +++ b/2023/day80/tasks.md @@ -0,0 +1,17 @@ +# Project-1 +========= + +# Project Description + + +The project aims to automate the building, testing, and deployment process of a web application using Jenkins and GitHub. The Jenkins pipeline will be triggered automatically by GitHub webhook integration when changes are made to the code repository. The pipeline will include stages such as building, testing, and deploying the application, with notifications and alerts for failed builds or deployments. + + +## Task-01 + + +Do the hands-on Project, read [this](https://www.linkedin.com/posts/chetanrakhra_devops-project-share-activity-7011367641952993281-DHn5?utm_source=share&utm_medium=member_desktop) + + + +Happy Learning :) \ No newline at end of file diff --git a/2023/day81/tasks.md b/2023/day81/tasks.md index e69de29bb2..f00123df6b 100644 --- a/2023/day81/tasks.md +++ b/2023/day81/tasks.md @@ -0,0 +1,17 @@ +# Project-2 +========= + +# Project Description + + +The project is about automating the deployment process of a web application using Jenkins and its declarative syntax. The pipeline includes stages like building, testing, and deploying to a staging environment. It also includes running acceptance tests and deploying to production if all tests pass. + + +## Task-01 + + +Do the hands-on Project, read [this](https://www.linkedin.com/posts/chetanrakhra_devops-project-share-activity-7014971330496212992-6Q2m?utm_source=share&utm_medium=member_desktop) + + + +Happy Learning :) \ No newline at end of file diff --git a/2023/day82/tasks.md b/2023/day82/tasks.md index e69de29bb2..e99ef9e0b2 100644 --- a/2023/day82/tasks.md +++ b/2023/day82/tasks.md @@ -0,0 +1,17 @@ +# Project-3 +========= + +# Project Description + + +The project involves hosting a static website using an AWS S3 bucket. Amazon S3 is an object storage service that provides a simple web services interface to store and retrieve any amount of data. The website files will be uploaded to an S3 bucket and configured to function as a static website. The bucket will be configured with the appropriate permissions and a unique domain name, making the website publicly accessible. Overall, the project aims to leverage the benefits of AWS S3 to host and scale a static website in a cost-effective and scalable manner. + + +## Task-01 + + +Do the hands-on Project, read [this](https://www.linkedin.com/posts/chetanrakhra_aws-project-devopsjobs-activity-7016427742300663808-JAQd?utm_source=share&utm_medium=member_desktop) + + + +Happy Learning :) \ No newline at end of file diff --git a/2023/day83/tasks.md b/2023/day83/tasks.md index e69de29bb2..36701dea81 100644 --- a/2023/day83/tasks.md +++ b/2023/day83/tasks.md @@ -0,0 +1,17 @@ +# Project-4 +========= + +# Project Description + + +The project aims to deploy a web application using Docker Swarm, a container orchestration tool that allows for easy management and scaling of containerized applications. The project will utilize Docker Swarm's production-ready features such as load balancing, rolling updates, and service discovery to ensure high availability and reliability of the web application. The project will involve creating a Dockerfile to package the application into a container and then deploying it onto a Swarm cluster. The Swarm cluster will be configured to provide automated failover, load balancing, and horizontal scaling to the application. The goal of the project is to demonstrate the benefits of Docker Swarm for deploying and managing containerized applications in production environments. + + +## Task-01 + + +Do the hands-on Project, read [this](https://www.linkedin.com/posts/chetanrakhra_devops-project-share-activity-7034173810656296960-UjUw?utm_source=share&utm_medium=member_desktop) + + + +Happy Learning :) \ No newline at end of file diff --git a/2023/day84/tasks.md b/2023/day84/tasks.md index e69de29bb2..999dfceef5 100644 --- a/2023/day84/tasks.md +++ b/2023/day84/tasks.md @@ -0,0 +1,17 @@ +# Project-5 +========= + +# Project Description + + +The project involves deploying a Netflix clone web application on a Kubernetes cluster, a popular container orchestration platform that simplifies the deployment and management of containerized applications. The project will require creating Docker images of the web application and its dependencies and deploying them onto the Kubernetes cluster using Kubernetes manifests. The Kubernetes cluster will provide benefits such as high availability, scalability, and automatic failover of the application. Additionally, the project will utilize Kubernetes tools such as Kubernetes Dashboard and kubectl to monitor and manage the deployed application. Overall, the project aims to demonstrate the power and benefits of Kubernetes for deploying and managing containerized applications at scale. + + +## Task-01 + + +Get a netflix clone form [GitHub](https://github.com/devandres-tech/Netflix-Clone), read [this](https://www.linkedin.com/posts/chetanrakhra_devops-project-share-activity-7034173810656296960-UjUw?utm_source=share&utm_medium=member_desktop) and follow the Redit clone steps to similarly deploy a Netflix Clone + + + +Happy Learning :) \ No newline at end of file From 11e68ba8beb48e7982717facb243373c8ecbb489 Mon Sep 17 00:00:00 2001 From: TrainWithShubham Date: Tue, 11 Apr 2023 19:30:17 +0530 Subject: [PATCH 087/394] Added ECS project --- 2023/day85/tasks.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/2023/day85/tasks.md b/2023/day85/tasks.md index e69de29bb2..e247bbfa66 100644 --- a/2023/day85/tasks.md +++ b/2023/day85/tasks.md @@ -0,0 +1,31 @@ +# Project-6 +========= + +# Project Description + + +The project involves deploying a Node JS app on AWS ECS Fargate and AWS ECR. +Read More about the tech stack [here](https://faun.pub/what-is-amazon-ecs-and-ecr-how-does-they-work-with-an-example-4acbf9be8415) + + + + + +## Task-01 + + +- Get a NodeJs application from [GitHub](https://github.com/LondheShubham153/node-todo-cicd). + +- Build the Dockerfile present in the repo + +- Setup AWS CLI and AWS Login in order to tag and push to ECR + +- Setup an ECS cluster + +- Create a Task Definition for the node js project with ECR image + +- Run the Project and share it on LinkedIn :) + + + +Happy Learning :) \ No newline at end of file From ae153c17fab9b17493ed0a2138cd981671517fe3 Mon Sep 17 00:00:00 2001 From: TrainWithShubham Date: Wed, 12 Apr 2023 11:07:46 +0530 Subject: [PATCH 088/394] added project 7 --- 2023/day86/tasks.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/2023/day86/tasks.md b/2023/day86/tasks.md index e69de29bb2..95efc20df8 100644 --- a/2023/day86/tasks.md +++ b/2023/day86/tasks.md @@ -0,0 +1,26 @@ +# Project-7 +========= + +# Project Description + + +The project involves deploying a Portfolio app on AWS S3 using GitHub Actions. +Git Hub actions allows you to perform CICD with GitHub Repository integrated. + + +## Task-01 + + +- Get a Portfolio application from [GitHub](https://github.com/LondheShubham153/tws-portfolio). + +- Build the GitHub Actions Workflow + +- Setup AWS CLI and AWS Login in order to sync website to S3 (to be done as a part of YAML) + +- Follow this [video]() to understand it better + +- Run the Project and share it on LinkedIn :) + + + +Happy Learning :) \ No newline at end of file From aaa6e01b96dcf1c402244dc464d4ac74121e8221 Mon Sep 17 00:00:00 2001 From: Sitabja Chatterjee <89836369+sitchatt@users.noreply.github.com> Date: Tue, 18 Apr 2023 13:22:59 +0530 Subject: [PATCH 089/394] Update tasks.md Updated Elastic BeanStalk Project --- 2023/day87/tasks.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/2023/day87/tasks.md b/2023/day87/tasks.md index e69de29bb2..f13d529803 100644 --- a/2023/day87/tasks.md +++ b/2023/day87/tasks.md @@ -0,0 +1,26 @@ +# Project-8 +========= + +# Project Description + + +The project involves deploying a react application on AWS Elastic BeanStalk using GitHub Actions. +Git Hub actions allows you to perform CICD with GitHub Repository integrated. + + +## Task-01 + + +- Get source code from [GitHub](https://github.com/sitchatt/AWS_Elastic_BeanStalk_On_EC2.git). + +- Setup AWS Elastic BeanStalk + +- Build the GitHub Actions Workflow + +- Follow this [blog](https://www.linkedin.com/posts/sitabja-chatterjee_effortless-deployment-of-react-app-to-aws-activity-7053579065487687680-wZI8?utm_source=share&utm_medium=member_desktop) to understand it better + +- Run the Project and share it on LinkedIn :) + + + +Happy Learning :) From 417e32c57aff6253e4153b55f4370fe172c734cb Mon Sep 17 00:00:00 2001 From: shubhamlondhe1996 Date: Thu, 27 Apr 2023 00:26:05 +0530 Subject: [PATCH 090/394] added project 9 --- 2023/day88/tasks.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/2023/day88/tasks.md b/2023/day88/tasks.md index e69de29bb2..04f7ce6306 100644 --- a/2023/day88/tasks.md +++ b/2023/day88/tasks.md @@ -0,0 +1,25 @@ +# Project-9 +========= + +# Project Description + + +The project involves deploying a Django Todo app on AWS EC2 using Kubeadm Kubernetes cluster. + +Kubernetes Cluster helps in Auto-scaling and Auto-healing of your application. + + +## Task-01 + + +- Get a Django Full Stack application from [GitHub](https://github.com/LondheShubham153/django-todo-cicd). + +- Setup the Kubernetes cluster using [this script](https://github.com/RishikeshOps/Scripts/blob/main/k8sss.sh) + +- Setup Deployment and Service for Kubernetes. + +- Run the Project and share it on LinkedIn :) + + + +Happy Learning :) \ No newline at end of file From d869c05c4b2bbd66a93b5c26394f8fd3ba5db421 Mon Sep 17 00:00:00 2001 From: A M A S H ~ A N S A R I <42666741+iamamash@users.noreply.github.com> Date: Thu, 4 May 2023 17:12:44 +0530 Subject: [PATCH 091/394] Corrected the "group" spelling in line no 16 The "group" spelling was incorrect on line no 16 --- 2023/day06/tasks.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2023/day06/tasks.md b/2023/day06/tasks.md index 05882b1bf8..a861d3379d 100644 --- a/2023/day06/tasks.md +++ b/2023/day06/tasks.md @@ -13,7 +13,7 @@ - owner — The owner of the file or application. - "chown" is used to change the ownership permission of a file or directory. - group — The group that owns the file or application. -- "chgrp" is used to change the gropu permission of a file or directory. +- "chgrp" is used to change the group permission of a file or directory. - others — All users with access to the system. (outised the users are in a group) - "chmod" is used to change the other users permissions of a file or directory. @@ -25,4 +25,4 @@ In case of any doubts, post it on [Discord Community](https://discord.gg/hs3Pmc5F) -Happy Learning \ No newline at end of file +Happy Learning From 0dc59d2616561797937d58e135f1ce3da1deed47 Mon Sep 17 00:00:00 2001 From: A M A S H ~ A N S A R I <42666741+iamamash@users.noreply.github.com> Date: Sun, 7 May 2023 21:56:35 +0530 Subject: [PATCH 092/394] Update README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index e7e8b11809..a77a1315fa 100644 --- a/README.md +++ b/README.md @@ -32,3 +32,8 @@ https://youtube.com/playlist?list=PLlfy9GnSVerRqYJgVYO0UiExj5byjrW8u DevOps Course: https://bit.ly/devops-batch-2 +## Thanks to all contributors ❤ + + + + From 7a3f62c7b2ce85c40412f2e65b7c567467615f51 Mon Sep 17 00:00:00 2001 From: Shubham Londhe Date: Sat, 24 Jun 2023 21:00:28 +0530 Subject: [PATCH 093/394] Update tasks.md --- 2023/day89/tasks.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/2023/day89/tasks.md b/2023/day89/tasks.md index e69de29bb2..c41e29809d 100644 --- a/2023/day89/tasks.md +++ b/2023/day89/tasks.md @@ -0,0 +1,21 @@ +# Project-10 +========= + +# Project Description + + +The project involves Mounting of AWS S3 Bucket On Amazon EC2 Linux Using S3FS. + +This is a AWS Mini Project that will teach you AWS, S3, EC2, S3FS. + + +## Task-01 + + +- Create IAM user and set policies for the project resources using this [blog](https://medium.com/@chetxn/project-8-devops-implementation-8300b9ed1f2). +- Utilize and make the best use of aws-cli +- Run the Project and share it on LinkedIn :) + + + +Happy Learning :) From 003d4d58c369ee044d2e620f911c7bb0e491e7ea Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Sun, 16 Jul 2023 00:51:34 +0530 Subject: [PATCH 094/394] Day 1 task --- submission/day1/tasks.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 submission/day1/tasks.md diff --git a/submission/day1/tasks.md b/submission/day1/tasks.md new file mode 100644 index 0000000000..64575ae41e --- /dev/null +++ b/submission/day1/tasks.md @@ -0,0 +1,13 @@ +## Introduction - Day 1 + +This is the day you have to Take this challenge and start your #90DaysOfDevOps with the #TrainWithShubham Community + +- Fork this Repo. Done +- Start with a DevOps Roadmap[https://youtu.be/iOE9NTAG35g] - Done +- Write a LinkedIn post or a small article about your understanding of DevOps + - What is DevOps + - What is Automation, Scaling, Infrastructure + - Why DevOps is Important, etc + +Submitted blog: [Introduction to DevOps](https://paragpallavsingh.hashnode.dev/introduction-to-devops-90daysofdevops) + \ No newline at end of file From 17ca7ed441395cea77237b01e3e0ce3697ea8a1b Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Sun, 16 Jul 2023 10:38:23 +0530 Subject: [PATCH 095/394] Create tasks.md DAY 2 --- submission/day2/tasks.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 submission/day2/tasks.md diff --git a/submission/day2/tasks.md b/submission/day2/tasks.md new file mode 100644 index 0000000000..c4841e9184 --- /dev/null +++ b/submission/day2/tasks.md @@ -0,0 +1,13 @@ +Day 2 Task: Basics linux command + +Task: What is the linux command to +1. Check your present working directory. + - pwd +2. List all the files or directories including hidden files. + - ls -la +3. Create a nested directory A/B/C/D/E + - mkdir -p A/B/C/D/E + +Note: [Check this file for reference](basic_linux_commands.md) + +Check the basic_linux_commands.md file on the same directory day2 From 0e9f55d5a1e68eff8a44878a05189b10cadd6a78 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Sun, 16 Jul 2023 12:05:28 +0530 Subject: [PATCH 096/394] day 2 --- submission/day2/tasks.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/submission/day2/tasks.md b/submission/day2/tasks.md index c4841e9184..e8c0efeed9 100644 --- a/submission/day2/tasks.md +++ b/submission/day2/tasks.md @@ -3,10 +3,13 @@ Day 2 Task: Basics linux command Task: What is the linux command to 1. Check your present working directory. - pwd + 2. List all the files or directories including hidden files. - ls -la + 3. Create a nested directory A/B/C/D/E - mkdir -p A/B/C/D/E + Note: [Check this file for reference](basic_linux_commands.md) From b50e917690dac9085b7206e8ca76d9c6042288fc Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Sun, 16 Jul 2023 15:36:27 +0530 Subject: [PATCH 097/394] mkdir command for nested directory --- submission/day2/tasks.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/submission/day2/tasks.md b/submission/day2/tasks.md index e8c0efeed9..d7e14810e5 100644 --- a/submission/day2/tasks.md +++ b/submission/day2/tasks.md @@ -3,13 +3,17 @@ Day 2 Task: Basics linux command Task: What is the linux command to 1. Check your present working directory. - pwd +image 2. List all the files or directories including hidden files. - ls -la +image 3. Create a nested directory A/B/C/D/E - - mkdir -p A/B/C/D/E - + - mkdir -p A/B/C/D/ + - mkdir -p folder/B/D +image + Note: [Check this file for reference](basic_linux_commands.md) From 837f07dc2fcb8962358d3f9a4c7c10a2462abfa2 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Sun, 16 Jul 2023 16:12:06 +0530 Subject: [PATCH 098/394] post blog --- submission/day2/tasks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submission/day2/tasks.md b/submission/day2/tasks.md index d7e14810e5..00a2190ac0 100644 --- a/submission/day2/tasks.md +++ b/submission/day2/tasks.md @@ -14,7 +14,7 @@ Task: What is the linux command to - mkdir -p folder/B/D image - +Here is a detailed [blog over Introduction to Linux](https://paragpallavsingh.com/2023/07/16/linux-fundamentals/) Note: [Check this file for reference](basic_linux_commands.md) Check the basic_linux_commands.md file on the same directory day2 From 2ec1ef20ca840e1068392b8b91902432e4c7ebb5 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Tue, 18 Jul 2023 02:45:53 +0530 Subject: [PATCH 099/394] day 3 submission --- submission/day3/tasks.md | 41 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 submission/day3/tasks.md diff --git a/submission/day3/tasks.md b/submission/day3/tasks.md new file mode 100644 index 0000000000..d62a7a0d12 --- /dev/null +++ b/submission/day3/tasks.md @@ -0,0 +1,41 @@ +Day 3 Task: Basic Linux Commands + +Task: What is the linux command to + +Prerequisite commands to replicate below + +#make 5 folders +mkdir folder-{1..5} +#go to folder 1 +cd folder-1 +#make fileA.txt to fileM.txt +touch file{A..M}.txt +#start editing fileA +vi fileA.txt +#make a student list of Bilogy marks +#copy paste below data +James Walker Biology 05/06/2016 31 +Velma Clemons Biology 05/06/2016 43 +Kibo Underwood Biology 05/06/2016 81 +Louis Mcgee Biology 05/06/2016 11 +Phyllis Paul Biology 05/06/2016 18 +Zenaida Decker Biology 05/06/2016 55 +Gillian Tillman Biology 05/06/2016 38 +Constance Boone Biology 05/06/2016 16 + +#rename it to students.txt +mv fileA.txt students.txt + +Now begin below commands + +1. To view what's written in a file. +2. To change the access permissions of files. +3. To check which commands you have run till now. +4. To remove a directory/ Folder. +5. To create a fruits.txt file and to view the content. +6. Add content in devops.txt (One in each line) - Apple, Mango, Banana, Cherry, Kiwi, Orange, Guava. +7. To Show only top three fruits from the file. +8. To Show only bottom three fruits from the file. +9. To create another file Colors.txt and to view the content. +10. Add content in Colors.txt (One in each line) - Red, Pink, White, Black, Blue, Orange, Purple, Grey. +11. To find the difference between fruits.txt and Colors.txt file. \ No newline at end of file From 8c265ee8cbbbc234312e9ef5820149db10a20a2a Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Tue, 18 Jul 2023 02:52:25 +0530 Subject: [PATCH 100/394] day 3 submission --- submission/day3/tasks.md | 44 ++++++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/submission/day3/tasks.md b/submission/day3/tasks.md index d62a7a0d12..e6cd65f5ef 100644 --- a/submission/day3/tasks.md +++ b/submission/day3/tasks.md @@ -5,37 +5,65 @@ Task: What is the linux command to Prerequisite commands to replicate below #make 5 folders + mkdir folder-{1..5} + #go to folder 1 + cd folder-1 + #make fileA.txt to fileM.txt + touch file{A..M}.txt + #start editing fileA + vi fileA.txt + #make a student list of Bilogy marks + #copy paste below data -James Walker Biology 05/06/2016 31 -Velma Clemons Biology 05/06/2016 43 -Kibo Underwood Biology 05/06/2016 81 -Louis Mcgee Biology 05/06/2016 11 -Phyllis Paul Biology 05/06/2016 18 -Zenaida Decker Biology 05/06/2016 55 -Gillian Tillman Biology 05/06/2016 38 -Constance Boone Biology 05/06/2016 16 + +James Walker    Biology 05/06/2016      31 + +Velma Clemons   Biology 05/06/2016      43 + +Kibo Underwood  Biology 05/06/2016      81 + +Louis Mcgee     Biology 05/06/2016      11 + +Phyllis Paul    Biology 05/06/2016      18 + +Zenaida Decker  Biology 05/06/2016      55 + +Gillian Tillman Biology 05/06/2016      38 + +Constance Boone Biology 05/06/2016      16 #rename it to students.txt + mv fileA.txt students.txt Now begin below commands 1. To view what's written in a file. + 2. To change the access permissions of files. + 3. To check which commands you have run till now. + 4. To remove a directory/ Folder. + 5. To create a fruits.txt file and to view the content. + 6. Add content in devops.txt (One in each line) - Apple, Mango, Banana, Cherry, Kiwi, Orange, Guava. + 7. To Show only top three fruits from the file. + 8. To Show only bottom three fruits from the file. + 9. To create another file Colors.txt and to view the content. + 10. Add content in Colors.txt (One in each line) - Red, Pink, White, Black, Blue, Orange, Purple, Grey. + 11. To find the difference between fruits.txt and Colors.txt file. \ No newline at end of file From bee2ae9c23556c698f6a0b9a235e80eb9772d174 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Tue, 18 Jul 2023 03:24:44 +0530 Subject: [PATCH 101/394] final submission --- submission/day3/tasks.md | 107 ++++++++++++++++++++++++++++++--------- 1 file changed, 82 insertions(+), 25 deletions(-) diff --git a/submission/day3/tasks.md b/submission/day3/tasks.md index e6cd65f5ef..f71eec07f9 100644 --- a/submission/day3/tasks.md +++ b/submission/day3/tasks.md @@ -6,64 +6,121 @@ Prerequisite commands to replicate below #make 5 folders +``` mkdir folder-{1..5} +``` #go to folder 1 +``` cd folder-1 +``` #make fileA.txt to fileM.txt +``` touch file{A..M}.txt +``` #start editing fileA +``` vi fileA.txt +``` #make a student list of Bilogy marks #copy paste below data - +``` James Walker    Biology 05/06/2016      31 - Velma Clemons   Biology 05/06/2016      43 - Kibo Underwood  Biology 05/06/2016      81 - Louis Mcgee     Biology 05/06/2016      11 - Phyllis Paul    Biology 05/06/2016      18 - Zenaida Decker  Biology 05/06/2016      55 - Gillian Tillman Biology 05/06/2016      38 - Constance Boone Biology 05/06/2016      16 - +``` #rename it to students.txt +``` mv fileA.txt students.txt - -Now begin below commands - -1. To view what's written in a file. - -2. To change the access permissions of files. - -3. To check which commands you have run till now. - -4. To remove a directory/ Folder. +``` + +### Now begin below commands + +### 1. To view what's written in a file. + +``` +cat students.txt +``` + +image + +### 2. To change the access permissions of files. +``` +chmod 700 students.txt +ls -l students.txt +chmod 707 students.txt +ls -l students.txt +chmod 070 students.txt +ls -l students.txt +ls -l students.txt fileM.txt +ls +cat students.txt +``` +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/9d5d4ef7-846b-4f6d-8d8a-9555fbbaf1d9) + +## 3. To check which commands you have run till now +``` +history +``` + +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/d37caef4-2e65-4ea2-9e60-d2b09d2c9f95) + +### 4. To remove a directory/ Folder. +``` +rm -r file{F..I}.txt +cd .. +rm -r folder-{3..5} +``` +image 5. To create a fruits.txt file and to view the content. - 6. Add content in devops.txt (One in each line) - Apple, Mango, Banana, Cherry, Kiwi, Orange, Guava. - 7. To Show only top three fruits from the file. - 8. To Show only bottom three fruits from the file. +``` +vi fruits.txt +Apple +Mango +Banana +Cherry +Kiwi +Orange +Guava +cat fruits.txt +head fruits.txt +head -3 fruits.txt +tail -3 fruits.txt +``` +image 9. To create another file Colors.txt and to view the content. - 10. Add content in Colors.txt (One in each line) - Red, Pink, White, Black, Blue, Orange, Purple, Grey. - -11. To find the difference between fruits.txt and Colors.txt file. \ No newline at end of file +11. To find the difference between fruits.txt and Colors.txt file. +``` +vi colors.txt +Red +Pink +White +Black +Blue +Orange +Purple +Green +Grey +diff colors.txt fruits.txt +diff fruits.txt colors.txt +``` +image From b561dac17e60c47cd0e22f4b7e736a8c8a51f811 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Tue, 18 Jul 2023 10:38:26 +0530 Subject: [PATCH 102/394] day 4 submission --- submission/day4/compare.sh | 11 +++++++++++ submission/day4/first.sh | 11 +++++++++++ submission/day4/if_else.sh | 10 ++++++++++ submission/day4/tasks.md | 1 + 4 files changed, 33 insertions(+) create mode 100644 submission/day4/compare.sh create mode 100644 submission/day4/first.sh create mode 100644 submission/day4/if_else.sh create mode 100644 submission/day4/tasks.md diff --git a/submission/day4/compare.sh b/submission/day4/compare.sh new file mode 100644 index 0000000000..a7fbb06d1f --- /dev/null +++ b/submission/day4/compare.sh @@ -0,0 +1,11 @@ +#!/bin/bash +printf "Script to compare two numbers\nEnter number 1: " +read num1 +printf "Enter number 2: " +read num2 +if [ "$num1" -gt "$num2" ] +then + echo "$num1 is greater" +else + echo "$num2 is greater" +fi \ No newline at end of file diff --git a/submission/day4/first.sh b/submission/day4/first.sh new file mode 100644 index 0000000000..5e399d251f --- /dev/null +++ b/submission/day4/first.sh @@ -0,0 +1,11 @@ +printf "Let's print line as first Linux user\nto become a succesful devpos engineer\n\n" +sleep 1 +printf "Using variable to store\nmy_name=PARAG PALLAV SINGH\n" +sleep 1 +my_name="PARAG PALLAV SINGH" +sleep 1 +printf "Hello learners, I am ${my_name}\n\n" +sleep 1 +printf "Taking user input\nEnter your name:" +read your_name +printf "Hi ${your_name}\n" \ No newline at end of file diff --git a/submission/day4/if_else.sh b/submission/day4/if_else.sh new file mode 100644 index 0000000000..87d7d2ff2a --- /dev/null +++ b/submission/day4/if_else.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +printf "\nLearn if else in Linux\nTake user input for a number and find if it is 3\nEnter a number:- " +read number +if [ "${number}" = 3 ] +then + echo "Number is 3\n" +else + echo "Instead Number is ${number}" +fi \ No newline at end of file diff --git a/submission/day4/tasks.md b/submission/day4/tasks.md new file mode 100644 index 0000000000..213e2335ed --- /dev/null +++ b/submission/day4/tasks.md @@ -0,0 +1 @@ +This contains the output files of below three scripts \ No newline at end of file From 5733dfac2ba8ef92eaa926be174481f0563c59b9 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Tue, 18 Jul 2023 10:42:25 +0530 Subject: [PATCH 103/394] Update outputs for day 4 tasks --- submission/day4/tasks.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/submission/day4/tasks.md b/submission/day4/tasks.md index 213e2335ed..a3a6e870e2 100644 --- a/submission/day4/tasks.md +++ b/submission/day4/tasks.md @@ -1 +1,10 @@ -This contains the output files of below three scripts \ No newline at end of file +This contains the output files of below three scripts + +## output compare.sh +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/73495135-74e7-4a72-9ac2-c1e925704e86) + +## output if_else.sh +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/b50ee3e0-a02a-444c-884e-60379c411b9a) + +## output first.sh +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/7a6f3b47-eb75-4a39-884a-7aaca38849c6) From 3c92d4cd294e567dfeb5117efeaf5bf70b9374fb Mon Sep 17 00:00:00 2001 From: Shubham Londhe Date: Tue, 18 Jul 2023 13:21:41 +0530 Subject: [PATCH 104/394] Update README.md solves #218 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a77a1315fa..34b875ddb4 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ YouTube Playlist for DevOps: https://youtube.com/playlist?list=PLlfy9GnSVerRqYJgVYO0UiExj5byjrW8u DevOps Course: -https://bit.ly/devops-batch-2 +https://bit.ly/devops-batch-4 ## Thanks to all contributors ❤ From c2119eea39357e2318cd89627afa81ca9ac07d88 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Thu, 20 Jul 2023 10:26:35 +0530 Subject: [PATCH 105/394] Day 5 submission --- submission/day5/backup.txt | 11 +++++++++++ submission/day5/createDir.sh | 15 +++++++++++++++ submission/day5/createFiles.sh | 15 +++++++++++++++ submission/day5/tasks.md | 5 +++++ submission/day5/timestamp.sh | 7 +++++++ 5 files changed, 53 insertions(+) create mode 100644 submission/day5/backup.txt create mode 100644 submission/day5/createDir.sh create mode 100644 submission/day5/createFiles.sh create mode 100644 submission/day5/tasks.md create mode 100644 submission/day5/timestamp.sh diff --git a/submission/day5/backup.txt b/submission/day5/backup.txt new file mode 100644 index 0000000000..b03fa07f1d --- /dev/null +++ b/submission/day5/backup.txt @@ -0,0 +1,11 @@ +[2023-07-20 04:34:01] Learned crontab +[2023-07-20 04:36:01] Learned crontab +[2023-07-20 04:38:01] Learned crontab +[2023-07-20 04:40:01] Learned crontab +[2023-07-20 04:42:01] Learned crontab +[2023-07-20 04:44:01] Learned crontab +[2023-07-20 04:46:01] Learned crontab +[2023-07-20 04:48:01] Learned crontab +[2023-07-20 04:50:01] Learned crontab +[2023-07-20 04:52:01] Learned crontab +[2023-07-20 04:54:01] Learned crontab \ No newline at end of file diff --git a/submission/day5/createDir.sh b/submission/day5/createDir.sh new file mode 100644 index 0000000000..e1d59f7a2b --- /dev/null +++ b/submission/day5/createDir.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +printf "Create multiple files in a folder\nEnter starting file name:" +read name +printf "Enter starting count:" +read start +printf "Enter ending count:" +read end +for ((i=$start; i<=$end; i++)) +do + touch $name-$i +done +#show files in folder +printf "\nLong List of newly made files\n" +ls -l | grep $name \ No newline at end of file diff --git a/submission/day5/createFiles.sh b/submission/day5/createFiles.sh new file mode 100644 index 0000000000..7f15d3d809 --- /dev/null +++ b/submission/day5/createFiles.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +printf "Create multiple Directories\nEnter starting file name:" +read name +printf "Enter starting count:" +read start +printf "Enter ending count:" +read end +for ((i=$start; i<=$end; i++)) +do + touch $name-$i +done +#show files in folder +printf "\nLong List of newly made directories\n" +ls -l | grep $name \ No newline at end of file diff --git a/submission/day5/tasks.md b/submission/day5/tasks.md new file mode 100644 index 0000000000..e29a8471c5 --- /dev/null +++ b/submission/day5/tasks.md @@ -0,0 +1,5 @@ +# Task 1 Create multiple files script +# Task 2 Create multiple directories script +# Task 3 Create backup script +# Task 4 Make cronjob +# Task 5 User management diff --git a/submission/day5/timestamp.sh b/submission/day5/timestamp.sh new file mode 100644 index 0000000000..7435cf6eb5 --- /dev/null +++ b/submission/day5/timestamp.sh @@ -0,0 +1,7 @@ +#!/bin/bash +# Define backup file +backup_file="/home/ubuntu/backup.txt" +# Get current timestamp +timestamp=$(date +"%Y-%m-%d %H:%M:%S") +# Execute the command and append output with timestamp to the backup file +echo "[$timestamp] $(echo "Learned crontab")" >> "$backup_file" \ No newline at end of file From 3e697da13e4351cf4d4f48d19f2e20cebcde4dd8 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Thu, 20 Jul 2023 10:33:33 +0530 Subject: [PATCH 106/394] Update day 5 task output --- submission/day5/tasks.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/submission/day5/tasks.md b/submission/day5/tasks.md index e29a8471c5..27de3df254 100644 --- a/submission/day5/tasks.md +++ b/submission/day5/tasks.md @@ -1,5 +1,22 @@ +image + # Task 1 Create multiple files script +image + # Task 2 Create multiple directories script +image + # Task 3 Create backup script +image + # Task 4 Make cronjob +image +
+image + # Task 5 User management +image +
+image + + From e8d99ef3e3585b8db965eec603c74ba72de4d57d Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Fri, 21 Jul 2023 10:25:12 +0530 Subject: [PATCH 107/394] day 6 --- submission/day6/tasks.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 submission/day6/tasks.md diff --git a/submission/day6/tasks.md b/submission/day6/tasks.md new file mode 100644 index 0000000000..f2c6b5b8cf --- /dev/null +++ b/submission/day6/tasks.md @@ -0,0 +1,19 @@ +touch test test1 test2 +# Task 1: Change the Permission of file/directories +``` +ls -lrt test +chmod g+s test +``` +# Task 2: Change the ownership of a file/directory +``` +ls -lrt test +sudo chown paragp test +``` +# Task 3: Change the group permission of a file/directory +``` +ls -lrt test +sudo chgrp dev test +``` +# Access Control Lists (ACL) commands getfacl and setfacl +sudo apt install acl +getfact ParagFolder-9 \ No newline at end of file From ac19a70e537e0fdf70328d917c15936169bd04cf Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Sat, 22 Jul 2023 09:33:55 +0530 Subject: [PATCH 108/394] folder two digit and day 7 --- submission/{day1 => day01}/tasks.md | 0 submission/{day2 => day02}/tasks.md | 0 submission/{day3 => day03}/tasks.md | 0 submission/{day4 => day04}/compare.sh | 0 submission/{day4 => day04}/first.sh | 0 submission/{day4 => day04}/if_else.sh | 0 submission/{day4 => day04}/tasks.md | 0 submission/{day5 => day05}/backup.txt | 0 submission/{day5 => day05}/createDir.sh | 0 submission/{day5 => day05}/createFiles.sh | 0 submission/{day5 => day05}/tasks.md | 0 submission/{day5 => day05}/timestamp.sh | 0 submission/{day6 => day06}/tasks.md | 0 submission/day07/tasks.md | 40 +++++++++++++++++++++++ 14 files changed, 40 insertions(+) rename submission/{day1 => day01}/tasks.md (100%) rename submission/{day2 => day02}/tasks.md (100%) rename submission/{day3 => day03}/tasks.md (100%) rename submission/{day4 => day04}/compare.sh (100%) rename submission/{day4 => day04}/first.sh (100%) rename submission/{day4 => day04}/if_else.sh (100%) rename submission/{day4 => day04}/tasks.md (100%) rename submission/{day5 => day05}/backup.txt (100%) rename submission/{day5 => day05}/createDir.sh (100%) rename submission/{day5 => day05}/createFiles.sh (100%) rename submission/{day5 => day05}/tasks.md (100%) rename submission/{day5 => day05}/timestamp.sh (100%) rename submission/{day6 => day06}/tasks.md (100%) create mode 100644 submission/day07/tasks.md diff --git a/submission/day1/tasks.md b/submission/day01/tasks.md similarity index 100% rename from submission/day1/tasks.md rename to submission/day01/tasks.md diff --git a/submission/day2/tasks.md b/submission/day02/tasks.md similarity index 100% rename from submission/day2/tasks.md rename to submission/day02/tasks.md diff --git a/submission/day3/tasks.md b/submission/day03/tasks.md similarity index 100% rename from submission/day3/tasks.md rename to submission/day03/tasks.md diff --git a/submission/day4/compare.sh b/submission/day04/compare.sh similarity index 100% rename from submission/day4/compare.sh rename to submission/day04/compare.sh diff --git a/submission/day4/first.sh b/submission/day04/first.sh similarity index 100% rename from submission/day4/first.sh rename to submission/day04/first.sh diff --git a/submission/day4/if_else.sh b/submission/day04/if_else.sh similarity index 100% rename from submission/day4/if_else.sh rename to submission/day04/if_else.sh diff --git a/submission/day4/tasks.md b/submission/day04/tasks.md similarity index 100% rename from submission/day4/tasks.md rename to submission/day04/tasks.md diff --git a/submission/day5/backup.txt b/submission/day05/backup.txt similarity index 100% rename from submission/day5/backup.txt rename to submission/day05/backup.txt diff --git a/submission/day5/createDir.sh b/submission/day05/createDir.sh similarity index 100% rename from submission/day5/createDir.sh rename to submission/day05/createDir.sh diff --git a/submission/day5/createFiles.sh b/submission/day05/createFiles.sh similarity index 100% rename from submission/day5/createFiles.sh rename to submission/day05/createFiles.sh diff --git a/submission/day5/tasks.md b/submission/day05/tasks.md similarity index 100% rename from submission/day5/tasks.md rename to submission/day05/tasks.md diff --git a/submission/day5/timestamp.sh b/submission/day05/timestamp.sh similarity index 100% rename from submission/day5/timestamp.sh rename to submission/day05/timestamp.sh diff --git a/submission/day6/tasks.md b/submission/day06/tasks.md similarity index 100% rename from submission/day6/tasks.md rename to submission/day06/tasks.md diff --git a/submission/day07/tasks.md b/submission/day07/tasks.md new file mode 100644 index 0000000000..6e29c01418 --- /dev/null +++ b/submission/day07/tasks.md @@ -0,0 +1,40 @@ +# Understanding package manager and systemctl + +# Task 1 update the package index files on the system +``` +sudo apt-get update +``` +# Task 2 Install Docker +``` +sudo apt install docker.io -y +sudo systemctl start docker +sudo systemctl status docker +sudo systemctl stop docker.socket +sudo systemctl status docker +``` +Once it is started use systemd systemctl commands to check docker status + +check this link for difference between + +sudo systemctl stop docker and sudo systemctl stop docker.socket +https://stackoverflow.com/questions/47489631/warning-stopping-docker-service-but-it-can-still-be-activated-by-docker-socke + + +# Task 3 Install Jenkins +Install Java JDK in order to get jenkins working +``` +java -version +sudo apt install openjdk-17-jre-headless +sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo +curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null +echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null +sudo apt-get update +sudo apt-get install jenkins -y +sudo systemctl status jenkins +``` + +# Task 4 Install Apache +``` +sudo apt install apache2 +sudo systemctl status apache2 +``` \ No newline at end of file From 7eac9072a6d245d5d1fe6fdde8aadcdc18fe3953 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Sat, 22 Jul 2023 09:45:25 +0530 Subject: [PATCH 109/394] day 7 submissions --- submission/day07/tasks.md | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/submission/day07/tasks.md b/submission/day07/tasks.md index 6e29c01418..93b6145dda 100644 --- a/submission/day07/tasks.md +++ b/submission/day07/tasks.md @@ -4,6 +4,8 @@ ``` sudo apt-get update ``` +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/26505115-8bab-49df-9010-0eb750c13e5a) + # Task 2 Install Docker ``` sudo apt install docker.io -y @@ -12,9 +14,19 @@ sudo systemctl status docker sudo systemctl stop docker.socket sudo systemctl status docker ``` +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/ed4bd9ef-2315-4c26-a716-342bdc7187fa) + Once it is started use systemd systemctl commands to check docker status -check this link for difference between +Docker Running + +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/a8c0d0ca-f516-482a-9952-af24c867daf9) + +Docker socket stopped +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/0b67f215-98f2-4e94-bc18-7a410797360c) + + +check this link for differences between sudo systemctl stop docker and sudo systemctl stop docker.socket https://stackoverflow.com/questions/47489631/warning-stopping-docker-service-but-it-can-still-be-activated-by-docker-socke @@ -22,6 +34,8 @@ https://stackoverflow.com/questions/47489631/warning-stopping-docker-service-but # Task 3 Install Jenkins Install Java JDK in order to get jenkins working +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/50f44541-874c-4986-b2f7-a57fbeb78bfd) + ``` java -version sudo apt install openjdk-17-jre-headless @@ -32,9 +46,21 @@ sudo apt-get update sudo apt-get install jenkins -y sudo systemctl status jenkins ``` +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/ce9447e9-5a1a-412f-ab8e-6f3b92430eb0) + +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/9420cee8-166c-4a4f-90ec-806a067002a2) + +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/779d029b-4047-4af0-bb90-b8b331fbd9e4) # Task 4 Install Apache ``` sudo apt install apache2 sudo systemctl status apache2 -``` \ No newline at end of file +``` +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/892e02b3-55b8-427b-a1cb-d006686e8903) + +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/9d97d743-4c74-472f-bdfe-de4781ab5901) + +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/fda362ba-4515-4b18-868a-23dbefc53d77) + + From 00db547142b872d7c3e9da6fdaa989113b4df6c0 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Sun, 23 Jul 2023 10:00:45 +0530 Subject: [PATCH 110/394] Day 8 submission --- submission/day08/tasks.md | 40 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 submission/day08/tasks.md diff --git a/submission/day08/tasks.md b/submission/day08/tasks.md new file mode 100644 index 0000000000..0b7b72cee9 --- /dev/null +++ b/submission/day08/tasks.md @@ -0,0 +1,40 @@ +# Day 8 Basic Git & GitHub + +# Task Install Git on your computer + +https://git-scm.com/book/en/v2/Getting-Started-Installing-Git + +windows +Just go to https://git-scm.com/download/win and the download will start automatically. +linux +sudo apt install git-all + +# Task 2 Create a free account on GitHub + +You can sign up at https://github.com/ +Also update basic profile + +# Task 3 Create a new repository on GitHub and clone it to your local machine +I have created https://github.com/paragpallavsingh/git_test + +I am going to clone the repository in below path +Windows path: F:\Workspace\github +Git bash path: /f/Workspace/github + +We'll open installed git bash and go to the above path. Make sure you use the path as described above. +``` +cd /f/Workspace/github +git clone https://github.com/paragpallavsingh/git_test.git +cd git_test/ +``` + +# Task 4 Make some changes to a file in the repository and commit them to the repository using Git +# Task 5 Push the changes back to the repository on GitHub +``` +ls +vi fileA.txt +git status +git add . +git commit -m "update fileA and push to remote" +git push origin master +``` \ No newline at end of file From 59fc62994b76d3678439e1cab638bcf37a2999c0 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Sun, 23 Jul 2023 10:55:31 +0530 Subject: [PATCH 111/394] add images in day 8 submission --- submission/day08/tasks.md | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/submission/day08/tasks.md b/submission/day08/tasks.md index 0b7b72cee9..5ec3a98faa 100644 --- a/submission/day08/tasks.md +++ b/submission/day08/tasks.md @@ -5,30 +5,43 @@ https://git-scm.com/book/en/v2/Getting-Started-Installing-Git windows + Just go to https://git-scm.com/download/win and the download will start automatically. -linux -sudo apt install git-all +Linux +``` +sudo apt install git-all +``` # Task 2 Create a free account on GitHub You can sign up at https://github.com/ -Also update basic profile + +Also, update basic profile +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/af8fa834-b1d2-4d8b-88f7-7dd2856a8b2b) + # Task 3 Create a new repository on GitHub and clone it to your local machine I have created https://github.com/paragpallavsingh/git_test +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/3d1a8ccf-eb73-47cd-87ed-bf9cfaf61313) + + +I am going to clone the repository in the below path on my local system. You can change folder as per your choice +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/8e9d4979-168a-48c3-b956-21c2a5dbdff7) -I am going to clone the repository in below path Windows path: F:\Workspace\github -Git bash path: /f/Workspace/github +Git bash path: /f/Workspace/GitHub -We'll open installed git bash and go to the above path. Make sure you use the path as described above. +We'll open the installed git bash and go to the above path. Make sure you use the path as described above. ``` cd /f/Workspace/github git clone https://github.com/paragpallavsingh/git_test.git cd git_test/ ``` +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/686aebaf-7c9b-4566-bef6-076d5e7d533f) # Task 4 Make some changes to a file in the repository and commit them to the repository using Git +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/fe4e4800-248a-4d18-9808-0da784d59de1) + # Task 5 Push the changes back to the repository on GitHub ``` ls @@ -37,4 +50,5 @@ git status git add . git commit -m "update fileA and push to remote" git push origin master -``` \ No newline at end of file +``` +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/5bc468f5-98fc-4118-ad55-887e4e3e8dbf) From 9426b01ce09d691bd523f16c1bace486f1fe765a Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Sun, 23 Jul 2023 21:16:51 +0530 Subject: [PATCH 112/394] to be deleted later --- submission/day02/tasks.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/submission/day02/tasks.md b/submission/day02/tasks.md index 00a2190ac0..69d4f46ce4 100644 --- a/submission/day02/tasks.md +++ b/submission/day02/tasks.md @@ -18,3 +18,7 @@ Here is a detailed [blog over Introduction to Linux](https://paragpallavsingh.co Note: [Check this file for reference](basic_linux_commands.md) Check the basic_linux_commands.md file on the same directory day2 + + +Just ignore this image +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/395419a7-b11c-4fbf-9a5e-edc682149a86) From fce79c71d1b842d74971a05fba8c1d47f47936d2 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Mon, 24 Jul 2023 10:32:29 +0530 Subject: [PATCH 113/394] udpate day 9 task --- submission/day09/tasks.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 submission/day09/tasks.md diff --git a/submission/day09/tasks.md b/submission/day09/tasks.md new file mode 100644 index 0000000000..00b8555379 --- /dev/null +++ b/submission/day09/tasks.md @@ -0,0 +1,26 @@ +# Deep Dive in Git & GitHub + +## task-1: Set your user name and email address, which will be associated with your commit + +## task-2: +* Create a repository named "90DaysOfDevOps" on GitHub +* Connect your local repository to the repository on GitHub. +``` +cd /f/Workspace/github +git clone https://github.com/paragpallavsingh/90DaysOfDevOps.git +``` +* Create a new file 90DaysOfDevOps\submission\tasks.md & add some content to it. +``` +cd 90DaysOfDevOps\submission + +#in linux terminal +vi tasks.md +#in windows - make a new file tasks.md in respective folder +``` +* Push your local commits to the repository on GitHub +``` +git status +git add . +git commit -m "update tasks.md" +git push origin master +``` From 173178680f236a3b2fd37d600ca5ae3b1b7fb726 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Mon, 24 Jul 2023 11:04:39 +0530 Subject: [PATCH 114/394] Update tasks.md --- submission/day09/tasks.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/submission/day09/tasks.md b/submission/day09/tasks.md index 00b8555379..a2c5ef9e3e 100644 --- a/submission/day09/tasks.md +++ b/submission/day09/tasks.md @@ -1,14 +1,25 @@ # Deep Dive in Git & GitHub ## task-1: Set your user name and email address, which will be associated with your commit +``` +git config --global user.name "Parag Pallav Singh" +git config --global user.email "thxxxxparag@gmail.com" +``` +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/c4826de5-0060-41c1-b5a1-c10b2540070b) ## task-2: * Create a repository named "90DaysOfDevOps" on GitHub + +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/360d6d91-20a0-4e5b-9432-ca225a2da7e2) + * Connect your local repository to the repository on GitHub. ``` cd /f/Workspace/github git clone https://github.com/paragpallavsingh/90DaysOfDevOps.git ``` +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/792d3314-0713-48f6-82d6-df29c10ab246) + + * Create a new file 90DaysOfDevOps\submission\tasks.md & add some content to it. ``` cd 90DaysOfDevOps\submission From 117582b2a6a419608dbd9bb09ce75e95c6fd1d79 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Mon, 24 Jul 2023 11:06:13 +0530 Subject: [PATCH 115/394] Add updates to day 9 tasks --- submission/day09/tasks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submission/day09/tasks.md b/submission/day09/tasks.md index a2c5ef9e3e..1ab8d3be99 100644 --- a/submission/day09/tasks.md +++ b/submission/day09/tasks.md @@ -26,7 +26,7 @@ cd 90DaysOfDevOps\submission #in linux terminal vi tasks.md -#in windows - make a new file tasks.md in respective folder +#in windows - make a new file tasks.md in respective folder and update ``` * Push your local commits to the repository on GitHub ``` From d6b07650f82a0d975dea2a4623130086be2f32a7 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Mon, 24 Jul 2023 11:09:39 +0530 Subject: [PATCH 116/394] Add images to day 9 tasks --- submission/day09/tasks.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/submission/day09/tasks.md b/submission/day09/tasks.md index 1ab8d3be99..0d7055d9e4 100644 --- a/submission/day09/tasks.md +++ b/submission/day09/tasks.md @@ -28,6 +28,9 @@ cd 90DaysOfDevOps\submission vi tasks.md #in windows - make a new file tasks.md in respective folder and update ``` + +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/ac7392ec-d8ec-4902-93b8-a10ceb2f3c80) + * Push your local commits to the repository on GitHub ``` git status @@ -35,3 +38,4 @@ git add . git commit -m "update tasks.md" git push origin master ``` +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/f0a12d8b-968f-448f-aca8-ec22c4ff6fce) From 28f5559ab6c811d361a34f2660615b884fea2584 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Wed, 26 Jul 2023 12:00:50 +0530 Subject: [PATCH 117/394] Add submission to day 10 --- submission/day10/tasks.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 submission/day10/tasks.md diff --git a/submission/day10/tasks.md b/submission/day10/tasks.md new file mode 100644 index 0000000000..5d6d484cea --- /dev/null +++ b/submission/day10/tasks.md @@ -0,0 +1,30 @@ +# Day 10 Task: Advance Git & GitHub + +# Task 1: Git Branch +``` +git checkout master +git checkout -b day10 +``` + +# Task2: Update some files and push branch to remote +``` +git status +git add . +git commit -m "Add feature 1" +git push origin day10 +``` + +# Task 3: Git Revert +``` +# try to revert wrong code using commit id +git revert #commitid + +#if there's a conflict, remove that using mergetool=> p4merge +``` +# Task 4: Git Rebase +``` + +``` +# Task 4: Git merge +``` +``` \ No newline at end of file From f2ce42710fbf421234bd2128c80fd6fea5fb3c77 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Wed, 26 Jul 2023 12:03:33 +0530 Subject: [PATCH 118/394] Add feature 1 --- newfeature | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 newfeature diff --git a/newfeature b/newfeature new file mode 100644 index 0000000000..28a1caca70 --- /dev/null +++ b/newfeature @@ -0,0 +1,5 @@ +This is a new feature A line + +This is feature A line 2 + +This is feature A line 3 From 3ad9c16ff69f906b830bf1b3329ee11c612aef3d Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Wed, 26 Jul 2023 12:08:45 +0530 Subject: [PATCH 119/394] Add Feature b --- newfeature | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/newfeature b/newfeature index 28a1caca70..fe0cae9870 100644 --- a/newfeature +++ b/newfeature @@ -3,3 +3,7 @@ This is a new feature A line This is feature A line 2 This is feature A line 3 + +This is feature B line 1 + +This is feature B line 2 From 0254bc3099d39a9c6b2d2d0c0427c3b7a282d3eb Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Wed, 26 Jul 2023 12:10:19 +0530 Subject: [PATCH 120/394] Update some part of feature A --- newfeature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/newfeature b/newfeature index fe0cae9870..3cc7d833d4 100644 --- a/newfeature +++ b/newfeature @@ -1,6 +1,6 @@ This is a new feature A line -This is feature A line 2 +This is feature B update to feature A line 2 This is feature A line 3 From 22484ff34b6ecedbeb83f860f781d730ec98b1bc Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Wed, 26 Jul 2023 12:10:48 +0530 Subject: [PATCH 121/394] Revert "Update some part of feature A" This reverts commit 0254bc3099d39a9c6b2d2d0c0427c3b7a282d3eb. --- newfeature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/newfeature b/newfeature index 3cc7d833d4..fe0cae9870 100644 --- a/newfeature +++ b/newfeature @@ -1,6 +1,6 @@ This is a new feature A line -This is feature B update to feature A line 2 +This is feature A line 2 This is feature A line 3 From 9f2cfffac5b94eeed20d8e3a649f7bc079df538f Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Wed, 26 Jul 2023 12:22:13 +0530 Subject: [PATCH 122/394] Add feature C --- newfeature | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/newfeature b/newfeature index fe0cae9870..9593765b7f 100644 --- a/newfeature +++ b/newfeature @@ -7,3 +7,9 @@ This is feature A line 3 This is feature B line 1 This is feature B line 2 + +This is feature C line 1 + +This is feature C line 2 + +This is feature C line 3 From 8b95cbc7ce808771443c6a7a35a2d4a768fd677e Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Wed, 26 Jul 2023 12:36:55 +0530 Subject: [PATCH 123/394] add images to day 10 --- submission/day10/tasks.md | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/submission/day10/tasks.md b/submission/day10/tasks.md index 5d6d484cea..57d6c129f2 100644 --- a/submission/day10/tasks.md +++ b/submission/day10/tasks.md @@ -5,26 +5,45 @@ git checkout master git checkout -b day10 ``` +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/5fc9ba30-4159-41fb-96c8-4f17f1aebf71) -# Task2: Update some files and push branch to remote + +# Task2: Update some files and push the branch to the remote ``` git status git add . git commit -m "Add feature 1" git push origin day10 ``` +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/ddca6e76-2dd7-44f2-9541-7c26abc06402) # Task 3: Git Revert -``` -# try to revert wrong code using commit id -git revert #commitid +Assume you are adding a new feature B. and updating small tasks in small commits. +You accidentally modified the content of feature A. Now you need to revert that change +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/848ee298-3dd8-4f01-b364-5bf5fcb87c36) + +``` +# Try to revert the wrong code using the commit id +git log -n 5 +git revert 0254bc3099d39a9c6b2d2d0c0427c3b7a282d3eb #if there's a conflict, remove that using mergetool=> p4merge ``` -# Task 4: Git Rebase +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/cc6cf745-1376-4dae-8c96-7d4e0d3df941) +# Task 4: Git Merge +Now you are done with newfeature and you try to merge to main branch +``` +git checkout master #target branch +git merge day10 #branch to be merged ``` +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/23f471fa-efe6-40f5-a1ff-9afb7aecbdad) +# Task 4: Git rebase +Rebasing is the process of moving or combining a sequence of commits to a new base commit ``` -# Task 4: Git merge +git rebase day10 ``` -``` \ No newline at end of file +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/27974a81-39e5-42aa-83e3-d18bed621244) + +After rebase, the out looks like +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/c82da8b0-e591-458f-92e0-78b75c515696) From 539b47583682333852f2a9d977e3cd3d842dc525 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Wed, 26 Jul 2023 12:39:41 +0530 Subject: [PATCH 124/394] move file --- newfeature => submission/day10/newfeature | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename newfeature => submission/day10/newfeature (100%) diff --git a/newfeature b/submission/day10/newfeature similarity index 100% rename from newfeature rename to submission/day10/newfeature From a75d9a5a6b8e6ca19fc936a200ec6f910a66c2de Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Wed, 26 Jul 2023 12:45:49 +0530 Subject: [PATCH 125/394] Update tasks.md --- submission/day10/tasks.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/submission/day10/tasks.md b/submission/day10/tasks.md index 57d6c129f2..0260ae74cb 100644 --- a/submission/day10/tasks.md +++ b/submission/day10/tasks.md @@ -47,3 +47,8 @@ git rebase day10 After rebase, the out looks like ![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/c82da8b0-e591-458f-92e0-78b75c515696) + +## Addon +When you are done with merging your changes to main/master, you can safely remove branches. +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/fa3fdc02-7b52-4bb8-9230-b9a5b09412ec) + From 24a5221778bfaa9e9cc9e842659e17263bca9765 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Wed, 26 Jul 2023 14:07:57 +0530 Subject: [PATCH 126/394] day 11 add --- submission/day11/tasks.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 submission/day11/tasks.md diff --git a/submission/day11/tasks.md b/submission/day11/tasks.md new file mode 100644 index 0000000000..b20f0195a3 --- /dev/null +++ b/submission/day11/tasks.md @@ -0,0 +1 @@ +# Day 11 Task: Advance Git & GitHub Part 2 \ No newline at end of file From 9a1dc0559f3a77447e13c2f74033c542a08f3ce6 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Wed, 26 Jul 2023 14:31:17 +0530 Subject: [PATCH 127/394] add newfeature --- submission/day11/newfeature | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 submission/day11/newfeature diff --git a/submission/day11/newfeature b/submission/day11/newfeature new file mode 100644 index 0000000000..9593765b7f --- /dev/null +++ b/submission/day11/newfeature @@ -0,0 +1,15 @@ +This is a new feature A line + +This is feature A line 2 + +This is feature A line 3 + +This is feature B line 1 + +This is feature B line 2 + +This is feature C line 1 + +This is feature C line 2 + +This is feature C line 3 From 9b87e048ed7ea00239da2dd16754adcedbc2782d Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Wed, 26 Jul 2023 14:33:04 +0530 Subject: [PATCH 128/394] add cpfile --- submission/day11/cpfile.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 submission/day11/cpfile.txt diff --git a/submission/day11/cpfile.txt b/submission/day11/cpfile.txt new file mode 100644 index 0000000000..99850befde --- /dev/null +++ b/submission/day11/cpfile.txt @@ -0,0 +1 @@ +this is a new file added in branch \ No newline at end of file From a9a35c268468106760e91b8a6736e800660a9d31 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Wed, 26 Jul 2023 15:29:52 +0530 Subject: [PATCH 129/394] add images day 11 --- submission/day11/tasks.md | 40 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/submission/day11/tasks.md b/submission/day11/tasks.md index b20f0195a3..ddcde9cee8 100644 --- a/submission/day11/tasks.md +++ b/submission/day11/tasks.md @@ -1 +1,39 @@ -# Day 11 Task: Advance Git & GitHub Part 2 \ No newline at end of file +# Day 11 Task: Advance Git & GitHub Part 2 + +## Task 1: Cherry-pick +Git cherry-pick is a command that allows you to select specific commits from one branch and apply them to another. +``` +git checkout master +git checkout -b cherrypick/day11 +#add a cpfile.txt. We will cherry-pick the changes in the following commit to the master branch +git status +git add . +git commit -m "add cpfile" +git log -n 3 #to find the commit id that needs to be cherry-picked +``` +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/056f1466-05a9-46f3-8583-1a76ada3f710) + +``` +#actual cherry-picking a commit +git checkout master +git cherry-pick 140275676a03cb9e53416f39d38c0e8ff68d50dc +``` +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/fc8da22c-cd96-4e8b-8e94-9939788ff962) + +## Task 2: Git Stash +``` +git status +git add . +git stash + +``` +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/cf90ae49-df17-4fa8-b706-09670c92481d) + +``` +git stash pop +git add . +git push origin day11 +``` +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/7d7234a0-4fb1-4a6b-877d-8caaedb5056a) + + From 192e31950ad58f4ff5f40e3186bebe4743bad67a Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Wed, 26 Jul 2023 15:51:15 +0530 Subject: [PATCH 130/394] Add Linux Commands --- submission/day12/tasks.md | 115 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 submission/day12/tasks.md diff --git a/submission/day12/tasks.md b/submission/day12/tasks.md new file mode 100644 index 0000000000..51384234c8 --- /dev/null +++ b/submission/day12/tasks.md @@ -0,0 +1,115 @@ +# Sumup of Linux & Git-GitHub handson + +## We did covered a lot of commands + +1. Basic Commands +| **Command** | **Description** | +|-----------------------------------------------------------------|--------------------------------------------------------------------------------------------| +| ls | Lists all files and directories in the present working directory | +| ls -R | Lists files in sub-directories as well | +| ls -a | Lists hidden files as well | +| ls -al | Lists files and directories with detailed information like permissions,size, owner, etc. | +| cd or cd ~ | Navigate to HOME directory | +| cd .. | Move one level up | +| cd | To change to a particular directory | +| cd / | Move to the root directory | +| cat > filename | Creates a new file | +| cat filename | Displays the file content | +| cat file1 file2 > file3 | Joins two files (file1, file2) and stores the output in a new file (file3) | +| mv file "new file path" | Moves the files to the new location | +| mv filename new_file_name | Renames the file to a new filename | +| sudo | Allows regular users to run programs with the security privileges of the superuser or root | +| rm filename | Deletes a file | +| man | Gives help information on a command | +| history | Gives a list of all past commands typed in the current terminal session | +| clear | Clears the terminal | +| mkdir directoryname | Creates a new directory in the present working directory or a at the specified path | +| rmdir | Deletes a directory | +| mv | Renames a directory | +| pr -x | Divides the file into x columns | +| pr -h | Assigns a header to the file | +| pr -n | Denotes the file with Line Numbers | +| lp -nc , lpr c | Prints “c” copies of the File | +| lp-d lp-P | Specifies name of the printer | +| apt-get | Command used to install and update packages | +| mail -s 'subject' -c 'cc-address' -b 'bcc-address' 'to-address' | Command to send email | +| mail -s "Subject" to-address < Filename | Command to send email with attachment | + +2. File Permission commands +| **Command** | **Description** | +|---------------------------|----------------------------------------------------------| +| ls -l | to show file type and access permission | +| r | read permission | +| w | write permission | +| x | execute permission | +| -= | no permission | +| Chown user | For changing the ownership of a file/directory | +| Chown user:group filename | change the user as well as group for a file or directory | + +3. Environment Variables command +| **Command** | **Description** | +|-------------------------------|-----------------------------------------| +| echo $VARIABLE | To display value of a variable | +| env | Displays all environment variables | +| VARIABLE_NAME= variable_value | Create a new variable | +| Unset | Remove a variable | +| export Variable=value | To set value of an environment variable | + +4. User management commands of linux +| **Command** | **Description** | +|---------------------------------------|----------------------------------| +| sudo adduser username | To add a new user | +| sudo passwd -l 'username' | To change the password of a user | +| sudo userdel -r 'username' | To remove a newly created user | +| sudo usermod -a -G GROUPNAME USERNAME | To add a user to a group | +| sudo deluser USER GROUPNAME | To remove a user from a group | + +5. Networking command +| **Command** | **Description** | +|-------------------------------------|-------------------------------------------------------------| +| SSH username@ip-address or hostname | login into a remote Linux machine using SSH | +| Ping hostname="" or ="" | To ping and Analyzing network and host connections | +| dir | Display files in the current directory of a remote computer | +| cd "dirname" | change directory to “dirname” on a remote computer | +| put file | upload ‘file’ from local to remote computer | +| get file | Download ‘file’ from remote to local computer | +| quit | Logout | + +6. Process command +| **Command** | **Description** | +|-------------|-------------------------------------------------| +| bg | To send a process to the background | +| fg | To run a stopped process in the foreground | +| top | Details on all Active Processes | +| ps | Give the status of processes running for a user | +| ps PID | Gives the status of a particular process | +| pidof | Gives the Process ID (PID) of a process | +| kill PID | Kills a process | +| nice | Starts a process with a given priority | +| renice | Changes priority of an already running process | +| df | Gives free hard disk space on your system | +| free | Gives free RAM on your system | + +7. VI Editing Commands +| **Command** | **Description** | +|-------------|-------------------------------------------------------------------------------------------------| +| i | Insert at cursor (goes into insert mode) | +| a | Write after cursor (goes into insert mode) | +| A | Write at the end of line (goes into insert mode) | +| ESC | Terminate insert mode | +| u | Undo last change | +| U | Undo all changes to the entire line | +| o | Open a new line (goes into insert mode) | +| dd | Delete line | +| 3dd | Delete 3 lines | +| D | Delete contents of line after the cursor | +| C | Delete contents of a line after the cursor and insert new text. Press ESC key to end insertion. | +| dw | Delete word | +| 4dw | Delete 4 words | +| cw | Change word | +| x | Delete character at the cursor | +| r | Replace character | +| R | Overwrite characters from cursor onward | +| s | Substitute one character under cursor continue to insert | +| S | Substitute entire line and begin to insert at the beginning of the line | +| ~ | Change case of individual character | \ No newline at end of file From 24b75f5fc8ea57e1cc1491027deeeb49e549e253 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Wed, 26 Jul 2023 16:04:34 +0530 Subject: [PATCH 131/394] Linux hands on --- submission/day12/tasks.md | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/submission/day12/tasks.md b/submission/day12/tasks.md index 51384234c8..f4d952274f 100644 --- a/submission/day12/tasks.md +++ b/submission/day12/tasks.md @@ -2,10 +2,11 @@ ## We did covered a lot of commands -1. Basic Commands -| **Command** | **Description** | -|-----------------------------------------------------------------|--------------------------------------------------------------------------------------------| -| ls | Lists all files and directories in the present working directory | +### 1. Basic Commands + +| **Command** | **Description** | +| ----------- | --------------- | +|ls|Lists all files and directories in the present working directory| | ls -R | Lists files in sub-directories as well | | ls -a | Lists hidden files as well | | ls -al | Lists files and directories with detailed information like permissions,size, owner, etc. | @@ -35,7 +36,8 @@ | mail -s 'subject' -c 'cc-address' -b 'bcc-address' 'to-address' | Command to send email | | mail -s "Subject" to-address < Filename | Command to send email with attachment | -2. File Permission commands +### 2. File Permission commands + | **Command** | **Description** | |---------------------------|----------------------------------------------------------| | ls -l | to show file type and access permission | @@ -46,7 +48,8 @@ | Chown user | For changing the ownership of a file/directory | | Chown user:group filename | change the user as well as group for a file or directory | -3. Environment Variables command +### 3. Environment Variables command + | **Command** | **Description** | |-------------------------------|-----------------------------------------| | echo $VARIABLE | To display value of a variable | @@ -55,7 +58,8 @@ | Unset | Remove a variable | | export Variable=value | To set value of an environment variable | -4. User management commands of linux +### 4. User management commands of linux + | **Command** | **Description** | |---------------------------------------|----------------------------------| | sudo adduser username | To add a new user | @@ -64,7 +68,8 @@ | sudo usermod -a -G GROUPNAME USERNAME | To add a user to a group | | sudo deluser USER GROUPNAME | To remove a user from a group | -5. Networking command +### 5. Networking command + | **Command** | **Description** | |-------------------------------------|-------------------------------------------------------------| | SSH username@ip-address or hostname | login into a remote Linux machine using SSH | @@ -75,7 +80,8 @@ | get file | Download ‘file’ from remote to local computer | | quit | Logout | -6. Process command +### 6. Process command + | **Command** | **Description** | |-------------|-------------------------------------------------| | bg | To send a process to the background | @@ -90,7 +96,8 @@ | df | Gives free hard disk space on your system | | free | Gives free RAM on your system | -7. VI Editing Commands +### 7. VI Editing Commands + | **Command** | **Description** | |-------------|-------------------------------------------------------------------------------------------------| | i | Insert at cursor (goes into insert mode) | @@ -112,4 +119,4 @@ | R | Overwrite characters from cursor onward | | s | Substitute one character under cursor continue to insert | | S | Substitute entire line and begin to insert at the beginning of the line | -| ~ | Change case of individual character | \ No newline at end of file +| ~ | Change case of individual character | From 59e9d96b858e2892e302a06f363fa57b19b9b003 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Sat, 29 Jul 2023 11:29:49 +0530 Subject: [PATCH 132/394] day 13 --- submission/day13/tasks.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 submission/day13/tasks.md diff --git a/submission/day13/tasks.md b/submission/day13/tasks.md new file mode 100644 index 0000000000..e69de29bb2 From d18e49498998b7b265385b88a3ff35536708a08c Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Sat, 29 Jul 2023 11:30:35 +0530 Subject: [PATCH 133/394] day 13 --- submission/day13/tasks.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/submission/day13/tasks.md b/submission/day13/tasks.md index e69de29bb2..f32987c1db 100644 --- a/submission/day13/tasks.md +++ b/submission/day13/tasks.md @@ -0,0 +1,8 @@ +# Basics of Python + +## Install Python +For windows https://www.python.org/downloads/ +For linux distro apt-get install python 3.9 +``` +python --version +``` \ No newline at end of file From 6276b23d56075423277ef8e7186bdc8a1a5eedfd Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Sat, 29 Jul 2023 11:33:01 +0530 Subject: [PATCH 134/394] add image --- submission/day13/tasks.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/submission/day13/tasks.md b/submission/day13/tasks.md index f32987c1db..f56c94d0fa 100644 --- a/submission/day13/tasks.md +++ b/submission/day13/tasks.md @@ -1,8 +1,11 @@ # Basics of Python ## Install Python + For windows https://www.python.org/downloads/ + For linux distro apt-get install python 3.9 ``` python --version -``` \ No newline at end of file +``` +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/91e953b3-28c3-4e54-8864-ae43e23e49f0) From 4e6cfbc24f1fd86cd56e28eb2505c32684e929a1 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Sat, 29 Jul 2023 13:27:15 +0530 Subject: [PATCH 135/394] add space --- submission/day09/tasks.md | 1 + 1 file changed, 1 insertion(+) diff --git a/submission/day09/tasks.md b/submission/day09/tasks.md index 0d7055d9e4..1f453ca2ca 100644 --- a/submission/day09/tasks.md +++ b/submission/day09/tasks.md @@ -14,6 +14,7 @@ git config --global user.email "thxxxxparag@gmail.com" * Connect your local repository to the repository on GitHub. ``` + cd /f/Workspace/github git clone https://github.com/paragpallavsingh/90DaysOfDevOps.git ``` From 4ceee53fbf28d00ec16142a226bebe4065e430c7 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Sat, 29 Jul 2023 13:34:25 +0530 Subject: [PATCH 136/394] update day 14 submission --- submission/day09/tasks.md | 1 - submission/day14/dict.py | 18 ++++++++++++++++++ submission/day14/tasks.md | 0 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 submission/day14/dict.py create mode 100644 submission/day14/tasks.md diff --git a/submission/day09/tasks.md b/submission/day09/tasks.md index 1f453ca2ca..0d7055d9e4 100644 --- a/submission/day09/tasks.md +++ b/submission/day09/tasks.md @@ -14,7 +14,6 @@ git config --global user.email "thxxxxparag@gmail.com" * Connect your local repository to the repository on GitHub. ``` - cd /f/Workspace/github git clone https://github.com/paragpallavsingh/90DaysOfDevOps.git ``` diff --git a/submission/day14/dict.py b/submission/day14/dict.py new file mode 100644 index 0000000000..d12791b106 --- /dev/null +++ b/submission/day14/dict.py @@ -0,0 +1,18 @@ +fav_tools = { + 1:"Linux", + 2:"Git", + 3:"Docker", + 4:"Kubernetes", + 5:"Terraform", + 6:"Ansible", + 7:"Chef" +} + +try: + user_input = int(input("Enter the key for tool: ")) + if user_input in fav_tools: + print("Your favorite tool :", fav_tools[user_input]) + else: + print("Not in dict") +except ValueError: + print("Invalid input. Please enter a valid integer key.") diff --git a/submission/day14/tasks.md b/submission/day14/tasks.md new file mode 100644 index 0000000000..e69de29bb2 From 4d5249523eb5baa48fd53758d0225424ec4f72ed Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Sat, 29 Jul 2023 20:08:31 +0530 Subject: [PATCH 137/394] udpate day14 task in branch --- submission/day14/tasks.md | 1 + 1 file changed, 1 insertion(+) diff --git a/submission/day14/tasks.md b/submission/day14/tasks.md index e69de29bb2..055b6ff926 100644 --- a/submission/day14/tasks.md +++ b/submission/day14/tasks.md @@ -0,0 +1 @@ +task completed \ No newline at end of file From 1c6d1234910bb9ad7db8706b1f641dce9eede171 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Mon, 31 Jul 2023 09:36:43 +0530 Subject: [PATCH 138/394] Update tasks.md --- submission/day14/tasks.md | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/submission/day14/tasks.md b/submission/day14/tasks.md index 055b6ff926..44d6838587 100644 --- a/submission/day14/tasks.md +++ b/submission/day14/tasks.md @@ -1 +1,30 @@ -task completed \ No newline at end of file +task completed + +1. Create below Dictionary and use Dictionary methods to print your favourite tool just by using the keys of the Dictionary. + +add-on: if the key is not in the list, it will show "Not in dict" + +image + +Refer: [dict.py](https://github.com/paragpallavsingh/90DaysOfDevOps/blob/master/submission/day14/dict.py) + +``` +fav_tools = { + 1:"Linux", + 2:"Git", + 3:"Docker", + 4:"Kubernetes", + 5:"Terraform", + 6:"Ansible", + 7:"Chef" +} + +try: + user_input = int(input("Enter the key for tool: ")) + if user_input in fav_tools: + print("Your favorite tool :", fav_tools[user_input]) + else: + print("Not in dict") +except ValueError: + print("Invalid input. Please enter a valid integer key.") +```` From 5d5976107e3fab06ff5999f1e6d35cd1b7dbe8a3 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Mon, 31 Jul 2023 09:43:27 +0530 Subject: [PATCH 139/394] add cloud list task --- submission/day14/cloudlist.py | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 submission/day14/cloudlist.py diff --git a/submission/day14/cloudlist.py b/submission/day14/cloudlist.py new file mode 100644 index 0000000000..1bc728cdd3 --- /dev/null +++ b/submission/day14/cloudlist.py @@ -0,0 +1,5 @@ +cloud_providers = ["AWS", "GCP", "Azure"] +print('before: ',cloud_providers) +cloud_providers.append("Digital Ocean") +cloud_providers.sort() +print('after: ',cloud_providers) From e9fd3d3328b74ba6dedffdd86211bfc35afb4237 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Mon, 31 Jul 2023 09:48:26 +0530 Subject: [PATCH 140/394] Update tasks.md day 14 complete --- submission/day14/tasks.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/submission/day14/tasks.md b/submission/day14/tasks.md index 44d6838587..b6caffc646 100644 --- a/submission/day14/tasks.md +++ b/submission/day14/tasks.md @@ -1,6 +1,6 @@ task completed -1. Create below Dictionary and use Dictionary methods to print your favourite tool just by using the keys of the Dictionary. +**1. Create below Dictionary and use Dictionary methods to print your favourite tool just by using the keys of the Dictionary.** add-on: if the key is not in the list, it will show "Not in dict" @@ -28,3 +28,19 @@ try: except ValueError: print("Invalid input. Please enter a valid integer key.") ```` + +**2. Create a List of cloud service providers. Write a program to add Digital Ocean to the list of cloud_providers and sort the list in alphabetical order.** + +add-on: print an original list named before, and print updated list, named after + +image + +Refer: [cloudlist.py](https://github.com/paragpallavsingh/90DaysOfDevOps/blob/master/submission/day14/cloudlist.py) + +``` +cloud_providers = ["AWS", "GCP", "Azure"] +print('before: ',cloud_providers) +cloud_providers.append("Digital Ocean") +cloud_providers.sort() +print('after: ',cloud_providers) +``` From 0e3ae0de12ab09360f375020808e192e9fab6fb1 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Mon, 31 Jul 2023 09:50:07 +0530 Subject: [PATCH 141/394] Update tasks.md --- submission/day14/tasks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submission/day14/tasks.md b/submission/day14/tasks.md index b6caffc646..c31b98b7ad 100644 --- a/submission/day14/tasks.md +++ b/submission/day14/tasks.md @@ -1,4 +1,4 @@ -task completed +# Day 14 python tasks **1. Create below Dictionary and use Dictionary methods to print your favourite tool just by using the keys of the Dictionary.** From d0a427aedd422012bb7c26c6f021d406212e9c17 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Mon, 31 Jul 2023 10:03:56 +0530 Subject: [PATCH 142/394] add day 15 tasks --- submission/day15/data.json | 1 + submission/day15/dict2json.py | 18 ++++++++++++++++++ submission/day15/parser.py | 19 +++++++++++++++++++ submission/day15/readjson.py | 14 ++++++++++++++ submission/day15/readyaml.py | 14 ++++++++++++++ submission/day15/services.json | 23 +++++++++++++++++++++++ submission/day15/services.yaml | 18 ++++++++++++++++++ submission/day15/tasks.md | 24 ++++++++++++++++++++++++ 8 files changed, 131 insertions(+) create mode 100644 submission/day15/data.json create mode 100644 submission/day15/dict2json.py create mode 100644 submission/day15/parser.py create mode 100644 submission/day15/readjson.py create mode 100644 submission/day15/readyaml.py create mode 100644 submission/day15/services.json create mode 100644 submission/day15/services.yaml create mode 100644 submission/day15/tasks.md diff --git a/submission/day15/data.json b/submission/day15/data.json new file mode 100644 index 0000000000..fe45870999 --- /dev/null +++ b/submission/day15/data.json @@ -0,0 +1 @@ +{"name": "Parag Pallav Singh", "age": 25, "course": "90 Days of Devops", "Task Day": 15} \ No newline at end of file diff --git a/submission/day15/dict2json.py b/submission/day15/dict2json.py new file mode 100644 index 0000000000..c304af85bc --- /dev/null +++ b/submission/day15/dict2json.py @@ -0,0 +1,18 @@ +import json + +# Create a dictionary +data = { + "name": "Parag Pallav Singh", + "age": 25, + "course": "90 Days of Devops", + "Task Day": 15, +} + +# Specify the file path where you want to save the JSON data +file_path = "data.json" + +# Write the dictionary to a JSON file +with open(file_path, "w") as json_file: + json.dump(data, json_file) + +print("Data has been written to 'data.json'.") diff --git a/submission/day15/parser.py b/submission/day15/parser.py new file mode 100644 index 0000000000..93d41bbb4a --- /dev/null +++ b/submission/day15/parser.py @@ -0,0 +1,19 @@ +import json +import yaml + +json_file = "services.json" +yaml_file = "services.yaml" + +with open(json_file, 'r', encoding='utf-8') as f: + json_data = json.loads(f.read()) + +print("JSON:\n",json_data) + +with open(yaml_file, "r") as stream: + try: + yaml_data = yaml.safe_load(stream) + except yaml.YAMLError as exc: + print(exc) + + +print("YAML:\n",yaml_data) \ No newline at end of file diff --git a/submission/day15/readjson.py b/submission/day15/readjson.py new file mode 100644 index 0000000000..6be5b0675f --- /dev/null +++ b/submission/day15/readjson.py @@ -0,0 +1,14 @@ +import json + +# Read the contents of the "services.json" file +with open("services.json", "r") as json_file: + data = json.load(json_file) + +# Get the "services" dictionary from the loaded JSON data +services = data["services"] + +# Print the service names of each cloud service provider +for provider, service_data in services.items(): + if provider != "debug": + service_name = service_data["name"] + print(f"Service name for {provider}: {service_name}") \ No newline at end of file diff --git a/submission/day15/readyaml.py b/submission/day15/readyaml.py new file mode 100644 index 0000000000..90997d4e9a --- /dev/null +++ b/submission/day15/readyaml.py @@ -0,0 +1,14 @@ +import yaml + +# Read the contents of the "services.yaml" file +with open("services.yaml", "r") as yaml_file: + data = yaml.safe_load(yaml_file) + +# Get the "services" dictionary from the loaded YAML data +services = data["services"] + +# Print the service names of each cloud service provider +for provider, service_data in services.items(): + if provider != "debug": + service_name = service_data["name"] + print(f"Service name for {provider}: {service_name}") \ No newline at end of file diff --git a/submission/day15/services.json b/submission/day15/services.json new file mode 100644 index 0000000000..1bc8a04f89 --- /dev/null +++ b/submission/day15/services.json @@ -0,0 +1,23 @@ +{ + "services": { + "debug": "on", + "aws": { + "name": "EC2", + "type": "pay per hour", + "instances": 500, + "count": 500 + }, + "azure": { + "name": "VM", + "type": "pay per hour", + "instances": 500, + "count": 500 + }, + "gcp": { + "name": "Compute Engine", + "type": "pay per hour", + "instances": 500, + "count": 500 + } + } + } \ No newline at end of file diff --git a/submission/day15/services.yaml b/submission/day15/services.yaml new file mode 100644 index 0000000000..0b367bc23e --- /dev/null +++ b/submission/day15/services.yaml @@ -0,0 +1,18 @@ +--- +services: + debug: 'on' + aws: + name: EC2 + type: pay per hour + instances: 500 + count: 500 + azure: + name: VM + type: pay per hour + instances: 500 + count: 500 + gcp: + name: Compute Engine + type: pay per hour + instances: 500 + count: 500 diff --git a/submission/day15/tasks.md b/submission/day15/tasks.md new file mode 100644 index 0000000000..cbaa69dd92 --- /dev/null +++ b/submission/day15/tasks.md @@ -0,0 +1,24 @@ +# Day 15 Python Tasks: Python Libraries + +**1. Create a Dictionary in Python and write it to a json File.** + +``` +import json + +# Create a dictionary +data = { + "name": "Parag Pallav Singh", + "age": 25, + "course": "90 Days of Devops", + "Task Day": 15, +} + +# Specify the file path where you want to save the JSON data +file_path = "data.json" + +# Write the dictionary to a JSON file +with open(file_path, "w") as json_file: + json.dump(data, json_file) + +print("Data has been written to 'data.json'.") +``` \ No newline at end of file From 83615a8a25abfbd56224a974e2da7eaf479398e1 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Mon, 31 Jul 2023 10:08:27 +0530 Subject: [PATCH 143/394] Add code to task.md --- submission/day15/tasks.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/submission/day15/tasks.md b/submission/day15/tasks.md index cbaa69dd92..f18a92c273 100644 --- a/submission/day15/tasks.md +++ b/submission/day15/tasks.md @@ -21,4 +21,43 @@ with open(file_path, "w") as json_file: json.dump(data, json_file) print("Data has been written to 'data.json'.") +``` + +**2. Read a json file services.json kept in this folder and print the service names of every cloud service provider.** + +``` +import json + +# Read the contents of the "services.json" file +with open("services.json", "r") as json_file: + data = json.load(json_file) + +# Get the "services" dictionary from the loaded JSON data +services = data["services"] + +# Print the service names of each cloud service provider +for provider, service_data in services.items(): + if provider != "debug": + service_name = service_data["name"] + print(f"Service name for {provider}: {service_name}") +``` + +**3. Read YAML file using python, file services.yaml and read the contents to convert yaml to json** + +``` +#pip install pyyaml +import yaml + +# Read the contents of the "services.yaml" file +with open("services.yaml", "r") as yaml_file: + data = yaml.safe_load(yaml_file) + +# Get the "services" dictionary from the loaded YAML data +services = data["services"] + +# Print the service names of each cloud service provider +for provider, service_data in services.items(): + if provider != "debug": + service_name = service_data["name"] + print(f"Service name for {provider}: {service_name}") ``` \ No newline at end of file From 8e42cb7f50c34ff613ab6cc6f3565601bec3fe00 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Mon, 31 Jul 2023 10:18:19 +0530 Subject: [PATCH 144/394] Update tasks.md final submission day15 --- submission/day15/tasks.md | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/submission/day15/tasks.md b/submission/day15/tasks.md index f18a92c273..ec09161272 100644 --- a/submission/day15/tasks.md +++ b/submission/day15/tasks.md @@ -2,6 +2,10 @@ **1. Create a Dictionary in Python and write it to a json File.** +On running the code, it will create a new file data.json on the given file path ie. current directory in our case + +image + ``` import json @@ -22,9 +26,14 @@ with open(file_path, "w") as json_file: print("Data has been written to 'data.json'.") ``` +Refer script: [dict2json.py](https://github.com/paragpallavsingh/90DaysOfDevOps/blob/master/submission/day15/dict2json.py) + +file generated: [data.json](https://github.com/paragpallavsingh/90DaysOfDevOps/blob/master/submission/day15/data.json) **2. Read a json file services.json kept in this folder and print the service names of every cloud service provider.** +image + ``` import json @@ -41,9 +50,14 @@ for provider, service_data in services.items(): service_name = service_data["name"] print(f"Service name for {provider}: {service_name}") ``` +Refer Script: [readjson.py](https://github.com/paragpallavsingh/90DaysOfDevOps/blob/master/submission/day15/readjson.py) + +File: [services.json](https://github.com/paragpallavsingh/90DaysOfDevOps/blob/master/submission/day15/services.json) **3. Read YAML file using python, file services.yaml and read the contents to convert yaml to json** +image + ``` #pip install pyyaml import yaml @@ -60,4 +74,23 @@ for provider, service_data in services.items(): if provider != "debug": service_name = service_data["name"] print(f"Service name for {provider}: {service_name}") -``` \ No newline at end of file +``` + +Refer Script : [readyaml.py](https://github.com/paragpallavsingh/90DaysOfDevOps/blob/master/submission/day15/readyaml.py) + +File: [services.yaml](https://github.com/paragpallavsingh/90DaysOfDevOps/blob/master/submission/day15/services.yaml) + +## Error resolution + +if you face this error: **No module named 'yaml'** + +just install **pyyaml** + +``` +pip install pyyaml +``` +image + +you will be able to read yaml successfully as shown above in task 3⬆️ + +image From 0b5e022903d1055cfc1e45c62f69e1545d23e053 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Wed, 2 Aug 2023 00:27:05 +0530 Subject: [PATCH 145/394] Update tasks.md --- submission/day03/tasks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submission/day03/tasks.md b/submission/day03/tasks.md index f71eec07f9..c2d4976c65 100644 --- a/submission/day03/tasks.md +++ b/submission/day03/tasks.md @@ -4,7 +4,7 @@ Task: What is the linux command to Prerequisite commands to replicate below -#make 5 folders +# make 5 folders ``` mkdir folder-{1..5} From e158bf5d6478c789d7261adad00502f095867b2c Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Wed, 2 Aug 2023 02:02:18 +0000 Subject: [PATCH 146/394] Add day 16 17 18 19 folder --- submission/day16/README.md | 0 submission/day17/README.md | 0 submission/day18/README.md | 0 submission/day19/README.md | 0 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 submission/day16/README.md create mode 100644 submission/day17/README.md create mode 100644 submission/day18/README.md create mode 100644 submission/day19/README.md diff --git a/submission/day16/README.md b/submission/day16/README.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/submission/day17/README.md b/submission/day17/README.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/submission/day18/README.md b/submission/day18/README.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/submission/day19/README.md b/submission/day19/README.md new file mode 100644 index 0000000000..e69de29bb2 From ee458b8931b19339e6a223208b25c793475daf17 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Fri, 4 Aug 2023 20:35:50 +0530 Subject: [PATCH 147/394] Update README.md submission day16 --- submission/day16/README.md | 117 +++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) diff --git a/submission/day16/README.md b/submission/day16/README.md index e69de29bb2..7eac18a10e 100644 --- a/submission/day16/README.md +++ b/submission/day16/README.md @@ -0,0 +1,117 @@ +# Day 16 Task: Docker Beginning + +## Prerequisites. + +1. **Check that docker is installed. If not, you need to install it first** + +Refer this for easy and proper installation: [Install Docker on Ubuntu](https://docs.docker.com/engine/install/ubuntu/) + +If it is properly installed, your docker run will be green + +image + + +2. **Other important thing is to give proper [permissions to docker in Linux](https://docs.docker.com/engine/install/linux-postinstall/)** + +``` +#check if you are getting permission denied error. if yes follo below steps to setup right permissions +docker run hello-world +sudo groupadd docker +echo $USER +# check which user you are giving permission to +sudo usermod -aG docker $USER +# after this you need to restart your machine for the changes to take effect +``` +image

+ +## Task 1 *docker run hello-world* +``` +docker run hello-world +``` +image + + +3. To get the container related commands, [**Containerise an application**](https://docs.docker.com/get-started/02_our_app/) + +``` +git clone https://github.com/docker/getting-started-app.git +cd /path/to/getting-started-app +touch Dockerfile +``` +Paste below into the Dockerfile +``` +# syntax=docker/dockerfile:1 + +FROM node:18-alpine +WORKDIR /app +COPY . . +RUN yarn install --production +CMD ["node", "src/index.js"] +EXPOSE 3000 +``` +After that follow below steps +``` +cd /path/to/getting-started-app +docker build -t getting-started . +docker run -dp 127.0.0.1:3000:3000 getting-started +``` +image + +After a few seconds, open your web browser to http://localhost:3000. You should see your app. + +Alternatively you can curl in your terminal to confirm +``` +curl localhost:3000 +``` +image + +# Now all your remaining task commands can be executed with charm!😀 +## Task 2 *docker inspect hello-world:latest* +``` +docker inspect hello-world:latest +``` +image + +``` +docker image ls +``` +image + + +## Task 3 *dokcer ps, port, stat* +``` +docker ps +``` +image + +``` +docker port 15bf70b409f9 +``` +image + +``` +docker stats 15bf70b409f9 +``` +image + +``` +docker top 15bf70b409f9 +``` +image + +## Task 4 docker save and load +``` +docker save getting-started > getting-started.tar +ls -sh getting-started.tar +docker save --output getting-started.tar getting-started +docker load < getting-started.tar +docker images +``` +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/fcf94a97-d307-4637-aa45-b7ed2d6088c5) + + + + + + + From e52cdccc7fd50d6d740f75600f4aebae6cf4f67c Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Fri, 4 Aug 2023 15:06:39 +0000 Subject: [PATCH 148/394] check docker run --- submission/day16/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 submission/day16/.gitignore diff --git a/submission/day16/.gitignore b/submission/day16/.gitignore new file mode 100644 index 0000000000..28aa4f6cc7 --- /dev/null +++ b/submission/day16/.gitignore @@ -0,0 +1 @@ +getting-started-app From 56b6fdd453ed062568a94b5d48b52bfd2a323afb Mon Sep 17 00:00:00 2001 From: Prajwal Date: Fri, 11 Aug 2023 18:05:11 +0530 Subject: [PATCH 149/394] Navigation made easy --- 2023/day01/tasks.md | 9 +-- 2023/day02/tasks.md | 5 +- 2023/day03/tasks.md | 3 +- 2023/day04/tasks.md | 40 ++++++------- 2023/day05/tasks.md | 42 +++++++------- 2023/day06/tasks.md | 35 ++++++------ 2023/day07/tasks.md | 32 +++++------ 2023/day08/tasks.md | 29 +++++----- 2023/day09/tasks.md | 23 +++++--- 2023/day10/tasks.md | 77 +++++++++++++------------ 2023/day11/tasks.md | 14 ++++- 2023/day12/tasks.md | 13 +++-- 2023/day13/tasks.md | 11 ++-- 2023/day14/tasks.md | 40 +++++++------ 2023/day15/tasks.md | 10 ++-- 2023/day16/tasks.md | 12 ++-- 2023/day17/tasks.md | 3 +- 2023/day18/tasks.md | 13 +++-- 2023/day19/tasks.md | 16 ++++-- 2023/day20/tasks.md | 10 ++-- 2023/day21/tasks.md | 16 +++--- 2023/day22/tasks.md | 12 ++-- 2023/day23/tasks.md | 16 ++++-- 2023/day24/tasks.md | 26 +++------ 2023/day25/tasks.md | 40 +------------ 2023/day26/tasks.md | 36 ++++++------ 2023/day27/tasks.md | 30 +++------- 2023/day28/tasks.md | 29 +++------- 2023/day29/tasks.md | 15 ++--- 2023/day30/tasks.md | 16 ++---- 2023/day31/tasks.md | 51 +++-------------- 2023/day32/tasks.md | 11 ++-- 2023/day33/tasks.md | 10 +++- 2023/day34/tasks.md | 11 +++- 2023/day35/tasks.md | 18 ++++-- 2023/day36/tasks.md | 4 +- 2023/day37/tasks.md | 14 ++--- 2023/day38/tasks.md | 9 ++- 2023/day39/tasks.md | 14 +++-- 2023/day40/tasks.md | 33 ++++------- 2023/day41/tasks.md | 13 +++-- 2023/day42/tasks.md | 8 +-- 2023/day43/tasks.md | 10 +++- 2023/day44/tasks.md | 1 + 2023/day45/tasks.md | 4 +- 2023/day46/tasks.md | 9 +-- 2023/day47/tasks.md | 6 +- 2023/day48/tasks.md | 10 ++-- 2023/day49/tasks.md | 18 +++--- 2023/day50/tasks.md | 10 ++-- 2023/day51/tasks.md | 10 ++-- 2023/day52/tasks.md | 11 ++-- 2023/day53/tasks.md | 11 ++-- 2023/day54/tasks.md | 4 +- 2023/day55/tasks.md | 18 +++--- 2023/day56/tasks.md | 4 +- 2023/day57/tasks.md | 3 +- 2023/day58/tasks.md | 4 +- 2023/day59/tasks.md | 6 +- 2023/day60/tasks.md | 12 +++- 2023/day61/tasks.md | 9 ++- 2023/day62/tasks.md | 15 ++++- 2023/day63/tasks.md | 14 +++-- 2023/day64/tasks.md | 13 +++-- 2023/day65/tasks.md | 11 ++++ 2023/day66/tasks.md | 5 +- 2023/day67/tasks.md | 4 ++ 2023/day68/tasks.md | 8 ++- 2023/day69/tasks.md | 54 ++++++------------ 2023/day70/tasks.md | 22 +++---- 2023/day71/tasks.md | 19 ++++--- 2023/day72/tasks.md | 11 ++-- 2023/day73/tasks.md | 7 ++- 2023/day74/tasks.md | 6 +- 2023/day75/tasks.md | 16 +++--- 2023/day76/tasks.md | 7 ++- 2023/day77/tasks.md | 6 +- 2023/day78/tasks.md | 9 +-- 2023/day79/tasks.md | 6 +- 2023/day80/tasks.md | 8 +-- 2023/day81/tasks.md | 8 +-- 2023/day82/tasks.md | 8 +-- 2023/day83/tasks.md | 8 +-- 2023/day84/tasks.md | 8 +-- 2023/day85/tasks.md | 11 +--- 2023/day86/tasks.md | 10 ++-- 2023/day87/tasks.md | 12 ++-- 2023/day88/tasks.md | 8 +-- 2023/day89/tasks.md | 8 +-- 2023/day90/tasks.md | 29 ++++++++++ README.md | 9 ++- TOC.md | 136 ++++++++++++++++++++++++++++++++++++++++++++ 92 files changed, 844 insertions(+), 681 deletions(-) create mode 100644 TOC.md diff --git a/2023/day01/tasks.md b/2023/day01/tasks.md index ade0bae42f..dcd95237d3 100644 --- a/2023/day01/tasks.md +++ b/2023/day01/tasks.md @@ -5,7 +5,8 @@ This is the day you have to Take this challenge and start your #90DaysOfDevOps w - Fork this Repo. - Start with a DevOps Roadmap[https://youtu.be/iOE9NTAG35g] - Write a LinkedIn post or a small article about your understanding of DevOps - - What is DevOps - - What is Automation, Scaling, Infrastructure - - Why DevOps is Important, etc - \ No newline at end of file +- What is DevOps +- What is Automation, Scaling, Infrastructure +- Why DevOps is Important, etc + +[Next Day →](../day02/tasks.md) diff --git a/2023/day02/tasks.md b/2023/day02/tasks.md index 16aaa1d804..e17dbec24c 100644 --- a/2023/day02/tasks.md +++ b/2023/day02/tasks.md @@ -1,6 +1,7 @@ Day 2 Task: Basics linux command -Task: What is the linux command to +Task: What is the linux command to + 1. Check your present working directory. 2. List all the files or directories including hidden files. 3. Create a nested directory A/B/C/D/E @@ -8,3 +9,5 @@ Task: What is the linux command to Note: [Check this file for reference](basic_linux_commands.md) Check the basic_linux_commands.md file on the same directory day2 + +[← Previous Day](../day01/tasks.md) | [Next Day →](../day03/tasks.md) diff --git a/2023/day03/tasks.md b/2023/day03/tasks.md index 102c78a6b9..d413ee213c 100644 --- a/2023/day03/tasks.md +++ b/2023/day03/tasks.md @@ -14,5 +14,6 @@ Task: What is the linux command to 10. Add content in Colors.txt (One in each line) - Red, Pink, White, Black, Blue, Orange, Purple, Grey. 11. To find the difference between fruits.txt and Colors.txt file. - Reference: https://www.linkedin.com/pulse/linux-commands-devops-used-day-to-day-activit-chetan-/ + +[← Previous Day](../day02/tasks.md) | [Next Day →](../day04/tasks.md) diff --git a/2023/day04/tasks.md b/2023/day04/tasks.md index a6722128c9..84a354485a 100644 --- a/2023/day04/tasks.md +++ b/2023/day04/tasks.md @@ -1,29 +1,31 @@ # Day 4 Task: Basic Linux Shell Scripting for DevOps Engineers. - ## What is Kernel +## What is Kernel - The kernel is a computer program that is the core of a computer’s operating system, with complete control over everything in the system. - - ## What is Shell +The kernel is a computer program that is the core of a computer’s operating system, with complete control over everything in the system. - A shell is special user program which provide an interface to user to use operating system services. Shell accept human readable commands from user and convert them into something which kernel can understand. It is a command language interpreter that execute commands read from input devices such as keyboards or from files. The shell gets started when the user logs in or start the terminal. - - ## What is Linux Shell Scripting? +## What is Shell - A shell script is a computer program designed to be run by a linux shell, a command-line interpreter. The various dialects of shell scripts are considered to be scripting languages. Typical operations performed by shell scripts include file manipulation, program execution, and printing text. +A shell is special user program which provide an interface to user to use operating system services. Shell accept human readable commands from user and convert them into something which kernel can understand. It is a command language interpreter that execute commands read from input devices such as keyboards or from files. The shell gets started when the user logs in or start the terminal. - **Tasks** +## What is Linux Shell Scripting? - - Explain in your own words and examples, what is Shell Scripting for DevOps. - - What is `#!/bin/bash?` can we write `#!/bin/sh` as well? - - Write a Shell Script which prints `I will complete #90DaysOofDevOps challenge` - - Write a Shell Script to take user input, input from arguments and print the variables. - - Write an Example of If else in Shell Scripting by comparing 2 numbers +A shell script is a computer program designed to be run by a linux shell, a command-line interpreter. The various dialects of shell scripts are considered to be scripting languages. Typical operations performed by shell scripts include file manipulation, program execution, and printing text. - Was it difficult? - - - Post about it on LinkedIn and Let me know :) +**Tasks** - Article Reference: [Click here to read basic Linux Shell Scripting](https://devopscube.com/linux-shell-scripting-for-devops/) +- Explain in your own words and examples, what is Shell Scripting for DevOps. +- What is `#!/bin/bash?` can we write `#!/bin/sh` as well? +- Write a Shell Script which prints `I will complete #90DaysOofDevOps challenge` +- Write a Shell Script to take user input, input from arguments and print the variables. +- Write an Example of If else in Shell Scripting by comparing 2 numbers - YouTube Vedio: [EASIEST Shell Scripting Tutorial for DevOps Engineers](https://www.youtube.com/watch?v=_-D6gkRj7xc&list=PLlfy9GnSVerQr-Se9JRE_tZJk3OUoHCkh&index=3) \ No newline at end of file +Was it difficult? + +- Post about it on LinkedIn and Let me know :) + +Article Reference: [Click here to read basic Linux Shell Scripting](https://devopscube.com/linux-shell-scripting-for-devops/) + +YouTube Vedio: [EASIEST Shell Scripting Tutorial for DevOps Engineers](https://www.youtube.com/watch?v=_-D6gkRj7xc&list=PLlfy9GnSVerQr-Se9JRE_tZJk3OUoHCkh&index=3) + +[← Previous Day](../Day03/tasks.md) | [Next Day →](../Day05/tasks.md) diff --git a/2023/day05/tasks.md b/2023/day05/tasks.md index 3f831b8b15..199471a77e 100644 --- a/2023/day05/tasks.md +++ b/2023/day05/tasks.md @@ -6,50 +6,48 @@ All 90 directories within seconds using a simple command. ` mkdir day{1..90}` -### Tasks -1) You have to do the same using Shell Script i.e using either Loops or command with start day and end day variables using arguments - +### Tasks - So Write a bash script createDirectories.sh that when the script is executed with three given arguments (one is directory name and second is start number of directories and third is the end number of directories ) it creates specified number of directories with a dynamic directory name. +1. You have to do the same using Shell Script i.e using either Loops or command with start day and end day variables using arguments - + +So Write a bash script createDirectories.sh that when the script is executed with three given arguments (one is directory name and second is start number of directories and third is the end number of directories ) it creates specified number of directories with a dynamic directory name. Example 1: When the script is executed as -```./createDirectories.sh day 1 90``` +`./createDirectories.sh day 1 90` -then it creates 90 directories as ```day1 day2 day3 .... day90``` +then it creates 90 directories as `day1 day2 day3 .... day90` Example 2: When the script is executed as -```./createDirectories.sh Movie 20 50``` -then it creates 50 directories as ```Movie20 Movie21 Movie23 ...Movie50``` +`./createDirectories.sh Movie 20 50` +then it creates 50 directories as `Movie20 Movie21 Movie23 ...Movie50` Notes: You may need to use loops or commands (or both), based on your preference . [Check out this reference: https://www.geeksforgeeks.org/bash-scripting-for-loop/](https://www.geeksforgeeks.org/bash-scripting-for-loop/) +2. Create a Script to backup all your work done till now. - 2) Create a Script to backup all your work done till now. - - Backups are an important part of DevOps Engineers day to Day activities - The video in References will help you to understand How a DevOps Engineer takes backups (it can feel a bit difficult but keep trying, Nothing is impossible.) - Watch [this video](https://youtu.be/aolKiws4Joc) - - In case of Doubts, post it in [Discord Channel for #90DaysOfDevOps](https://discord.gg/hs3Pmc5F) +Backups are an important part of DevOps Engineers day to Day activities +The video in References will help you to understand How a DevOps Engineer takes backups (it can feel a bit difficult but keep trying, Nothing is impossible.) +Watch [this video](https://youtu.be/aolKiws4Joc) +In case of Doubts, post it in [Discord Channel for #90DaysOfDevOps](https://discord.gg/hs3Pmc5F) - 3) Read About Cron and Crontab, to automate the backup Script - - Cron is the system's main scheduler for running jobs or tasks unattended. A command called crontab allows the user to submit, edit or delete entries to cron. A crontab file is a user file that holds the scheduling information. +3. Read About Cron and Crontab, to automate the backup Script - Watch This video as a Reference to Task 2 and 3 [https://youtu.be/aolKiws4Joc](https://youtu.be/aolKiws4Joc) +Cron is the system's main scheduler for running jobs or tasks unattended. A command called crontab allows the user to submit, edit or delete entries to cron. A crontab file is a user file that holds the scheduling information. +Watch This video as a Reference to Task 2 and 3 [https://youtu.be/aolKiws4Joc](https://youtu.be/aolKiws4Joc) - 4) Read about User Management and Let me know on Linkedin if you're ready for Day 6. +4. Read about User Management and Let me know on Linkedin if you're ready for Day 6. A user is an entity, in a Linux operating system, that can manipulate files and perform several other operations. Each user is assigned an ID that is unique for each user in the operating system. In this post, we will learn about users and commands which are used to get information about the users. After installation of the operating system, the ID 0 is assigned to the root user and the IDs 1 to 999 (both inclusive) are assigned to the system users and hence the ids for local user begins from 1000 onwards. - - 5) Create 2 users and just display their Usernames +5. Create 2 users and just display their Usernames [Check out this reference: https://www.geeksforgeeks.org/user-management-in-linux/](https://www.geeksforgeeks.org/user-management-in-linux/) - Post your daily work on Linkedin and le [me](https://www.linkedin.com/in/shubhamlondhe1996/) know , writing an article is the best :) +Post your daily work on Linkedin and le [me](https://www.linkedin.com/in/shubhamlondhe1996/) know , writing an article is the best :) +[← Previous Day](../Day04/tasks.md) | [Next Day →](../Day06/tasks.md) diff --git a/2023/day06/tasks.md b/2023/day06/tasks.md index a861d3379d..3af9420806 100644 --- a/2023/day06/tasks.md +++ b/2023/day06/tasks.md @@ -2,27 +2,30 @@ ### Today is more on Reading, Learning and Implementing File permissions - The concept of Linux File permission and ownership is important in Linux. - Here, we will be working on Linux permissions and ownership and will do tasks on - both of them. - Let us start with the Permissions. +The concept of Linux File permission and ownership is important in Linux. +Here, we will be working on Linux permissions and ownership and will do tasks on +both of them. +Let us start with the Permissions. -1) Create a simple file and do `ls -ltr` to see the details of the files [refer to Notes](https://github.com/LondheShubham153/90DaysOfDevOps/tree/master/2023/day6/notes) - - Each of the three permissions are assigned to three defined categories of users. The categories are: -- owner — The owner of the file or application. -- "chown" is used to change the ownership permission of a file or directory. -- group — The group that owns the file or application. -- "chgrp" is used to change the group permission of a file or directory. -- others — All users with access to the system. (outised the users are in a group) -- "chmod" is used to change the other users permissions of a file or directory. +1. Create a simple file and do `ls -ltr` to see the details of the files [refer to Notes](https://github.com/LondheShubham153/90DaysOfDevOps/tree/master/2023/day6/notes) - As a task, change the user permissions of the file and note the changes after `ls -ltr` +Each of the three permissions are assigned to three defined categories of users. The categories are: -2) Write an article about File Permissions based on your understanding from the notes. +- owner — The owner of the file or application. +- "chown" is used to change the ownership permission of a file or directory. +- group — The group that owns the file or application. +- "chgrp" is used to change the group permission of a file or directory. +- others — All users with access to the system. (outised the users are in a group) +- "chmod" is used to change the other users permissions of a file or directory. -3) Read about ACL and try out the commands `getfacl` and `setfacl` + As a task, change the user permissions of the file and note the changes after `ls -ltr` + +2. Write an article about File Permissions based on your understanding from the notes. + +3. Read about ACL and try out the commands `getfacl` and `setfacl` In case of any doubts, post it on [Discord Community](https://discord.gg/hs3Pmc5F) Happy Learning + +[← Previous Day](../day05/tasks.md) | [Next Day →](../day07/tasks.md) diff --git a/2023/day07/tasks.md b/2023/day07/tasks.md index 5459be319f..b516c9d956 100644 --- a/2023/day07/tasks.md +++ b/2023/day07/tasks.md @@ -1,45 +1,43 @@ # Day 7 Task: Understanding package manager and systemctl ### What is a package manager in Linux? - - In simpler words, a package manager is a tool that allows users to install, remove, upgrade, configure and manage software packages on an operating system. The package manager can be a graphical application like a software center or a command line tool like apt-get or pacman. - You’ll often find me using the term ‘package’ in tutorials and articles, To understand package manager, you must understand what a package is. +In simpler words, a package manager is a tool that allows users to install, remove, upgrade, configure and manage software packages on an operating system. The package manager can be a graphical application like a software center or a command line tool like apt-get or pacman. + +You’ll often find me using the term ‘package’ in tutorials and articles, To understand package manager, you must understand what a package is. ### What is a package? - - A package is usually referred to an application but it could be a GUI application, command line tool or a software library (required by other software programs). A package is essentially an archive file containing the binary executable, configuration file and sometimes information about the dependencies. + +A package is usually referred to an application but it could be a GUI application, command line tool or a software library (required by other software programs). A package is essentially an archive file containing the binary executable, configuration file and sometimes information about the dependencies. ### Different kinds of package managers - Package Managers differ based on packaging system but same packaging system may have more than one package manager. - For example, RPM has Yum and DNF package managers. For DEB, you have apt-get, aptitude command line based package managers. +Package Managers differ based on packaging system but same packaging system may have more than one package manager. +For example, RPM has Yum and DNF package managers. For DEB, you have apt-get, aptitude command line based package managers. ## Tasks - 1) You have to install docker and jenkins in your system from your terminal using package managers - - 2) Write a small blog or article to install these tools using package managers on Ubuntu and CentOS +1. You have to install docker and jenkins in your system from your terminal using package managers +2. Write a small blog or article to install these tools using package managers on Ubuntu and CentOS ### systemctl and systemd - systemctl is used to examine and control the state of “systemd” system and service manager. systemd is system and service manager for Unix like operating systems(most of the distributions, not all). - +systemctl is used to examine and control the state of “systemd” system and service manager. systemd is system and service manager for Unix like operating systems(most of the distributions, not all). ## Tasks - 1) check the status of docker service in your system (make sure you completed above tasks, else docker won't be installed) +1. check the status of docker service in your system (make sure you completed above tasks, else docker won't be installed) - 2) stop the service jenkins and post before and after screenshots +2. stop the service jenkins and post before and after screenshots - 3) read about the commands systemctl vs service +3. read about the commands systemctl vs service - eg. `systemctl status docker` vs `service docker status` +eg. `systemctl status docker` vs `service docker status` For Reference, read [this](https://www.howtogeek.com/devops/how-to-check-if-the-docker-daemon-or-a-container-is-running/#:~:text=Checking%20With%20Systemctl&text=Check%20what%27s%20displayed%20under%20%E2%80%9CActive,running%20sudo%20systemctl%20start%20docker%20.) - #### Post about this and bring your friends to this #90DaysOfDevOps challenge. +[← Previous Day](../day06/tasks.md) | [Next Day →](../day08/tasks.md) diff --git a/2023/day08/tasks.md b/2023/day08/tasks.md index e8ef6e86a9..84edf082cf 100644 --- a/2023/day08/tasks.md +++ b/2023/day08/tasks.md @@ -1,37 +1,37 @@ # Day 8 Task: Basic Git & GitHub for DevOps Engineers. - ## What is Git? + Git is a version control system that allows you to track changes to files and coordinate work on those files among multiple people. It is commonly used for software development, but it can be used to track changes to any set of files. With Git, you can keep a record of who made changes to what part of a file, and you can revert back to earlier versions of the file if needed. Git also makes it easy to collaborate with others, as you can share changes and merge the changes made by different people into a single version of a file. ## What is Github? + GitHub is a web-based platform that provides hosting for version control using Git. It is a subsidiary of Microsoft, and it offers all of the distributed version control and source code management (SCM) functionality of Git as well as adding its own features. GitHub is a very popular platform for developers to share and collaborate on projects, and it is also used for hosting open-source projects. ## What is Version Control? How many types of version controls we have? + Version control is a system that tracks changes to a file or set of files over time so that you can recall specific versions later. It allows you to revert files back to a previous state, revert the entire project back to a previous state, compare changes over time, see who last modified something that might be causing a problem, who introduced an issue and when, and more. There are two main types of version control systems: centralized version control systems and distributed version control systems. -1) A centralized version control system (CVCS) uses a central server to store all the versions of a project's files. Developers "check out" files from the central server, make changes, and then "check in" the updated files. Examples of CVCS include Subversion and Perforce. +1. A centralized version control system (CVCS) uses a central server to store all the versions of a project's files. Developers "check out" files from the central server, make changes, and then "check in" the updated files. Examples of CVCS include Subversion and Perforce. -2) A distributed version control system (DVCS) allows developers to "clone" an entire repository, including the entire version history of the project. This means that they have a complete local copy of the repository, including all branches and past versions. Developers can work independently and then later merge their changes back into the main repository. Examples of DVCS include Git, Mercurial, and Darcs. +2. A distributed version control system (DVCS) allows developers to "clone" an entire repository, including the entire version history of the project. This means that they have a complete local copy of the repository, including all branches and past versions. Developers can work independently and then later merge their changes back into the main repository. Examples of DVCS include Git, Mercurial, and Darcs. +## Why we use distributed version control over centralized version control? -## Why we use distributed version control over centralized version control? +1. Better collaboration: In a DVCS, every developer has a full copy of the repository, including the entire history of all changes. This makes it easier for developers to work together, as they don't have to constantly communicate with a central server to commit their changes or to see the changes made by others. -1) Better collaboration: In a DVCS, every developer has a full copy of the repository, including the entire history of all changes. This makes it easier for developers to work together, as they don't have to constantly communicate with a central server to commit their changes or to see the changes made by others. +2. Improved speed: Because developers have a local copy of the repository, they can commit their changes and perform other version control actions faster, as they don't have to communicate with a central server. -2) Improved speed: Because developers have a local copy of the repository, they can commit their changes and perform other version control actions faster, as they don't have to communicate with a central server. +3. Greater flexibility: With a DVCS, developers can work offline and commit their changes later when they do have an internet connection. They can also choose to share their changes with only a subset of the team, rather than pushing all of their changes to a central server. -3) Greater flexibility: With a DVCS, developers can work offline and commit their changes later when they do have an internet connection. They can also choose to share their changes with only a subset of the team, rather than pushing all of their changes to a central server. - -4) Enhanced security: In a DVCS, the repository history is stored on multiple servers and computers, which makes it more resistant to data loss. If the central server in a CVCS goes down or the repository becomes corrupted, it can be difficult to recover the lost data. +4. Enhanced security: In a DVCS, the repository history is stored on multiple servers and computers, which makes it more resistant to data loss. If the central server in a CVCS goes down or the repository becomes corrupted, it can be difficult to recover the lost data. Overall, the decentralized nature of a DVCS allows for greater collaboration, flexibility, and security, making it a popular choice for many teams. - ## Task: - Install Git on your computer (if it is not already installed). You can download it from the official website at https://git-scm.com/downloads @@ -40,11 +40,12 @@ Overall, the decentralized nature of a DVCS allows for greater collaboration, fl ## Exercises: -1) Create a new repository on GitHub and clone it to your local machine -2) Make some changes to a file in the repository and commit them to the repository using Git -3) Push the changes back to the repository on GitHub - +1. Create a new repository on GitHub and clone it to your local machine +2. Make some changes to a file in the repository and commit them to the repository using Git +3. Push the changes back to the repository on GitHub Reff :- https://youtu.be/AT1uxOLsCdk Post your daily work on Linkedin and le me know , writing an article is the best :) + +[← Previous Day](../day07/tasks.md) | [Next Day →](../day09/tasks.md) diff --git a/2023/day09/tasks.md b/2023/day09/tasks.md index 364728b0f2..a25a3a91aa 100644 --- a/2023/day09/tasks.md +++ b/2023/day09/tasks.md @@ -1,17 +1,21 @@ # Day 9 Task: Deep Dive in Git & GitHub for DevOps Engineers. -## Find the answers by your understandings(Shoulden't be copied by internet & used hand-made diagrams) of below quistions and Write blog on it. -1) What is Git and why is it important? -2) What is difference Between Main Branch and Master Branch?? -3) Can you explain the difference between Git and GitHub? -4) How do you create a new repository on GitHub? -5) What is difference between local & remote repository? How to connect local to remote? +## Find the answers by your understandings(Shoulden't be copied by internet & used hand-made diagrams) of below quistions and Write blog on it. + +1. What is Git and why is it important? +2. What is difference Between Main Branch and Master Branch?? +3. Can you explain the difference between Git and GitHub? +4. How do you create a new repository on GitHub? +5. What is difference between local & remote repository? How to connect local to remote? ## Tasks -task-1: + +task-1: + - Set your user name and email address, which will be associated with your commits. -task-2: +task-2: + - Create a repository named "Devops" on GitHub - Connect your local repository to the repository on GitHub. - Create a new file in Devops/Git/Day-02.txt & add some content to it @@ -19,5 +23,6 @@ task-2: reff :- https://youtu.be/AT1uxOLsCdk - Note: These steps assume that you have already installed Git on your computer and have created a GitHub account. If you need help with these prerequisites, you can refer to the [day-08](https://github.com/LondheShubham153/90DaysOfDevOps/blob/ee7c53f276edb02a85a97282027028295be17c04/2023/day08/tasks.md) + +[← Previous Day](../day08/tasks.md) | [Next Day →](../day10/tasks.md) diff --git a/2023/day10/tasks.md b/2023/day10/tasks.md index 1177d9d5c2..7624fd9bfc 100644 --- a/2023/day10/tasks.md +++ b/2023/day10/tasks.md @@ -1,60 +1,63 @@ # Day 10 Task: Advance Git & GitHub for DevOps Engineers. ## Git Branching - Use a branch to isolate development work without affecting other branches in the repository. Each repository has one default branch, and can have multiple other branches. You can merge a branch into another branch using a pull request. - Branches allow you to develop features, fix bugs, or safely experiment with new ideas in a contained area of your repository. +Use a branch to isolate development work without affecting other branches in the repository. Each repository has one default branch, and can have multiple other branches. You can merge a branch into another branch using a pull request. + +Branches allow you to develop features, fix bugs, or safely experiment with new ideas in a contained area of your repository. ## Git Revert and Reset - Two commonly used tools that git users will encounter are those of git reset and git revert . The benefit of both of these commands is that you can use them to remove or edit changes you’ve made in the code in previous commits. + +Two commonly used tools that git users will encounter are those of git reset and git revert . The benefit of both of these commands is that you can use them to remove or edit changes you’ve made in the code in previous commits. ## Git Rebase and Merge - ### What Is Git Rebase? - Git rebase is a command that lets users integrate changes from one branch to another, and the logs are modified once the action is complete. Git rebase was developed to overcome merging’s shortcomings, specifically regarding logs. +### What Is Git Rebase? - ### What Is Git Merge? +Git rebase is a command that lets users integrate changes from one branch to another, and the logs are modified once the action is complete. Git rebase was developed to overcome merging’s shortcomings, specifically regarding logs. - Git merge is a command that allows developers to merge Git branches while the logs of commits on branches remain intact. +### What Is Git Merge? - The merge wording can be confusing because we have two methods of merging branches, and one of those ways is actually called “merge,” even though both procedures do essentially the same thing. +Git merge is a command that allows developers to merge Git branches while the logs of commits on branches remain intact. - Refer to this article for a better understanding of Git Rebase and Merge [Read here](https://www.simplilearn.com/git-rebase-vs-merge-article) +The merge wording can be confusing because we have two methods of merging branches, and one of those ways is actually called “merge,” even though both procedures do essentially the same thing. +Refer to this article for a better understanding of Git Rebase and Merge [Read here](https://www.simplilearn.com/git-rebase-vs-merge-article) ## Task 1: - Add a text file called version01.txt inside the Devops/Git/ with “This is first feature of our application” written inside. - This should be in a branch coming from `master`, - [hint try `git checkout -b dev`], - swithch to `dev` branch ( Make sure your commit message will reflect as "Added new feature"). - [Hint use your knowledge of creating branches and Git commit command] - - - version01.txt should reflect at local repo first followed by Remote repo for review. - [Hint use your knowledge of Git push and git pull commands here] - - Add new commit in `dev` branch after adding below mentioned content in Devops/Git/version01.txt: - While writing the file make sure you write these lines - - - 1st line>> This is the bug fix in development branch - - Commit this with message “ Added feature2 in development branch” - - - 2nd line>> This is gadbad code - - Commit this with message “ Added feature3 in development branch - - - 3rd line>> This feature will gadbad everything from now. - - Commit with message “ Added feature4 in development branch - - Restore the file to a previous version where the content should be “This is the bug fix in development branch” - [Hint use git revert or reset according to your knowledge] + +Add a text file called version01.txt inside the Devops/Git/ with “This is first feature of our application” written inside. +This should be in a branch coming from `master`, +[hint try `git checkout -b dev`], +swithch to `dev` branch ( Make sure your commit message will reflect as "Added new feature"). +[Hint use your knowledge of creating branches and Git commit command] + +- version01.txt should reflect at local repo first followed by Remote repo for review. + [Hint use your knowledge of Git push and git pull commands here] + +Add new commit in `dev` branch after adding below mentioned content in Devops/Git/version01.txt: +While writing the file make sure you write these lines + +- 1st line>> This is the bug fix in development branch +- Commit this with message “ Added feature2 in development branch” + +- 2nd line>> This is gadbad code +- Commit this with message “ Added feature3 in development branch + +- 3rd line>> This feature will gadbad everything from now. +- Commit with message “ Added feature4 in development branch + +Restore the file to a previous version where the content should be “This is the bug fix in development branch” +[Hint use git revert or reset according to your knowledge] ## Task 2: - - Demonstrate the concept of branches with 2 or more branches with screenshot. - - add some changes to `dev` branch and merge that branch in `master` - - as a practice try git rebase too, see what difference you get. +- Demonstrate the concept of branches with 2 or more branches with screenshot. +- add some changes to `dev` branch and merge that branch in `master` +- as a practice try git rebase too, see what difference you get. +## Note: -## Note: We should learn and follow the [best practices](https://www.flagship.io/git-branching-strategies/) , industry follows for branching. Simple Reference on branching: [video](https://youtu.be/NzjK9beT_CY) @@ -62,3 +65,5 @@ Simple Reference on branching: [video](https://youtu.be/NzjK9beT_CY) Advance Reference on branching : [video](https://youtu.be/7xhkEQS3dXw) You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. Happy Learning :) + +[← Previous Day](../day09/tasks.md) | [Next Day →](../day11/tasks.md) diff --git a/2023/day11/tasks.md b/2023/day11/tasks.md index 1c4878925a..2dd52c88c2 100644 --- a/2023/day11/tasks.md +++ b/2023/day11/tasks.md @@ -1,6 +1,7 @@ # Day 11 Task: Advance Git & GitHub for DevOps Engineers: Part-2 ## Git Stash: + Git stash is a command that allows you to temporarily save changes you have made in your working directory, without committing them. This is useful when you need to switch to a different branch to work on something else, but you don't want to commit the changes you've made in your current branch yet. To use Git stash, you first create a new branch and make some changes to it. Then you can use the command git stash to save those changes. This will remove the changes from your working directory and record them in a new stash. You can apply these changes later. git stash list command shows the list of stashed changes. @@ -8,42 +9,49 @@ To use Git stash, you first create a new branch and make some changes to it. The You can also use git stash drop to delete a stash and git stash clear to delete all the stashes. ## Cherry-pick: + Git cherry-pick is a command that allows you to select specific commits from one branch and apply them to another. This can be useful when you want to selectively apply changes that were made in one branch to another. To use git cherry-pick, you first create two new branches and make some commits to them. Then you use git cherry-pick command to select the specific commits from one branch and apply them to the other. ## Resolving Conflicts: + Conflicts can occur when you merge or rebase branches that have diverged, and you need to manually resolve the conflicts before git can proceed with the merge/rebase. git status command shows the files that have conflicts, git diff command shows the difference between the conflicting versions and git add command is used to add the resolved files. +# Task-01 -# Task-01 - Create a new branch and make some changes to it. - Use git stash to save the changes without committing them. - Switch to a different branch, make some changes and commit them. - Use git stash pop to bring the changes back and apply them on top of the new commits. # Task-02 + - In version01.txt of development branch add below lines after “This is the bug fix in development branch” that you added in Day10 and reverted to this commit. - Line2>> After bug fixing, this is the new feature with minor alteration” Commit this with message “ Added feature2.1 in development branch” + - Line3>> This is the advancement of previous feature Commit this with message “ Added feature2.2 in development branch” + - Line4>> Feature 2 is completed and ready for release Commit this with message “ Feature2 completed” + - All these commits messages should be reflected in Production branch too which will come out from Master branch (Hint: try rebase). # Task-03 + - In Production branch Cherry pick Commit “Added feature2.2 in development branch” and added below lines in it: - Line to be added after Line3>> This is the advancement of previous feature - Line4>>Added few more changes to make it more optimized. - Commit: Optimized the feature - ## Reference [video](https://youtu.be/apGV9Kg7ics) - You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. Happy Learning :) + +[← Previous Day](../day10/tasks.md) | [Next Day →](../day12/tasks.md) diff --git a/2023/day12/tasks.md b/2023/day12/tasks.md index 0ab8930078..4f42e3554d 100644 --- a/2023/day12/tasks.md +++ b/2023/day12/tasks.md @@ -1,14 +1,17 @@ ## Finally!! 🎉 + You have completed the Linux & Git-GitHub handson and I hope you have learned something interesting from it.🙌 -Now why not make an interesting 😉 assignment, which not only will help you for the future but also for the DevOps Community! +Now why not make an interesting 😉 assignment, which not only will help you for the future but also for the DevOps Community! Let’s make a well articulated and documented **"cheat-sheet"** with all the commands you learned so far in Linux, Git-GitHub and brief info about its usage. -Let’s show us your knowledge mixed with your creativity😎 +Let’s show us your knowledge mixed with your creativity😎 + +_I have added a [cheatsheet](https://www.sqltutorial.org/wp-content/uploads/2016/04/SQL-Cheat-Sheet-2.png) for your reference, Make sure every cheatsheet must be UNIQUE_ -*I have added a [cheatsheet](https://www.sqltutorial.org/wp-content/uploads/2016/04/SQL-Cheat-Sheet-2.png) for your reference, Make sure every cheatsheet must be UNIQUE* +Post it on Linkedin and Spread the knowledge.😃 -Post it on Linkedin and Spread the knowledge.😃 +**Happy Learning :)** -**Happy Learning :)** +[← Previous Day](../day11/tasks.md) | [Next Day →](../day13/tasks.md) diff --git a/2023/day13/tasks.md b/2023/day13/tasks.md index be7d16c3c8..d33f2f10c7 100644 --- a/2023/day13/tasks.md +++ b/2023/day13/tasks.md @@ -8,23 +8,22 @@ Let's Start with Basics of Python as this is also important for Devops Engineer - It was created by **Guido van Rossum** - Python consists of vast libraries and various frameworks like Django,Tensorflow, Flask, Pandas, Keras etc. - **How to Install Python?** You can install Python in your System whether it is window, MacOS, ubuntu, centos etc. Below are the links for the installation: -- [Windows Installation](https://www.python.org/downloads/) -- Ubuntu: apt-get install python3.6 - +- [Windows Installation](https://www.python.org/downloads/) +- Ubuntu: apt-get install python3.6 Task1: + 1. Install Python in your respective OS, and check the version. 2. Read about different Data Types in Python. - You can get the complete Playlist [here](https://www.youtube.com/watch?v=abPgj_3hzVY&list=PLlfy9GnSVerS_L5z0COaF7rsbgWmJXTOM)🙌 Don't forget to share your Journey over linkedin. Let the community know that you have started another chapter of your Journey. Happy Learning, Ruko Mat Phod do😃 - + +[← Previous Day](../day12/tasks.md) | [Next Day →](../day14/tasks.md) diff --git a/2023/day14/tasks.md b/2023/day14/tasks.md index e54e23c5ba..82b16a68ee 100644 --- a/2023/day14/tasks.md +++ b/2023/day14/tasks.md @@ -3,47 +3,53 @@ ### New day, New Topic.... Let's learn along 😉 ### Data Types -- Data types are the classification or categorization of data items. It represents the kind of value that tells what operations can be performed on a particular data. + +- Data types are the classification or categorization of data items. It represents the kind of value that tells what operations can be performed on a particular data. - Since everything is an object in Python programming, data types are actually classes and variables are instance (object) of these classes. - Python has the following data types built-in by default: Numeric(Integer, complex, float), Sequential(string,lists, tuples), Boolean, Set, Dictionaries, etc To check what is the data type of the variable used, we can simply write: -```your_variable=100``` -```type(your_variable)``` +`your_variable=100` +`type(your_variable)` ### Data Structures - Data Structures are a way of organizing data so that it can be accessed more efficiently depending upon the situation. Data Structures are fundamentals of any programming language around which a program is built. Python helps to learn the fundamental of these data structures in a simpler way as compared to other programming languages. +Data Structures are a way of organizing data so that it can be accessed more efficiently depending upon the situation. Data Structures are fundamentals of any programming language around which a program is built. Python helps to learn the fundamental of these data structures in a simpler way as compared to other programming languages. - Lists -Python Lists are just like the arrays, declared in other languages which is an ordered collection of data. It is very flexible as the items in a list do not need to be of the same type + Python Lists are just like the arrays, declared in other languages which is an ordered collection of data. It is very flexible as the items in a list do not need to be of the same type - Tuple -Python Tuple is a collection of Python objects much like a list but Tuples are immutable in nature i.e. the elements in the tuple cannot be added or removed once created. Just like a List, a Tuple can also contain elements of various types. + Python Tuple is a collection of Python objects much like a list but Tuples are immutable in nature i.e. the elements in the tuple cannot be added or removed once created. Just like a List, a Tuple can also contain elements of various types. - Dictionary -Python dictionary is like hash tables in any other language with the time complexity of O(1). It is an unordered collection of data values, used to store data values like a map, which, unlike other Data Types that hold only a single value as an element, Dictionary holds the key:value pair. Key-value is provided in the dictionary to make it more optimized + Python dictionary is like hash tables in any other language with the time complexity of O(1). It is an unordered collection of data values, used to store data values like a map, which, unlike other Data Types that hold only a single value as an element, Dictionary holds the key:value pair. Key-value is provided in the dictionary to make it more optimized ## Tasks + 1. Give the Difference between List, Tuple and set. Do Handson and put screenshots as per your understanding. 2. Create below Dictionary and use Dictionary methods to print your favourite tool just by using the keys of the Dictionary. + ``` -fav_tools = -{ - 1:"Linux", - 2:"Git", - 3:"Docker", - 4:"Kubernetes", - 5:"Terraform", - 6:"Ansible", +fav_tools = +{ + 1:"Linux", + 2:"Git", + 3:"Docker", + 4:"Kubernetes", + 5:"Terraform", + 6:"Ansible", 7:"Chef" } ``` + 3. Create a List of cloud service providers -eg. + eg. + ``` cloud_providers = ["AWS","GCP","Azure"] ``` + Write a program to add `Digital Ocean` to the list of cloud_providers and sort the list in alphabetical order. [Hint: Use keys to built in functions for Lists] @@ -51,3 +57,5 @@ Write a program to add `Digital Ocean` to the list of cloud_providers and sort t If you want to deep dive further, Watch [Python](https://youtu.be/abPgj_3hzVY) You can share the learning with everyone over linkedin and tag us along 😃 + +[← Previous Day](../day13/tasks.md) | [Next Day →](../day15/tasks.md) diff --git a/2023/day15/tasks.md b/2023/day15/tasks.md index d4f76d4bc4..88db558cee 100644 --- a/2023/day15/tasks.md +++ b/2023/day15/tasks.md @@ -2,13 +2,12 @@ ### Reading JSON and YAML in Python -- As a DevOps Engineer you should be able to parse files, be it txt, json, yaml, etc. +- As a DevOps Engineer you should be able to parse files, be it txt, json, yaml, etc. - You should know what all libraries one should use in Pythonfor DevOps. - Python has numerous libraries like `os`, `sys`, `json`, `yaml` etc that a DevOps Engineer uses in day to day tasks. - - ## Tasks + 1. Create a Dictionary in Python and write it to a json File. 2. Read a json file `services.json` kept in this folder and print the service names of every cloud service provider. @@ -21,7 +20,10 @@ azure : VM gcp : compute engine ``` + 3. Read YAML file using python, file `services.yaml` and read the contents to convert yaml to json Python Project for your practice: -https://youtube.com/playlist?list=PLlfy9GnSVerSzFmQ8JqP9v0XHHOAeWbjo \ No newline at end of file +https://youtube.com/playlist?list=PLlfy9GnSVerSzFmQ8JqP9v0XHHOAeWbjo + +[← Previous Day](../day14/tasks.md) | [Next Day →](../day16/tasks.md) diff --git a/2023/day16/tasks.md b/2023/day16/tasks.md index 4cc47ec174..b6ee0fbcbe 100644 --- a/2023/day16/tasks.md +++ b/2023/day16/tasks.md @@ -1,12 +1,12 @@ ## Day 16 Task: Docker for DevOps Engineers. - ### Docker - Docker is a software platform that allows you to build, test, and deploy applications quickly. Docker packages software into standardized units called containers that have everything the software needs to run including libraries, system tools, code, and runtime. Using Docker, you can quickly deploy and scale applications into any environment and know your code will run. + +Docker is a software platform that allows you to build, test, and deploy applications quickly. Docker packages software into standardized units called containers that have everything the software needs to run including libraries, system tools, code, and runtime. Using Docker, you can quickly deploy and scale applications into any environment and know your code will run. # Tasks - As you have already installed docker in previous days tasks, now is the time to run Docker commands. +As you have already installed docker in previous days tasks, now is the time to run Docker commands. - Use the `docker run` command to start a new container and interact with it through the command line. [Hint: docker run hello-world] @@ -22,9 +22,11 @@ - Use the `docker load` command to load an image from a tar archive. -These tasks involve simple operations that can be used to manage images and containers. +These tasks involve simple operations that can be used to manage images and containers. For reference you can watch this video: https://youtu.be/Tevxhn6Odc8 -You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. Happy Learning :) \ No newline at end of file +You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. Happy Learning :) + +[← Previous Day](../day15/tasks.md) | [Next Day →](../day17/tasks.md) diff --git a/2023/day17/tasks.md b/2023/day17/tasks.md index 5a28f4b826..c545883775 100644 --- a/2023/day17/tasks.md +++ b/2023/day17/tasks.md @@ -22,9 +22,10 @@ task: For Refference Project visit [here](https://youtu.be/Tevxhn6Odc8) -If you want to dive further, Watch [bootcamp](https://youtube.com/playlist?list=PLlfy9GnSVerRqYJgVYO0UiExj5byjrW8u) +If you want to dive further, Watch [bootcamp](https://youtube.com/playlist?list=PLlfy9GnSVerRqYJgVYO0UiExj5byjrW8u) You can share the learning with everyone over linkedin and tag us along 😃 Happy Learning:) +[← Previous Day](../day16/tasks.md) | [Next Day →](../day18/tasks.md) diff --git a/2023/day18/tasks.md b/2023/day18/tasks.md index a9ce7fd71b..61f4b9b7a9 100644 --- a/2023/day18/tasks.md +++ b/2023/day18/tasks.md @@ -4,24 +4,26 @@ Till now you have created Docker file and pushed it to the Repository. Let's mov Aj thodi padhai krte hai on Docker Compose 😃 ## Docker Compose + - Docker Compose is a tool that was developed to help define and share multi-container applications. - With Compose, we can create a YAML file to define the services and with a single command, can spin everything up or tear it all down. - Learn more about docker-compose [visit here](https://tecadmin.net/tutorial/docker/docker-compose/) ## What is YAML? -- YAML is a data serialization language that is often used for writing configuration files. Depending on whom you ask, YAML stands for yet another markup language or YAML ain’t markup language (a recursive acronym), which emphasizes that YAML is for data, not documents. + +- YAML is a data serialization language that is often used for writing configuration files. Depending on whom you ask, YAML stands for yet another markup language or YAML ain’t markup language (a recursive acronym), which emphasizes that YAML is for data, not documents. - YAML is a popular programming language because it is human-readable and easy to understand. - YAML files use a .yml or .yaml extension. - Read more about it [here](https://www.redhat.com/en/topics/automation/what-is-yaml) ## Task-1 -Learn how to use the docker-compose.yml file, to set up the environment, configure the services and links between different containers, and also to use environment variables in the docker-compose.yml file. +Learn how to use the docker-compose.yml file, to set up the environment, configure the services and links between different containers, and also to use environment variables in the docker-compose.yml file. [Sample docker-compose.yaml file](https://github.com/LondheShubham153/90DaysOfDevOps/blob/master/2023/day18/docker-compose.yaml) - ## Task-2 + - Pull a pre-existing Docker image from a public repository (e.g. Docker Hub) and run it on your local machine. Run the container as a non-root user (Hint- Use `usermod ` command to give user permission to docker). Make sure you reboot instance after giving permission to user. - Inspect the container's running processes and exposed ports using the docker inspect command. - Use the docker logs command to view the container's log output. @@ -29,10 +31,13 @@ Learn how to use the docker-compose.yml file, to set up the environment, configu - Use the docker rm command to remove the container when you're done. ## How to run Docker commands without sudo? + - Make sure docker is installed and system is updated (This is already been completed as a part of previous tasks): -- sudo usermod -a -G docker $USER +- sudo usermod -a -G docker $USER - Reboot the machine. For reference you can watch this [video](https://youtu.be/Tevxhn6Odc8) You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. Happy Learning :) + +[← Previous Day](../day17/tasks.md) | [Next Day →](../day19/tasks.md) diff --git a/2023/day19/tasks.md b/2023/day19/tasks.md index 4586aa54e2..b702452467 100644 --- a/2023/day19/tasks.md +++ b/2023/day19/tasks.md @@ -4,30 +4,36 @@ **Aaj thodi padhai krte hai on Docker Volume & Docker Network** 😃 # Docker-Volume + Docker allows you to create something called volumes. Volumes are like separate storage areas that can be accessed by containers. They allow you to store data, like a database, outside the container, so it doesn't get deleted when the container is deleted. You can also mount from the same volume and create more containers having same data. [reference](https://docs.docker.com/storage/volumes/) # Docker Network + Docker allows you to create virtual spaces called networks, where you can connect multiple containers (small packages that hold all the necessary files for a specific application to run) together. This way, the containers can communicate with each other and with the host machine (the computer on which the Docker is installed). When we run a container, it has its own storage space that is only accessible by that specific container. If we want to share that storage space with other containers, we can't do that. [reference](https://docs.docker.com/network/) - ## Task-1 -- Create a multi-container docker-compose file which will bring *UP* and bring *DOWN* containers in a single shot ( Example - Create application and database container ) -*hints:* +- Create a multi-container docker-compose file which will bring _UP_ and bring _DOWN_ containers in a single shot ( Example - Create application and database container ) + +_hints:_ + - Use the `docker-compose up` command with the `-d` flag to start a multi-container application in detached mode. -- Use the `docker-compose scale` command to increase or decrease the number of replicas for a specific service. You can also add [`replicas`](https://stackoverflow.com/questions/63408708/how-to-scale-from-within-docker-compose-file) in deployment file for *auto-scaling*. +- Use the `docker-compose scale` command to increase or decrease the number of replicas for a specific service. You can also add [`replicas`](https://stackoverflow.com/questions/63408708/how-to-scale-from-within-docker-compose-file) in deployment file for _auto-scaling_. - Use the `docker-compose ps` command to view the status of all containers, and `docker-compose logs` to view the logs of a specific service. - Use the `docker-compose down` command to stop and remove all containers, networks, and volumes associated with the application ## Task-2 + - Learn how to use Docker Volumes and Named Volumes to share files and directories between multiple containers. - Create two or more containers that read and write data to the same volume using the `docker run --mount` command. - Verify that the data is the same in all containers by using the docker exec command to run commands inside each container. - Use the docker volume ls command to list all volumes and docker volume rm command to remove the volume when you're done. -## You can use this task as *Project* to add in your resume. +## You can use this task as _Project_ to add in your resume. You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. Happy Learning :) + +[← Previous Day](../day18/tasks.md) | [Next Day →](../day20/tasks.md) diff --git a/2023/day20/tasks.md b/2023/day20/tasks.md index 3ceb56b06b..185dd1b944 100644 --- a/2023/day20/tasks.md +++ b/2023/day20/tasks.md @@ -1,16 +1,16 @@ ## Finally!! 🎉 + You have completed✅ the Docker handson and I hope you have learned something interesting from it.🙌 Now it's time to take your Docker skills to the next level by creating a comprehensive cheat-sheet of all the commands you've learned so far. This cheat-sheet should include commands for both Docker and Docker-Compose, as well as brief explanations of their usage. This cheat-sheet will not only help you in the future but also contribute to the DevOps community by providing a useful resource for others.😊🙌 - So, put your knowledge and creativity to the test and create a cheat-sheet that truly stands out! 🚀 -*I have added a [cheatsheet](https://cdn.hashnode.com/res/hashnode/image/upload/v1670863735841/r6xdXpsap.png?auto=compress,format&format=webp) for your reference, Make sure every cheatsheet must be UNIQUE* - -Post it on Linkedin and Spread the knowledge.😃 +_I have added a [cheatsheet](https://cdn.hashnode.com/res/hashnode/image/upload/v1670863735841/r6xdXpsap.png?auto=compress,format&format=webp) for your reference, Make sure every cheatsheet must be UNIQUE_ -**Happy Learning :)** +Post it on Linkedin and Spread the knowledge.😃 +**Happy Learning :)** +[← Previous Day](../day19/tasks.md) | [Next Day →](../day21/tasks.md) diff --git a/2023/day21/tasks.md b/2023/day21/tasks.md index d841d40367..6381a5ea00 100644 --- a/2023/day21/tasks.md +++ b/2023/day21/tasks.md @@ -1,12 +1,11 @@ ## Day 21 Task: Docker Important interview Questions. - ## Docker Interview - Docker is a good topic to ask in DevOps Engineer Interviews, mostly for freshers. - One must surely try these questions in order to be better in Docker - -## Questions +Docker is a good topic to ask in DevOps Engineer Interviews, mostly for freshers. +One must surely try these questions in order to be better in Docker + +## Questions - What is the Difference between an Image, Container and Engine? - What is the Difference between the Docker command COPY vs ADD? @@ -33,8 +32,9 @@ - command to remove all stopped containers, unused networks, build caches, and dangling images? - What are the common docker practices to reduce the size of Docker Image? - These questions will help you in your next DevOps Interview. -*Write a Blog and share it on LinkedIn.* +_Write a Blog and share it on LinkedIn._ + +**Happy Learning :)** -**Happy Learning :)** +[← Previous Day](../day20/tasks.md) | [Next Day →](../day22/tasks.md) diff --git a/2023/day22/tasks.md b/2023/day22/tasks.md index b8c3b57001..858ae879a1 100644 --- a/2023/day22/tasks.md +++ b/2023/day22/tasks.md @@ -3,26 +3,28 @@ **Linux, Git, Git-Hub, Docker finish ho chuka hai to chaliye seekhte hai inko deploy krne ke lye CI-CD tool:** ## What is Jenkins? + - Jenkins is an open source continuous integration-continuous delivery and deployment (CI/CD) automation software DevOps tool written in the Java programming language. It is used to implement CI/CD workflows, called pipelines. - Jenkins is a tool that is used for automation, and it is an open-source server that allows all the developers to build, test and deploy software. It works or runs on java as it is written in java. By using Jenkins we can make a continuous integration of projects(jobs) or end-to-endpoint automation. - Jenkins achieves Continuous Integration with the help of plugins. Plugins allow the integration of Various DevOps stages. If you want to integrate a particular tool, you need to install the plugins for that tool. For example Git, Maven 2 project, Amazon EC2, HTML publisher etc. -**Let us do discuss the necessity of this tool before going ahead to the procedural part for installation:** -- Nowadays, humans are becoming lazy😴 day by day so even having digital screens and just one click button in front of us then also need some automation. +**Let us do discuss the necessity of this tool before going ahead to the procedural part for installation:** + +- Nowadays, humans are becoming lazy😴 day by day so even having digital screens and just one click button in front of us then also need some automation. - Here, I’m referring to that part of automation where we need not have to look upon a process(here called a job) for completion and after it doing another job. For that, we have Jenkins with us. Note: By now Jenkins should be installed on your machine(as it was a part of previous tasks, if not follow [Installation Guide](https://youtu.be/OkVtBKqMt7I)) - -## Tasks: +## Tasks: **1. What you understood in Jenkin, write a small article in your own words (Don't copy from Internet Directly)** **2.Create a freestyle pipeline to print "Hello World!!** Hint: Use link for [Article](https://www.geeksforgeeks.org/what-is-jenkins) -Don't forget to post your progress on Linkedin. Till then Happy learning :) +Don't forget to post your progress on Linkedin. Till then Happy learning :) +[← Previous Day](../day21/tasks.md) | [Next Day →](../day23/tasks.md) diff --git a/2023/day23/tasks.md b/2023/day23/tasks.md index 6aa374568f..9802ba20eb 100644 --- a/2023/day23/tasks.md +++ b/2023/day23/tasks.md @@ -1,31 +1,33 @@ # Day 23 Task: Jenkins Freestyle Project for DevOps Engineers. - The Community is absolutely crushing it in the #90daysofdevops journey. Today's challenge is particularly exciting as it entails creating a Jenkins Freestyle Project, an opportunity for DevOps engineers to showcase their skills and push their limits. Who's ready to dive in and make it happen? 😍 +The Community is absolutely crushing it in the #90daysofdevops journey. Today's challenge is particularly exciting as it entails creating a Jenkins Freestyle Project, an opportunity for DevOps engineers to showcase their skills and push their limits. Who's ready to dive in and make it happen? 😍 ## What is CI/CD? -- CI or Continuous Integration is the practice of automating the integration of code changes from multiple developers into a single codebase. It is a software development practice where the developers commit their work frequently into the central code repository (Github or Stash). Then there are automated tools that build the newly committed code and do a code review, etc as required upon integration. - The key goals of Continuous Integration are to find and address bugs quicker, make the process of integrating code across a team of developers easier, improve software quality and reduce the time it takes to release new feature updates. +- CI or Continuous Integration is the practice of automating the integration of code changes from multiple developers into a single codebase. It is a software development practice where the developers commit their work frequently into the central code repository (Github or Stash). Then there are automated tools that build the newly committed code and do a code review, etc as required upon integration. + The key goals of Continuous Integration are to find and address bugs quicker, make the process of integrating code across a team of developers easier, improve software quality and reduce the time it takes to release new feature updates. -- CD or Continuous Delivery is carried out after Continuous Integration to make sure that we can release new changes to our customers quickly in an error-free way. This includes running integration and regression tests in the staging area (similar to the production environment) so that the final release is not broken in production. It ensures to automate the release process so that we have a release-ready product at all times and we can deploy our application at any point in time. +- CD or Continuous Delivery is carried out after Continuous Integration to make sure that we can release new changes to our customers quickly in an error-free way. This includes running integration and regression tests in the staging area (similar to the production environment) so that the final release is not broken in production. It ensures to automate the release process so that we have a release-ready product at all times and we can deploy our application at any point in time. ## What Is a Build Job? + A Jenkins build job contains the configuration for automating a specific task or step in the application building process. These tasks include gathering dependencies, compiling, archiving, or transforming code, and testing and deploying code in different environments. Jenkins supports several types of build jobs, such as freestyle projects, pipelines, multi-configuration projects, folders, multibranch pipelines, and organization folders. ## What is Freestyle Projects ?? 🤔 -A freestyle project in Jenkins is a type of project that allows you to build, test, and deploy software using a variety of different options and configurations. Here are a few tasks that you could complete when working with a freestyle project in Jenkins: +A freestyle project in Jenkins is a type of project that allows you to build, test, and deploy software using a variety of different options and configurations. Here are a few tasks that you could complete when working with a freestyle project in Jenkins: # Task-01 + - create a agent for your app. ( which you deployed from docker in earlier task) - Create a new Jenkins freestyle project for your app. - In the "Build" section of the project, add a build step to run the "docker build" command to build the image for the container. - Add a second step to run the "docker run" command to start a container using the image created in step 3. - # Task-02 + - Create Jenkins project to run "docker-compose up -d" command to start the multiple containers defined in the compose file (Hint- use day-19 Application & Database docker-compose file) - Set up a cleanup step in the Jenkins project to run "docker-compose down" command to stop and remove the containers defined in the compose file. @@ -34,3 +36,5 @@ For Refference jenkins Freestyle Project visit [here](https://youtu.be/wwNWgG5ht You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. Happy Learning:) + +[← Previous Day](../day22/tasks.md) | [Next Day →](../day24/tasks.md) diff --git a/2023/day24/tasks.md b/2023/day24/tasks.md index b4dec6cccc..ba88455e7a 100644 --- a/2023/day24/tasks.md +++ b/2023/day24/tasks.md @@ -1,37 +1,29 @@ - -# Day 24 Task: Complete Jenkins CI/CD Project - - +# Day 24 Task: Complete Jenkins CI/CD Project Let's make a beautiful CI/CD Pipeline for your Node JS Application 😍 - - ## Did you finish Day 23? - Day 23 was all about Jenkins CI/CD, make sure you have done it and understood the concepts. As today You will be doing one Project End to End and adding it to your resume :) - - As you have worked with Docker and Docker compose, it will be good to use it in a live project. - # Task-01 - Fork [this](https://github.com/LondheShubham153/node-todo-cicd.git) repository: -- Create a connection to your Jenkins job and your GitHub Repository via GitHub Integration. -- Read About [GitHub WebHooks](https://betterprogramming.pub/how-too-add-github-webhook-to-a-jenkins-pipeline-62b0be84e006) and make sure you have CICD setup +- Create a connection to your Jenkins job and your GitHub Repository via GitHub Integration. +- Read About [GitHub WebHooks](https://betterprogramming.pub/how-too-add-github-webhook-to-a-jenkins-pipeline-62b0be84e006) and make sure you have CICD setup - Refer [this](https://youtu.be/nplH3BzKHPk) video for the entire project # Task-02 - - In the Execute shell run the application using Docker compose - - You will have to make a Docker Compose file for this Project (Can be a good open source contribution) - - Run the project and give yourself a treat:) -For Reference and entire hands-on Project visit [here](https://youtu.be/nplH3BzKHPk) +- In the Execute shell run the application using Docker compose +- You will have to make a Docker Compose file for this Project (Can be a good open source contribution) +- Run the project and give yourself a treat:) - +For Reference and entire hands-on Project visit [here](https://youtu.be/nplH3BzKHPk) You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. - +Happy Learning:) -Happy Learning:) \ No newline at end of file +[← Previous Day](../day23/tasks.md) | [Next Day →](../day25/tasks.md) diff --git a/2023/day25/tasks.md b/2023/day25/tasks.md index 968407ac53..00222881cb 100644 --- a/2023/day25/tasks.md +++ b/2023/day25/tasks.md @@ -1,67 +1,31 @@ - - - # Day 25 Task: Complete Jenkins CI/CD Project - Continued with Documentation - - - - I can imagine catching up will be tough so take a small breather today and complete the Jenkins CI/CD project from Day 24 and add a documentation. - - - - ## Did you finish Day 24? - - - Day 24 will give you an End to End project and adding it to your resume will be a cherry on the top. - take more time, finish the project, add a Documentation, add it to your Resume and post about it today. - - # Task-01 - - - Document the process from cloning the repository to adding webhooks, and Deployment, etc. as a README , go through [this example](https://github.com/LondheShubham153/fynd-my-movie/blob/master/README.md) - - - A well written readme file will help others to understand your project and you will understand how to use the project again without any problems. - - - # Task-02 - - - Also it's important to keep smaller goals, as its a small task, think of a small Goal you can accomplish. - - - Write about it using [this template](https://www.linkedin.com/posts/shubhamlondhe1996_taking-resolutions-and-having-goals-for-an-activity-7023858409762373632-s2J8?utm_source=share&utm_medium=member_desktop) - - - Have small goals and strategies to achieve them, also have a small reward for yourself. - - For Reference and entire hands-on Project visit [here](https://youtu.be/nplH3BzKHPk) - - - - You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. - - - +Happy Learning:) -Happy Learning:) \ No newline at end of file +[← Previous Day](../day24/tasks.md) | [Next Day →](../day26/tasks.md) diff --git a/2023/day26/tasks.md b/2023/day26/tasks.md index 4679283bc5..6ca86a92eb 100644 --- a/2023/day26/tasks.md +++ b/2023/day26/tasks.md @@ -1,8 +1,6 @@ # Day 26 Task: Jenkins Declarative Pipeline - One of the most important parts of your DevOps and CICD journey is a Declarative Pipeline Syntax of Jenkins - ## Some terms for your Knowledge @@ -14,42 +12,39 @@ One of the most important parts of your DevOps and CICD journey is a Declarative # Why you should have a Pipeline -The definition of a Jenkins Pipeline is written into a text file (called a [`Jenkinsfile`](https://www.jenkins.io/doc/book/pipeline/jenkinsfile)) which in turn can be committed to a project’s source control repository. +The definition of a Jenkins Pipeline is written into a text file (called a [`Jenkinsfile`](https://www.jenkins.io/doc/book/pipeline/jenkinsfile)) which in turn can be committed to a project’s source control repository. This is the foundation of "Pipeline-as-code"; treating the CD pipeline as a part of the application to be versioned and reviewed like any other code. -**Creating a `Jenkinsfile` and committing it to source control provides a number of immediate benefits:** - -- Automatically creates a Pipeline build process for all branches and pull requests. - -- Code review/iteration on the Pipeline (along with the remaining source code). +**Creating a `Jenkinsfile` and committing it to source control provides a number of immediate benefits:** +- Automatically creates a Pipeline build process for all branches and pull requests. +- Code review/iteration on the Pipeline (along with the remaining source code). # Pipeline syntax -````groovy +```groovy pipeline { - agent any + agent any stages { - stage('Build') { + stage('Build') { steps { - // + // } } - stage('Test') { + stage('Test') { steps { - // + // } } - stage('Deploy') { + stage('Deploy') { steps { - // + // } } } } -```` +``` - # Task-01 - Create a New Job, this time select Pipeline instead of Freestyle Project. @@ -58,6 +53,7 @@ pipeline { - In case of any issues feel free to post on any Groups, [Discord](https://discord.gg/Q6ntmMtH) or [Telegram](https://t.me/trainwithshubham) You can post your progress on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challenge. - -Happy Learning:) \ No newline at end of file +Happy Learning:) + +[← Previous Day](../day25/tasks.md) | [Next Day →](../day27/tasks.md) diff --git a/2023/day27/tasks.md b/2023/day27/tasks.md index 9af724ba30..9fa425c8e0 100644 --- a/2023/day27/tasks.md +++ b/2023/day27/tasks.md @@ -1,26 +1,16 @@ - # Day 27 Task: Jenkins Declarative Pipeline with Docker - - Day 26 was all about a Declarative pipeline, now its time to level up things, let's integrate Docker and your Jenkins declarative pipeline - - ## Use your Docker Build and Run Knowledge - - -**docker build -** you can use `sh 'docker build . -t ' ` in your pipeline stage block to run the docker build command. (Make sure you have docker installed with correct permissions. - - +**docker build -** you can use `sh 'docker build . -t ' ` in your pipeline stage block to run the docker build command. (Make sure you have docker installed with correct permissions. **docker run:** you can use `sh 'docker run -d '` in your pipeline stage block to build the container. - +**How will the stages look** -**How will the stages look** -````groovy +```groovy stages { stage('Build') { steps { @@ -28,23 +18,16 @@ stages { } } } -```` - - - +``` # Task-01 - - -- Create a docker-integrated Jenkins declarative pipeline +- Create a docker-integrated Jenkins declarative pipeline - Use the above-given syntax using `sh` inside the stage block - You will face errors in case of running a job twice, as the docker container will be already created, so for that do task 2 # Task-02 - - - Create a docker-integrated Jenkins declarative pipeline using the `docker` groovy syntax inside the stage block. - You won't face errors, you can Follow [this documentation](https://tempora-mutantur.github.io/jenkins.io/github_pages_test/doc/book/pipeline/docker/) @@ -55,5 +38,6 @@ stages { Are you enjoying the #90DaysOfDevOps Challenge? Let me know how are feeling after 4 weeks of DevOps Learnings, +Happy Learning:) -Happy Learning:) \ No newline at end of file +[← Previous Day](../day26/tasks.md) | [Next Day →](../day28/tasks.md) diff --git a/2023/day28/tasks.md b/2023/day28/tasks.md index 8964c5066d..4abb2a795d 100644 --- a/2023/day28/tasks.md +++ b/2023/day28/tasks.md @@ -1,10 +1,11 @@ # Day 28 Task: Jenkins Agents - # Jenkins Master (Server) + Jenkins’s server or master node holds all key configurations. Jenkins master server is like a control server that orchestrates all the workflow defined in the pipelines. For example, scheduling a job, monitoring the jobs, etc. # Jenkins Agent + An agent is typically a machine or container that connects to a Jenkins master and this agent that actually execute all the steps mentioned in a Job. When you create a Jenkins job, you have to assign an agent to it. Every agent has a label as a unique identifier. When you trigger a Jenkins job from the master, the actual execution happens on the agent node that is configured in the job. @@ -14,19 +15,14 @@ A single, monolithic Jenkins installation can work great for a small team with a

## Pre-requisites + Let’s say we’re starting with a fresh Ubuntu 22.04 Linux installation. To get an agent working make sure you install Java ( same version as jenkins master server ) and Docker on it. -` -Note:- -While creating an agent, be sure to separate rights, permissions, and ownership for jenkins users. -` +`Note:- +While creating an agent, be sure to separate rights, permissions, and ownership for jenkins users. ` # Task-01 - - - - - Create an agent by setting up a node on Jenkins - Create a new AWS EC2 Instance and connect it to master(Where Jenkins is installed) @@ -36,29 +32,18 @@ While creating an agent, be sure to separate rights, permissions, and ownership - You can follow [this article](https://www.linkedin.com/posts/chetanrakhra_devops-project-share-activity-7017885886461698048-os5f?utm_source=share&utm_medium=member_android) for the same - - # Task-02 - - - - - Run your previous Jobs (which you built on Day 26, and Day 27) on the new agent - Use labels for the agent, your master server should trigger builds for the agent server. - - - In case of any issues feel free to post on any Groups, [Discord](https://discord.gg/Q6ntmMtH) or [Telegram](https://t.me/trainwithshubham) - - Are you enjoying the #90DaysOfDevOps Challenge? Let me know how are feeling after 4 weeks of DevOps Learning. - - - Happy Learning:) + +[← Previous Day](../day27/tasks.md) | [Next Day →](../day29/tasks.md) diff --git a/2023/day29/tasks.md b/2023/day29/tasks.md index c50a711d45..e2b9886663 100644 --- a/2023/day29/tasks.md +++ b/2023/day29/tasks.md @@ -1,11 +1,12 @@ ## Day 29 Task: Jenkins Important interview Questions.

- + ## Jenkins Interview - Here are some Jenkins-specific questions related to Docker that one can use during a DevOps Engineer interview: - + +Here are some Jenkins-specific questions related to Docker that one can use during a DevOps Engineer interview: + ## Questions 1. What’s the difference between continuous integration, continuous delivery, and continuous deployment? @@ -18,15 +19,15 @@ 8. Jenkins workflow and write a script for this workflow? 9. How to create continuous deployment in Jenkins? 10. How build job in Jenkins? -11. Why we use pipeline in Jenkins? +11. Why we use pipeline in Jenkins? 12. Is Only Jenkins enough for automation? 13. How will you handle secrets? 14. Explain diff stages in CI-CD setup 15. Name some of the plugins in Jenkin? - - These questions will help you in your next DevOps Interview. Write a Blog and share it on LinkedIn. -*Happy Learning :)* +_Happy Learning :)_ + +[← Previous Day](../day28/tasks.md) | [Next Day →](../day30/tasks.md) diff --git a/2023/day30/tasks.md b/2023/day30/tasks.md index 448e904fe0..39141b0b4d 100644 --- a/2023/day30/tasks.md +++ b/2023/day30/tasks.md @@ -1,23 +1,15 @@ - ## Day 30 Task: Kubernetes Architecture - -

- - ## Kubernetes Overview -With the widespread adoption of [containers](https://cloud.google.com/containers) among organizations, Kubernetes, the container-centric management software, has become a standard to deploy and operate containerized applications and is one of the most important parts of DevOps. - -Originally developed at Google and released as open-source in 2014. Kubernetes builds on 15 years of running Google's containerized workloads and the valuable contributions from the open-source community. Inspired by Google’s internal cluster management system, [Borg](https://research.google.com/pubs/pub43438.html), +With the widespread adoption of [containers](https://cloud.google.com/containers) among organizations, Kubernetes, the container-centric management software, has become a standard to deploy and operate containerized applications and is one of the most important parts of DevOps. +Originally developed at Google and released as open-source in 2014. Kubernetes builds on 15 years of running Google's containerized workloads and the valuable contributions from the open-source community. Inspired by Google’s internal cluster management system, [Borg](https://research.google.com/pubs/pub43438.html), ## Tasks - - 1. What is Kubernetes? Write in your own words and why do we call it k8s? 2. What are the benefits of using k8s? @@ -32,6 +24,6 @@ Originally developed at Google and released as open-source in 2014. Kubernetes b Kubernetes architecture is important, so make sure you spend a day understanding it. [This video](https://youtu.be/FqfoDUhzyDo) will surely help you. - +_Happy Learning :)_ -*Happy Learning :)* \ No newline at end of file +[← Previous Day](../day29/tasks.md) | [Next Day →](../day31/tasks.md) diff --git a/2023/day31/tasks.md b/2023/day31/tasks.md index 8fb0afe038..e18e6260de 100644 --- a/2023/day31/tasks.md +++ b/2023/day31/tasks.md @@ -1,37 +1,22 @@ - ## Day 31 Task: Launching your First Kubernetes Cluster with Nginx running - - ### Awesome! You learned the architecture of one of the top most important tool "Kubernetes" in your previous task. - - ## What about doing some hands-on now? -Let's read about minikube and implement *k8s* in our local machine - - - -1) **What is minikube?** +Let's read about minikube and implement _k8s_ in our local machine - +1. **What is minikube?** -*Ans*:- Minikube is a tool which quickly sets up a local Kubernetes cluster on macOS, Linux, and Windows. It can deploy as a VM, a container, or on bare-metal. - - +_Ans_:- Minikube is a tool which quickly sets up a local Kubernetes cluster on macOS, Linux, and Windows. It can deploy as a VM, a container, or on bare-metal. Minikube is a pared-down version of Kubernetes that gives you all the benefits of Kubernetes with a lot less effort. This makes it an interesting option for users who are new to containers, and also for projects in the world of edge computing and the Internet of Things. - - -2) **Features of minikube** - - +2. **Features of minikube** -*Ans* :- +_Ans_ :- (a) Supports the latest Kubernetes release (+6 previous minor versions) @@ -49,50 +34,32 @@ This makes it an interesting option for users who are new to containers, and als (h) Supports common CI environments - - ## Task-01: ## Install minikube on your local - - For installation, you can Visit [this page](https://minikube.sigs.k8s.io/docs/start/). - - If you want to try an alternative way, you can check [this](https://k8s-docs.netlify.app/en/docs/tasks/tools/install-minikube/). - - ## Let's understand the concept **pod** - - -*Ans:-* - - +_Ans:-_ Pods are the smallest deployable units of computing that you can create and manage in Kubernetes. - - A Pod (as in a pod of whales or pea pod) is a group of one or more containers, with shared storage and network resources, and a specification for how to run the containers. A Pod's contents are always co-located and co-scheduled, and run in a shared context. A Pod models an application-specific "logical host": it contains one or more application containers which are relatively tightly coupled. - - You can read more about pod from [here](https://kubernetes.io/docs/concepts/workloads/pods/) . - - ## Task-02: ## Create your first pod on Kubernetes through minikube. We are suggesting you make an nginx pod, but you can always show your creativity and do it on your own. - - **Having an issue? Don't worry, adding a sample yaml file for pod creation, you can always refer that.** -*Happy Learning :)* \ No newline at end of file +_Happy Learning :)_ + +[← Previous Day](../day30/tasks.md) | [Next Day →](../day32/tasks.md) diff --git a/2023/day32/tasks.md b/2023/day32/tasks.md index 089768d40b..6ecb16969c 100644 --- a/2023/day32/tasks.md +++ b/2023/day32/tasks.md @@ -1,4 +1,3 @@ - ## Day 32 Task: Launching your Kubernetes Cluster with Deployment ### Congratulation ! on your learning on K8s on Day-31 @@ -11,18 +10,18 @@ You describe a desired state in a Deployment, and the Deployment Controller chan ## Today's task let's keep it very simple. -## Task-1: +## Task-1: + **Create one Deployment file to deploy a sample todo-app on K8s using "Auto-healing" and "Auto-Scaling" feature** - add a deployment.yml file (sample is kept in the folder for your reference) - apply the deployment to your k8s (minikube) cluster by command -`kubectl apply -f deployment.yml` + `kubectl apply -f deployment.yml` Let's make your resume shine with one more project ;) - **Having an issue? Don't worry, adding a sample deployment file , you can always refer that or wathch [this video](https://youtu.be/ONrbWFJXLLk)** - - Happy Learning :) + +[← Previous Day](../day31/tasks.md) | [Next Day →](../day33/tasks.md) diff --git a/2023/day33/tasks.md b/2023/day33/tasks.md index ba43ece1d8..5b310d60a9 100644 --- a/2023/day33/tasks.md +++ b/2023/day33/tasks.md @@ -1,10 +1,15 @@ # Day 33 Task: Working with Namespaces and Services in Kubernetes + ### Congrats🎊🎉 on updating your Deployment yesterday💥🙌 + ## What are Namespaces and Services in k8s + In Kubernetes, Namespaces are used to create isolated environments for resources. Each Namespace is like a separate cluster within the same physical cluster. Services are used to expose your Pods and Deployments to the network. Read more about Namespace [Here](https://kubernetes.io/docs/concepts/workloads/pods/user-namespaces/) # Today's task: + ## Task 1: + - Create a Namespace for your Deployment - Use the command `kubectl create namespace ` to create a Namespace @@ -12,11 +17,12 @@ In Kubernetes, Namespaces are used to create isolated environments for resources - Update the deployment.yml file to include the Namespace - Apply the updated deployment using the command: - `kubectl apply -f deployment.yml -n ` + `kubectl apply -f deployment.yml -n ` - Verify that the Namespace has been created by checking the status of the Namespaces in your cluster. ## Task 2: + - Read about Services, Load Balancing, and Networking in Kubernetes. Refer official documentation of kubernetes [Link](https://kubernetes.io/docs/concepts/services-networking/) Need help with Namespaces? Check out this [video](https://youtu.be/K3jNo4z5Jx8) for assistance. @@ -25,4 +31,4 @@ Keep growing your Kubernetes knowledge💥🙌 Happy Learning! :) - +[← Previous Day](../day32/tasks.md) | [Next Day →](../day34/tasks.md) diff --git a/2023/day34/tasks.md b/2023/day34/tasks.md index 6d838c5d44..374db996c2 100644 --- a/2023/day34/tasks.md +++ b/2023/day34/tasks.md @@ -1,31 +1,36 @@ # Day 34 Task: Working with Services in Kubernetes -### Congratulation🎊 on your learning on Deployments in K8s on Day-33 + +### Congratulation🎊 on your learning on Deployments in K8s on Day-33 + ## What are Services in K8s -In Kubernetes, Services are objects that provide stable network identities to Pods and abstract away the details of Pod IP addresses. Services allow Pods to receive traffic from other Pods, Services, and external clients. +In Kubernetes, Services are objects that provide stable network identities to Pods and abstract away the details of Pod IP addresses. Services allow Pods to receive traffic from other Pods, Services, and external clients. ## Task-1: + - Create a Service for your todo-app Deployment from Day-32 - Create a Service definition for your todo-app Deployment in a YAML file. - Apply the Service definition to your K8s (minikube) cluster using the `kubectl apply -f service.yml -n ` command. - Verify that the Service is working by accessing the todo-app using the Service's IP and Port in your Namespace. ## Task-2: + - Create a ClusterIP Service for accessing the todo-app from within the cluster - Create a ClusterIP Service definition for your todo-app Deployment in a YAML file. - Apply the ClusterIP Service definition to your K8s (minikube) cluster using the `kubectl apply -f cluster-ip-service.yml -n ` command. - Verify that the ClusterIP Service is working by accessing the todo-app from another Pod in the cluster in your Namespace. ## Task-3: + - Create a LoadBalancer Service for accessing the todo-app from outside the cluster - Create a LoadBalancer Service definition for your todo-app Deployment in a YAML file. - Apply the LoadBalancer Service definition to your K8s (minikube) cluster using the `kubectl apply -f load-balancer-service.yml -n ` command. - Verify that the LoadBalancer Service is working by accessing the todo-app from outside the cluster in your Namespace. - Struggling with Services? Take a look at this video for a step-by-step [guide](https://youtu.be/OJths_RojFA). Need help with Services in Kubernetes? Check out the Kubernetes [documentation](https://kubernetes.io/docs/concepts/services-networking/service/) for assistance. Happy Learning :) +[← Previous Day](../day33/tasks.md) | [Next Day →](../day35/tasks.md) diff --git a/2023/day35/tasks.md b/2023/day35/tasks.md index 1ab1d3577b..555ce760e4 100644 --- a/2023/day35/tasks.md +++ b/2023/day35/tasks.md @@ -1,17 +1,21 @@ # Day 35: Mastering ConfigMaps and Secrets in Kubernetes🔒🔑🛡️ -### 👏🎉 Yay! Yesterday we conquered Namespaces and Services 💪💻🔗🚀 +### 👏🎉 Yay! Yesterday we conquered Namespaces and Services 💪💻🔗🚀 ## What are ConfigMaps and Secrets in k8s + In Kubernetes, ConfigMaps and Secrets are used to store configuration data and secrets, respectively. ConfigMaps store configuration data as key-value pairs, while Secrets store sensitive data in an encrypted form. -- *Example :- Imagine you're in charge of a big spaceship (Kubernetes cluster) with lots of different parts (containers) that need information to function properly. -ConfigMaps are like a file cabinet where you store all the information each part needs in simple, labeled folders (key-value pairs). -Secrets, on the other hand, are like a safe where you keep the important, sensitive information that shouldn't be accessible to just anyone (encrypted data). -So, using ConfigMaps and Secrets, you can ensure each part of your spaceship (Kubernetes cluster) has the information it needs to work properly and keep sensitive information secure! 🚀* +- _Example :- Imagine you're in charge of a big spaceship (Kubernetes cluster) with lots of different parts (containers) that need information to function properly. + ConfigMaps are like a file cabinet where you store all the information each part needs in simple, labeled folders (key-value pairs). + Secrets, on the other hand, are like a safe where you keep the important, sensitive information that shouldn't be accessible to just anyone (encrypted data). + So, using ConfigMaps and Secrets, you can ensure each part of your spaceship (Kubernetes cluster) has the information it needs to work properly and keep sensitive information secure! 🚀_ - Read more about [ConfigMap](https://kubernetes.io/docs/concepts/configuration/configmap/) & [Secret](https://kubernetes.io/docs/concepts/configuration/secret/). + ## Today's task: + ## Task 1: + - Create a ConfigMap for your Deployment - Create a ConfigMap for your Deployment using a file or the command line - Update the deployment.yml file to include the ConfigMap @@ -19,6 +23,7 @@ So, using ConfigMaps and Secrets, you can ensure each part of your spaceship (Ku - Verify that the ConfigMap has been created by checking the status of the ConfigMaps in your Namespace. ## Task 2: + - Create a Secret for your Deployment - Create a Secret for your Deployment using a file or the command line - Update the deployment.yml file to include the Secret @@ -27,5 +32,6 @@ So, using ConfigMaps and Secrets, you can ensure each part of your spaceship (Ku Need help with ConfigMaps and Secrets? Check out this [video](https://youtu.be/FAnQTgr04mU) for assistance. - Keep learning and expanding your knowledge of Kubernetes💥🙌 + +[← Previous Day](../day34/tasks.md) | [Next Day →](../day36/tasks.md) diff --git a/2023/day36/tasks.md b/2023/day36/tasks.md index 1d2993d3d7..b1732deeae 100644 --- a/2023/day36/tasks.md +++ b/2023/day36/tasks.md @@ -6,7 +6,7 @@ ## What are Persistent Volumes in k8s -In Kubernetes, a Persistent Volume (PV) is a piece of storage in the cluster that has been provisioned by an administrator. A Persistent Volume Claim (PVC) is a request for storage by a user. The PVC references the PV, and the PV is bound to a specific node. Read official documentation of [Persistent Volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/). +In Kubernetes, a Persistent Volume (PV) is a piece of storage in the cluster that has been provisioned by an administrator. A Persistent Volume Claim (PVC) is a request for storage by a user. The PVC references the PV, and the PV is bound to a specific node. Read official documentation of [Persistent Volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/). ⏰ Wait, wait, wait! 📣 Attention all #90daysofDevOps Challengers. 💪 @@ -47,3 +47,5 @@ Need help with Persistent Volumes? Check out this [video](https://youtu.be/U0_N3 Keep up the excellent work🙌💥 Happy Learning :) + +[← Previous Day](../day35/tasks.md) | [Next Day →](../day37/tasks.md) diff --git a/2023/day37/tasks.md b/2023/day37/tasks.md index dec7eba46c..d3bad9f7f4 100644 --- a/2023/day37/tasks.md +++ b/2023/day37/tasks.md @@ -1,5 +1,5 @@ ## Day 37 Task: Kubernetes Important interview Questions. - + ## Questions 1.What is Kubernetes and why it is important? @@ -18,7 +18,7 @@ 8.Can you give an example of how Kubernetes can be used to deploy a highly available application? -9.What is namespace is kubernetes? Which namespace any pod takes if we don't specify any namespace? +9.What is namespace is kubernetes? Which namespace any pod takes if we don't specify any namespace? 10.How ingress helps in kubernetes? @@ -34,12 +34,10 @@ 16.Difference between create and apply in kubernetes? +## These questions will help you in your next DevOps Interview. +_Write a Blog and share it on LinkedIn._ +**_Happy Learning :)_** - -## These questions will help you in your next DevOps Interview. - -*Write a Blog and share it on LinkedIn.* - -***Happy Learning :)*** +[← Previous Day](../day36/tasks.md) | [Next Day →](../day38/tasks.md) diff --git a/2023/day38/tasks.md b/2023/day38/tasks.md index c376ba9072..35ae94b1a2 100644 --- a/2023/day38/tasks.md +++ b/2023/day38/tasks.md @@ -1,23 +1,30 @@ # Day 38 Getting Started with AWS Basics☁ -![AWS](https://user-images.githubusercontent.com/115981550/217238286-6c6bc6e7-a1ac-4d12-98f3-f95ff5bf53fc.png) +![AWS](https://user-images.githubusercontent.com/115981550/217238286-6c6bc6e7-a1ac-4d12-98f3-f95ff5bf53fc.png) Congratulations!!!! you have come so far. Don't let your excuses break your consistency. Let's begin our new Journey with Cloud☁. By this time you have created multiple EC2 instances, if not let's begin the journey: + ## AWS: + Amazon Web Services is one of the most popular Cloud Provider that has free tier too for students and Cloud enthutiasts for their Handson while learning (Create your free account today to explore more on it). Read from [here](https://aws.amazon.com/what-is-aws/) ## IAM: + AWS Identity and Access Management (IAM) is a web service that helps you securely control access to AWS resources. With IAM, you can centrally manage permissions that control which AWS resources users can access. You use IAM to control who is authenticated (signed in) and authorized (has permissions) to use resources. Read from [here](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) Get to know IAM more deeply [Click Here!!](https://www.youtube.com/watch?v=ORB4eY8EydA) ### Task1: + Create an IAM user with username of your own wish and grant EC2 Access. Launch your Linux instance through the IAM user that you created now and install jenkins and docker on your machine via single Shell Script. ### Task2: + In this task you need to prepare a devops team of avengers. Create 3 IAM users of avengers and assign them in devops groups with IAM policy. Post your progress on Linkedin. Till then Happy Learning :) + +[← Previous Day](../day37/tasks.md) | [Next Day →](../day39/tasks.md) diff --git a/2023/day39/tasks.md b/2023/day39/tasks.md index 020797e89c..e748b8b26a 100644 --- a/2023/day39/tasks.md +++ b/2023/day39/tasks.md @@ -1,17 +1,18 @@ # Day 39 AWS and IAM Basics☁ -![AWS](https://miro.medium.com/max/1400/0*dIzXLQn6aBClm1TJ.png) - +![AWS](https://miro.medium.com/max/1400/0*dIzXLQn6aBClm1TJ.png) -By this time you have created multiple EC2 instances, and post installation manually installed applications like Jenkins, docker etc. +By this time you have created multiple EC2 instances, and post installation manually installed applications like Jenkins, docker etc. Now let's switch to little automation part. Sounds interesting??🤯 ## AWS: + Amazon Web Services is one of the most popular Cloud Provider that has free tier too for students and Cloud enthutiasts for their Handson while learning (Create your free account today to explore more on it). Read from [here](https://aws.amazon.com/what-is-aws/) ## User Data in AWS: + - When you launch an instance in Amazon EC2, you have the option of passing user data to the instance that can be used to perform common automated configuration tasks and even run scripts after the instance starts. You can pass two types of user data to Amazon EC2: shell scripts and cloud-init directives. - You can also pass this data into the launch instance wizard as plain text, as a file (this is useful for launching instances using the command line tools), or as base64-encoded text (for API calls). - This will save time and manual effort everytime you launch an instance and want to install any application on it like apache, docker, Jenkins etc @@ -19,19 +20,22 @@ Read from [here](https://aws.amazon.com/what-is-aws/) Read more from [here](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html) ## IAM: + AWS Identity and Access Management (IAM) is a web service that helps you securely control access to AWS resources. With IAM, you can centrally manage permissions that control which AWS resources users can access. You use IAM to control who is authenticated (signed in) and authorized (has permissions) to use resources. Read from [here](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) Get to know IAM more deeply🏊[Click Here!!](https://www.youtube.com/watch?v=ORB4eY8EydA) - ### Task1: + - Launch EC2 instance with already installed Jenkins on it. Once server shows up in console, hit the IP address in browser and you Jenkins page should be visible. - Take screenshot of Userdata and Jenkins page, this will verify the task completion. ### Task2: + - Read more on IAM Roles and explain the IAM Users, Groups and Roles in your own terms. - Create three Roles named: DevOps-User, Test-User and Admin. - Post your progress on Linkedin. Till then Happy Learning :) + +[← Previous Day](../day38/tasks.md) | [Next Day →](../day40/tasks.md) diff --git a/2023/day40/tasks.md b/2023/day40/tasks.md index 4f6b9462ef..d9ed7ad768 100644 --- a/2023/day40/tasks.md +++ b/2023/day40/tasks.md @@ -1,39 +1,27 @@ - # Day 40 AWS EC2 Automation ☁ ![AWS](https://www.eginnovations.com/blog/wp-content/uploads/2021/09/Amazon-AWS-Cloud-Topimage-1.jpg) - - - - I hope your journey with AWS cloud and automation is going well [](https://emojipedia.org/emoji/%F0%9F%98%8D/) -### 😍 - +### 😍 ## Automation in EC2: Amazon EC2 or Amazon Elastic Compute Cloud can give you secure, reliable, high-performance, and cost-effective computing infrastructure to meet demanding business needs. - + Also, if you know a few things, you can automate many things. Read from [here](https://aws.amazon.com/ec2/) - - ## Launch template in AWS EC2: -- You can make a launch template with the configuration information you need to start an instance. You can save launch parameters in launch templates so you don't have to type them in every time you start a new instance. -- For example, a launch template can have the AMI ID, instance type, and network settings that you usually use to launch instances. +- You can make a launch template with the configuration information you need to start an instance. You can save launch parameters in launch templates so you don't have to type them in every time you start a new instance. +- For example, a launch template can have the AMI ID, instance type, and network settings that you usually use to launch instances. - You can tell the Amazon EC2 console to use a certain launch template when you start an instance. - - Read more from [here](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html) - - ## Instance Types: Amazon EC2 has a large number of instance types that are optimised for different uses. The different combinations of CPU, memory, storage and networking capacity in instance types give you the freedom to choose the right mix of resources for your apps. Each instance type comes with one or more instance sizes, so you can adjust your resources to meet the needs of the workload you want to run. @@ -43,7 +31,6 @@ Read from [here](https://aws.amazon.com/ec2/instance-types/?trk=32f4fbd0-ffda-46 ## AMI: An Amazon Machine Image (AMI) is an image that AWS supports and keeps up to date. It contains the information needed to start an instance. When you launch an instance, you must choose an AMI. When you need multiple instances with the same configuration, you can launch them from a single AMI. - ### Task1: @@ -51,12 +38,12 @@ An Amazon Machine Image (AMI) is an image that AWS supports and keeps up to date - Create 3 Instances using Launch Template, there must be an option that shows number of instances to be launched ,can you find it? :) -- You can go one step ahead and create an auto-scaling group, sounds tough? +- You can go one step ahead and create an auto-scaling group, sounds tough? + +Check [this](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-launch-template.html#create-launch-template-for-auto-scaling) out -Check [this](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-launch-template.html#create-launch-template-for-auto-scaling) out - - +Post your progress on Linkedin. -Post your progress on Linkedin. +Happy Learning :) -Happy Learning :) \ No newline at end of file +[← Previous Day](../day39/tasks.md) | [Next Day →](../day41/tasks.md) diff --git a/2023/day41/tasks.md b/2023/day41/tasks.md index 5420ee07e5..929480444a 100644 --- a/2023/day41/tasks.md +++ b/2023/day41/tasks.md @@ -5,29 +5,31 @@ ### Hi, I hope you had a great day yesterday learning about the launch template and instances in EC2. Today, we are going to dive into one of the most important concepts in EC2: Load Balancing. ## What is Load Balancing? + Load balancing is the distribution of workloads across multiple servers to ensure consistent and optimal resource utilization. It is an essential aspect of any large-scale and scalable computing system, as it helps you to improve the reliability and performance of your applications. ## Elastic Load Balancing: + **Elastic Load Balancing (ELB)** is a service provided by Amazon Web Services (AWS) that automatically distributes incoming traffic across multiple EC2 instances. ELB provides three types of load balancers: Read more from [here](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) -1) **Application Load Balancer (ALB)** - _operates at layer 7 of the OSI model and is ideal for applications that require advanced routing and microservices._ +1. **Application Load Balancer (ALB)** - _operates at layer 7 of the OSI model and is ideal for applications that require advanced routing and microservices._ - Read more from [here](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html) - -2) **Network Load Balancer (NLB)** - _operates at layer 4 of the OSI model and is ideal for applications that require high throughput and low latency._ +2. **Network Load Balancer (NLB)** - _operates at layer 4 of the OSI model and is ideal for applications that require high throughput and low latency._ - Read more from [here](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/introduction.html) +3. **Classic Load Balancer (CLB)** - _operates at layer 4 of the OSI model and is ideal for applications that require basic load balancing features._ -3) **Classic Load Balancer (CLB)** - _operates at layer 4 of the OSI model and is ideal for applications that require basic load balancing features._ - Read more [here](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/introduction.html) ## 🎯 Today's Tasks: ### Task 1: + - launch 2 EC2 instances with an Ubuntu AMI and use User Data to install the Apache Web Server. - Modify the index.html file to include your name so that when your Apache server is hosted, it will display your name also do it for 2nd instance which include " TrainWithShubham Community is Super Aweasome :) ". - Copy the public IP address of your EC2 instances. @@ -35,6 +37,7 @@ Read more from [here](https://docs.aws.amazon.com/elasticloadbalancing/latest/us - You should see a webpage displaying information about your PHP installation. ### Task 2: + - Create an Application Load Balancer (ALB) in EC2 using the AWS Management Console. - Add EC2 instances which you launch in task-1 to the ALB as target groups. - Verify that the ALB is working properly by checking the health status of the target instances and testing the load balancing capabilities. @@ -46,3 +49,5 @@ Need help with task? Check out this [Blog for assistance](https://rushikesh-mash Don't forget to share your progress on LinkedIn and have a great day🙌💥 Happy Learning! 😃 + +[← Previous Day](../day40/tasks.md) | [Next Day →](../day42/tasks.md) diff --git a/2023/day42/tasks.md b/2023/day42/tasks.md index 1d9aaf8c28..5baa958002 100644 --- a/2023/day42/tasks.md +++ b/2023/day42/tasks.md @@ -11,8 +11,7 @@ Watch [this video](https://youtu.be/XYKqL5GFI-I) for more details. The AWS Command Line Interface (AWS CLI) is a unified tool to manage your AWS services. With just one tool to download and configure, you can control multiple AWS services from the command line and automate them through scripts. -The AWS CLI v2 offers several new features including improved installers, new configuration options such as AWS IAM Identity Center (successor to AWS SSO), and various interactive features. - +The AWS CLI v2 offers several new features including improved installers, new configuration options such as AWS IAM Identity Center (successor to AWS SSO), and various interactive features. ## Task-01 @@ -22,7 +21,8 @@ The AWS CLI v2 offers several new features including improved installers, new co - Setup and install AWS CLI and configure your account credentials - Let me know if you have any issues while doing the task. -Happy Learning :) \ No newline at end of file +Happy Learning :) + +[← Previous Day](../day41/tasks.md) | [Next Day →](../day43/tasks.md) diff --git a/2023/day43/tasks.md b/2023/day43/tasks.md index 645e66d05c..146d65b5dd 100644 --- a/2023/day43/tasks.md +++ b/2023/day43/tasks.md @@ -1,26 +1,32 @@ # Day 43: S3 Programmatic access with AWS-CLI 💻 📁 + Hi, I hope you had a great day yesterday. Today as part of the #90DaysofDevOps Challenge we will be exploring most commonly used service in AWS i.e S3. ![s3](https://user-images.githubusercontent.com/115981550/218308379-a2e841cf-6b77-4d02-bfbe-20d1bae09b20.png) # S3 + Amazon Simple Storage Service (Amazon S3) is an object storage service that provides a secure and scalable way to store and access data on the cloud. It is designed for storing any kind of data, such as text files, images, videos, backups, and more. Read more [here](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) + ## Task-01 + - Launch an EC2 instance using the AWS Management Console and connect to it using Secure Shell (SSH). - Create an S3 bucket and upload a file to it using the AWS Management Console. -- Access the file from the EC2 instance using the AWS Command Line Interface (AWS CLI). +- Access the file from the EC2 instance using the AWS Command Line Interface (AWS CLI). Read more about S3 using aws-cli [here](https://docs.aws.amazon.com/cli/latest/reference/s3/index.html) ## Task-02 + - Create a snapshot of the EC2 instance and use it to launch a new EC2 instance. - Download a file from the S3 bucket using the AWS CLI. - Verify that the contents of the file are the same on both EC2 instances. Added Some Useful commands to complete the task. [Click here for commands](https://github.com/LondheShubham153/90DaysOfDevOps/blob/833a67ac4ec17b992934cd6878875dccc4274f56/2023/day43/aws-cli.md) - Let me know if you have any questions or face any issues while doing the tasks.🚀 Happy Learning :) + +[← Previous Day](../day42/tasks.md) | [Next Day →](../day44/tasks.md) diff --git a/2023/day44/tasks.md b/2023/day44/tasks.md index d78e66b479..f46feef3fb 100644 --- a/2023/day44/tasks.md +++ b/2023/day44/tasks.md @@ -20,3 +20,4 @@ Watch [this video](https://youtu.be/MrA6Rk1Y82E) for reference. Happy Learning +[← Previous Day](../day43/tasks.md) | [Next Day →](../day45/tasks.md) diff --git a/2023/day45/tasks.md b/2023/day45/tasks.md index a29eb03d32..b26150506d 100644 --- a/2023/day45/tasks.md +++ b/2023/day45/tasks.md @@ -2,13 +2,12 @@ Over 30% of all websites on the internet use WordPress as their content management system (CMS). It is most often used to run blogs, but it can also be used to run e-commerce sites, message boards, and many other popular things. This guide will show you how to set up a WordPress blog site. - - ## Task-01 - As WordPress requires a MySQL database to store its data ,create an RDS as you did in Day 44 To configure this WordPress site, you will create the following resources in AWS: + - An Amazon EC2 instance to install and host the WordPress application. - An Amazon RDS for MySQL database to store your WordPress data. - Setup the server and post your new Wordpress app. @@ -16,3 +15,4 @@ To configure this WordPress site, you will create the following resources in AWS Read [this](https://aws.amazon.com/getting-started/hands-on/deploy-wordpress-with-amazon-rds/) for a detailed explanation Happy Learning :) +[← Previous Day](../day44/tasks.md) | [Next Day →](../day46/tasks.md) diff --git a/2023/day46/tasks.md b/2023/day46/tasks.md index fa3a12a918..34ae6b53ce 100644 --- a/2023/day46/tasks.md +++ b/2023/day46/tasks.md @@ -4,22 +4,21 @@ Hey learners, you have been using aws services atleast for last 45 days. Have yo Hahahaha😁, Well! we, as a responsible community ,always try to make it under free tier , but it's good to know and setup something , which will inform you whenever bill touches a Threshold. -## What is Amazon CloudWatch? +## What is Amazon CloudWatch? + Amazon CloudWatch monitors your Amazon Web Services (AWS) resources and the applications you run on AWS in real time. You can use CloudWatch to collect and track metrics, which are variables you can measure for your resources and applications. Read more about cloudwatch from the official documentation [here](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html) - ## What is Amazon SNS? Amazon Simple Notification Service is a notification service provided as part of Amazon Web Services since 2010. It provides a low-cost infrastructure for mass delivery of messages, predominantly to mobile users. Read more about it [here](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) - ## Task : -- Create a CloudWatch alarm that monitors your billing and send an email to you when a it reaches $2. +- Create a CloudWatch alarm that monitors your billing and send an email to you when a it reaches $2. (You can keep it for your future use) @@ -32,3 +31,5 @@ Need help with Cloudwatch? Check out this [official documentation](https://docs. Keep growing your AWS knowledge💥🙌 Happy Learning! :) + +[← Previous Day](../day45/tasks.md) | [Next Day →](../day47/tasks.md) diff --git a/2023/day47/tasks.md b/2023/day47/tasks.md index 6c05ca3067..cbc4f4d2a8 100644 --- a/2023/day47/tasks.md +++ b/2023/day47/tasks.md @@ -1,6 +1,6 @@ # Day 47: Test Knowledge on aws 💻 📈 -Today, we will be test the aws knowledge on services in AWS, as part of the 90 Days of DevOps Challenge. +Today, we will be test the aws knowledge on services in AWS, as part of the 90 Days of DevOps Challenge. ## Task-01 @@ -9,11 +9,13 @@ Today, we will be test the aws knowledge on services in AWS, as part of the 90 D - Monitor the EC2 instance using Amazon CloudWatch and troubleshoot any issues that arise. ## Task-02 + - Create an Auto Scaling group using the AWS Management Console and configure it to launch EC2 instances in response to changes in demand. - Use Amazon CloudWatch to monitor the performance of the Auto Scaling group and the EC2 instances and troubleshoot any issues that arise. - Use the AWS CLI to view the state of the Auto Scaling group and the EC2 instances and verify that the correct number of instances are running. - We hope that these tasks will give you hands-on experience with aws services and help you understand how these services work together. If you have any questions or face any issues while doing the tasks, please let us know. Happy Learning :) + +[← Previous Day](../day46/tasks.md) | [Next Day →](../day48/tasks.md) diff --git a/2023/day48/tasks.md b/2023/day48/tasks.md index 311d19ba10..066883556d 100644 --- a/2023/day48/tasks.md +++ b/2023/day48/tasks.md @@ -2,7 +2,8 @@ Today will be a great learning for sure. I know many of you may not know about the term "ECS". As you know, 90 Days Of DevOps Challange is mostly about 'learning new' , let's learn then ;) -## What is ECS ? +## What is ECS ? + - ECS (Elastic Container Service) is a fully-managed container orchestration service provided by Amazon Web Services (AWS). It allows you to run and manage Docker containers on a cluster of virtual machines (EC2 instances) without having to manage the underlying infrastructure. With ECS, you can easily deploy, manage, and scale your containerized applications using the AWS Management Console, the AWS CLI, or the API. ECS supports both "Fargate" and "EC2 launch types", which means you can run your containers on AWS-managed infrastructure or your own EC2 instances. @@ -12,6 +13,7 @@ ECS also integrates with other AWS services, such as Elastic Load Balancing, Aut Overall, ECS is a powerful and flexible container orchestration service that can help simplify the deployment and management of containerized applications in AWS. ## Difference between EKS and ECS ? + - EKS (Elastic Kubernetes Service) and ECS (Elastic Container Service) are both container orchestration platforms provided by Amazon Web Services (AWS). While both platforms allow you to run containerized applications in the AWS cloud, there are some differences between the two. **Architecture**: @@ -32,9 +34,7 @@ Kubernetes has a large and active open-source community, which means that EKS be In summary, EKS is a good choice if you want to use Kubernetes to manage your containerized workloads on AWS, while ECS is a good choice if you want a simpler, more managed platform for running your containerized applications. # Task : -Set up ECS (Elastic Container Service) by setting up Nginx on ECS. - - - +Set up ECS (Elastic Container Service) by setting up Nginx on ECS. +[← Previous Day](../day47/tasks.md) | [Next Day →](../day49/tasks.md) diff --git a/2023/day49/tasks.md b/2023/day49/tasks.md index 2c94e34eb9..064743c54e 100644 --- a/2023/day49/tasks.md +++ b/2023/day49/tasks.md @@ -1,15 +1,16 @@ # Day 49 - INTERVIEW QUESTIONS ON AWS -Hey people, we have listened to your suggestions and we are looking forward to get more! +Hey people, we have listened to your suggestions and we are looking forward to get more! As you people have asked to put more interview based questions as part of Daily Task, So here it it :) ## INTERVIEW QUESTIONS: + - Name 5 aws services you have used and what's the use cases? -- What are the tools used to send logs to the cloud environment? -- What are IAM Roles? How do you create /manage them? -- How to upgrade or downgrade a system with zero downtime? -- What is infrastructure as code and how do you use it? -- What is a load balancer? Give scenarios of each kind of balancer based on your experience. +- What are the tools used to send logs to the cloud environment? +- What are IAM Roles? How do you create /manage them? +- How to upgrade or downgrade a system with zero downtime? +- What is infrastructure as code and how do you use it? +- What is a load balancer? Give scenarios of each kind of balancer based on your experience. - What is CloudFormation and why is it used for? - Difference between AWS CloudFormation and AWS Elastic Beanstalk? - What are the kinds of security attacks that can occur on the cloud? And how can we minimize them? @@ -18,6 +19,7 @@ As you people have asked to put more interview based questions as part of Daily - What is the difference between the Amazon Rds, Dynamodb, and Redshift? - Do you prefer to host a website on S3? What's the reason if your answer is either yes or no? - -Let's share your answer on LinkedIn in best possible way thinking you are in a interview table. +Let's share your answer on LinkedIn in best possible way thinking you are in a interview table. Happy Learning !! :) + +[← Previous Day](../day48/tasks.md) | [Next Day →](../day50/tasks.md) diff --git a/2023/day50/tasks.md b/2023/day50/tasks.md index 3e8796ab66..38996774a6 100644 --- a/2023/day50/tasks.md +++ b/2023/day50/tasks.md @@ -8,15 +8,18 @@ What if I tell you, in next 4 days, you'll be making a CI/CD pipeline on AWS wit - CodePipeline - S3 -## What is CodeCommit ? +## What is CodeCommit ? + - CodeCommit is a managed source control service by AWS that allows users to store, manage, and version their source code and artifacts securely and at scale. It supports Git, integrates with other AWS services, enables collaboration through branch and merge workflows, and provides audit logs and compliance reports to meet regulatory requirements and track changes. Overall, CodeCommit provides developers with a reliable and efficient way to manage their codebase and set up a CI/CD pipeline for their software development projects. # Task-01 : + - Set up a code repository on CodeCommit and clone it on your local. - You need to setup GitCredentials in your AWS IAM. - Use those credentials in your local and then clone the repository from CodeCommit # Task-02 : + - Add a new file from local and commit to your local branch - Push the local changes to CodeCommit repository. @@ -24,7 +27,4 @@ For more details watch [this](https://youtu.be/p5i3cMCQ760) video. Happy Learning :) - - - - +[← Previous Day](../day49/tasks.md) | [Next Day →](../day51/tasks.md) diff --git a/2023/day51/tasks.md b/2023/day51/tasks.md index 4544ac0c30..aebdcdf5a4 100644 --- a/2023/day51/tasks.md +++ b/2023/day51/tasks.md @@ -9,22 +9,22 @@ Next few days you'll learn these tools/services: - CodePipeline - S3 -## What is CodeBuild ? +## What is CodeBuild ? + - AWS CodeBuild is a fully managed build service in the cloud. CodeBuild compiles your source code, runs unit tests, and produces artifacts that are ready to deploy. CodeBuild eliminates the need to provision, manage, and scale your own build servers. # Task-01 : + - Read about Buildspec file for Codebuild. - create a simple index.html file in CodeCommit Repository - you have to build the index.html using nginx server # Task-02 : + - Add buildspec.yaml file to CodeCommit Repository and complete the build process. For more details watch [this](https://youtu.be/p5i3cMCQ760) video. Happy Learning :) - - - - +[← Previous Day](../day50/tasks.md) | [Next Day →](../day52/tasks.md) diff --git a/2023/day52/tasks.md b/2023/day52/tasks.md index c26b7221b2..718295f816 100644 --- a/2023/day52/tasks.md +++ b/2023/day52/tasks.md @@ -8,25 +8,24 @@ Next few days you'll learn these tools/services: - CodePipeline - S3 -## What is CodeDeploy ? -- AWS CodeDeploy is a deployment service that automates application deployments to Amazon EC2 instances, on-premises instances, serverless Lambda functions, or Amazon ECS services. +## What is CodeDeploy ? +- AWS CodeDeploy is a deployment service that automates application deployments to Amazon EC2 instances, on-premises instances, serverless Lambda functions, or Amazon ECS services. CodeDeploy can deploy application content that runs on a server and is stored in Amazon S3 buckets, GitHub repositories, or Bitbucket repositories. CodeDeploy can also deploy a serverless Lambda function. You do not need to make changes to your existing code before you can use CodeDeploy. # Task-01 : + - Read about Appspec.yaml file for CodeDeploy. - Deploy index.html file on EC2 machine using nginx - you have to setup a CodeDeploy agent in order to deploy code on EC2 # Task-02 : + - Add appspec.yaml file to CodeCommit Repository and complete the deployment process. For more details watch [this](https://youtu.be/IUF-pfbYGvg) video. Happy Learning :) - - - - +[← Previous Day](../day51/tasks.md) | [Next Day →](../day53/tasks.md) diff --git a/2023/day53/tasks.md b/2023/day53/tasks.md index 27ee2502c8..d280debec7 100644 --- a/2023/day53/tasks.md +++ b/2023/day53/tasks.md @@ -4,13 +4,13 @@ On your journey of making a CI/CD pipeline on AWS with these tools, you complete Finish Off in style with AWS CodePipeline +## What is CodePipeline ? -## What is CodePipeline ? - CodePipeline builds, tests, and deploys your code every time there is a code change, based on the release process models you define. -Think of it as a CI/CD Pipeline service - + Think of it as a CI/CD Pipeline service # Task-01 : + - Create a Deployment group of Ec2 Instance. - Create a CodePipeline that gets the code from CodeCommit, Builds the code using CodeBuild and deploys it to a Deployment Group. @@ -18,7 +18,4 @@ For more details watch [this](https://youtu.be/IUF-pfbYGvg) video. Happy Learning :) - - - - +[← Previous Day](../day52/tasks.md) | [Next Day →](../day54/tasks.md) diff --git a/2023/day54/tasks.md b/2023/day54/tasks.md index cf037be2a6..2e11602666 100644 --- a/2023/day54/tasks.md +++ b/2023/day54/tasks.md @@ -14,4 +14,6 @@ Throughout the lifecycle of a product, Configuration Management (CM) ensures tha Write a blog on this topic in the most creative way and post it on linkedIn :) -happy learning... \ No newline at end of file +happy learning... + +[← Previous Day](../day53/tasks.md) | [Next Day →](../day55/tasks.md) diff --git a/2023/day55/tasks.md b/2023/day55/tasks.md index 3a727c7bf1..ae5c1bd7c9 100644 --- a/2023/day55/tasks.md +++ b/2023/day55/tasks.md @@ -4,15 +4,16 @@ Ansible is an open-source automation tool, or platform, used for IT tasks such as configuration management, application deployment, intraservice orchestration, and provisioning -# Task-01 +# Task-01 + - Installation of Ansible on AWS EC2 (Master Node) -`sudo apt-add-repository ppa:ansible/ansible` `sudo apt update` -`sudo apt install ansible` + `sudo apt-add-repository ppa:ansible/ansible` `sudo apt update` + `sudo apt install ansible` -# Task-02 -- read more about Hosts file -`sudo nano /etc/ansible/hosts ansible-inventory --list -y` +# Task-02 +- read more about Hosts file + `sudo nano /etc/ansible/hosts ansible-inventory --list -y` # Task-03 @@ -20,7 +21,8 @@ Ansible is an open-source automation tool, or platform, used for IT tasks such a - Copy the private key to master server where Ansible is setup - Try a ping command using ansible to the Nodes. - Write a blog on this topic with screenshots in the most creative way and post it on linkedIn :) -happy learning... \ No newline at end of file +happy learning... + +[← Previous Day](../day54/tasks.md) | [Next Day →](../day56/tasks.md) diff --git a/2023/day56/tasks.md b/2023/day56/tasks.md index bdb95b6670..6c3396f0b8 100644 --- a/2023/day56/tasks.md +++ b/2023/day56/tasks.md @@ -13,4 +13,6 @@ Ansible ad hoc commands come handy when you want to perform a quick task. - You can refer to [this](https://www.middlewareinventory.com/blog/ansible-ad-hoc-commands/) blog to understand the different examples of ad-hoc commands and try out them, post the screenshots in a blog with an explanation. -happy Learning :) \ No newline at end of file +happy Learning :) + +[← Previous Day](../day55/tasks.md) | [Next Day →](../day57/tasks.md) diff --git a/2023/day57/tasks.md b/2023/day57/tasks.md index 5f3d8cd2f1..1264d75ef3 100644 --- a/2023/day57/tasks.md +++ b/2023/day57/tasks.md @@ -8,5 +8,6 @@ Let's make it fun now, by using a video explanation for Ansible. - Write a Blog explanation for the [ansible video](https://youtu.be/SGB7EdiP39E) +happy Learning :) -happy Learning :) \ No newline at end of file +[← Previous Day](../day56/tasks.md) | [Next Day →](../day58/tasks.md) diff --git a/2023/day58/tasks.md b/2023/day58/tasks.md index f59b59184d..d0f04dc665 100644 --- a/2023/day58/tasks.md +++ b/2023/day58/tasks.md @@ -18,4 +18,6 @@ Watch [this](https://youtu.be/089mRKoJTzo) video to learn about ansible Playbook Let me or anyone in the community know if you face any challenges -happy Learning :) \ No newline at end of file +happy Learning :) + +[← Previous Day](../day57/tasks.md) | [Next Day →](../day59/tasks.md) diff --git a/2023/day59/tasks.md b/2023/day59/tasks.md index deabdbacd7..3dbae2b85e 100644 --- a/2023/day59/tasks.md +++ b/2023/day59/tasks.md @@ -19,8 +19,8 @@ What if you deploy a simple web app using ansible, sounds like a good project, r Read [this](https://medium.com/@sandeep010498/learn-ansible-with-real-time-project-cf6a0a512d45) Blog by [Sandeep Singh](https://medium.com/@sandeep010498) to clear all your doubts - - Let me or anyone in the community know if you face any challenges -happy Learning :) \ No newline at end of file +happy Learning :) + +[← Previous Day](../day58/tasks.md) | [Next Day →](../day60/tasks.md) diff --git a/2023/day60/tasks.md b/2023/day60/tasks.md index 9ae7ca2bcb..1a9b3edcf6 100644 --- a/2023/day60/tasks.md +++ b/2023/day60/tasks.md @@ -1,15 +1,19 @@ # Day 60 - Terraform🔥 + Hello Learners , you guys are doing every task by creating an ec2 instance (mostly). Today let’s automate this process . How to do it ? Well Terraform is the solution . + ## What is Terraform? - Terraform is an infrastructure as code (IaC) tool that allows you to create, manage, and update infrastructure - resources such as virtual machines, networks, and storage in a repeatable, scalable, and automated way. +Terraform is an infrastructure as code (IaC) tool that allows you to create, manage, and update infrastructure +resources such as virtual machines, networks, and storage in a repeatable, scalable, and automated way. ## Task 1: + Install Terraform on your system -Refer this [link](https://phoenixnap.com/kb/how-to-install-terraform) for installation +Refer this [link](https://phoenixnap.com/kb/how-to-install-terraform) for installation ## Task 2: Answer below questions + - Why we use terraform? - What is Infrastructure as Code (IaC)? - What is Resource? @@ -23,3 +27,5 @@ We Hope this tasks will help you understand how to write a basic Terraform confi Don’t forget to post in on LinkedIn. Happy Learning:) + +[← Previous Day](../day59/tasks.md) | [Next Day →](../day61/tasks.md) diff --git a/2023/day61/tasks.md b/2023/day61/tasks.md index 432b09761e..982e3cb918 100644 --- a/2023/day61/tasks.md +++ b/2023/day61/tasks.md @@ -3,10 +3,9 @@ Hope you've already got the gist of What Working with Terraform would be like . Lets begin with day 2 of Terraform ! - - ## Task 1: -find purpose of basic Terraform commands which you'll use often + +find purpose of basic Terraform commands which you'll use often 1. `terraform init` @@ -22,8 +21,6 @@ find purpose of basic Terraform commands which you'll use often 7. `terraform destroy` - - Also along with these tasks its important to know about Terraform in general- Who are Terraform's main competitors? The main competitors are: @@ -36,3 +33,5 @@ Kubernetes Want a Free video Course for terraform? Click [here](https://bit.ly/tws-terraform) Don't forget to share your learnings on Linkedin ! Happy Learning :) + +[← Previous Day](../day60/tasks.md) | [Next Day →](../day62/tasks.md) diff --git a/2023/day62/tasks.md b/2023/day62/tasks.md index 496f819f2b..b80639d543 100644 --- a/2023/day62/tasks.md +++ b/2023/day62/tasks.md @@ -3,11 +3,12 @@ Terraform needs to be told which provider to be used in the automation, hence we need to give the provider name with source and version. For Docker, we can use this block of code in your main.tf -## Blocks and Resources in Terraform +## Blocks and Resources in Terraform ## Terraform block ## Task-01 + - Create a Terraform script with Blocks and Resources ``` @@ -20,9 +21,11 @@ terraform { } } ``` + ### Note: kreuzwerker/docker, is shorthand for registry.terraform.io/kreuzwerker/docker. ## Provider Block + The provider block configures the specified provider, in this case, docker. A provider is a plugin that Terraform uses to create and manage your resources. ``` @@ -30,20 +33,24 @@ provider "docker" {} ``` ## Resource + Use resource blocks to define components of your infrastructure. A resource might be a physical or virtual component such as a Docker container, or it can be a logical resource such as a Heroku application. Resource blocks have two strings before the block: the resource type and the resource name. In this example, the first resource type is docker_image and the name is Nginx. -## Task-02 +## Task-02 + - Create a resource Block for an nginx docker image -Hint: +Hint: + ``` resource "docker_image" "nginx" { name = "nginx:latest" keep_locally = false } ``` + - Create a resource Block for running a docker container for nginx ``` @@ -68,3 +75,5 @@ Note: In case Docker is not installed I can imagine, Terraform can be tricky, so best to use a Free video Course for terraform [here](https://bit.ly/tws-terraform) Happy Learning :) + +[← Previous Day](../day61/tasks.md) | [Next Day →](../day63/tasks.md) diff --git a/2023/day63/tasks.md b/2023/day63/tasks.md index 282a77f776..415e6526e7 100644 --- a/2023/day63/tasks.md +++ b/2023/day63/tasks.md @@ -9,17 +9,20 @@ variable "filename" { default = "/home/ubuntu/terrform-tutorials/terraform-variables/demo-var.txt" } ``` + ``` variable "content" { default = "This is coming from a variable which was updated" } ``` + These variables can be accessed by var object in main.tf ## Task-01 - Create a local file using Terraform -Hint: + Hint: + ``` resource "local_file" "devops" { filename = var.filename @@ -30,6 +33,7 @@ content = var.content ## Data Types in Terraform ## Map + ``` variable "file_contents" { type = map @@ -40,21 +44,19 @@ default = { } ``` -## Task-02 +## Task-02 - Use terraform to demonstrate usage of List, Set and Object datatypes - Put proper screenshots of the outputs - Use `terraform refresh` To refresh the state by your configuration file, reloads the variables - - - # Video Course I can imagine, Terraform can be tricky, so best to use a Free video Course for terraform [here](https://bit.ly/tws-terraform) Happy Learning :) + +[← Previous Day](../day62/tasks.md) | [Next Day →](../day64/tasks.md) diff --git a/2023/day64/tasks.md b/2023/day64/tasks.md index 33a01e89e3..9b27c12be6 100644 --- a/2023/day64/tasks.md +++ b/2023/day64/tasks.md @@ -2,17 +2,17 @@ Provisioning on AWS is quite easy and straightforward with Terraform. - ## Prerequisites -### AWS CLI installed + +### AWS CLI installed The AWS Command Line Interface (AWS CLI) is a unified tool to manage your AWS services. With just one tool to download and configure, you can control multiple AWS services from the command line and automate them through scripts. -### AWS IAM user +### AWS IAM user IAM (Identity Access Management) AWS Identity and Access Management (IAM) is a web service that helps you securely control access to AWS resources. You use IAM to control who is authenticated (signed in) and authorized (has permissions) to use resources. -*In order to connect your AWS account and Terraform, you need the access keys and secret access keys exported to your machine.* +_In order to connect your AWS account and Terraform, you need the access keys and secret access keys exported to your machine._ ``` export AWS_ACCESS_KEY_ID= @@ -32,7 +32,9 @@ terraform { required_version = ">= 1.2.0" } ``` + Add the region where you want your instances to be + ``` provider "aws" { region = "us-east-1" @@ -43,7 +45,7 @@ region = "us-east-1" - Provision an AWS EC2 instance using Terraform -Hint: +Hint: ``` resource "aws_instance" "aws_ec2_test" { @@ -62,3 +64,4 @@ I can imagine, Terraform can be tricky, so best to use a Free video Course for t Happy Learning :) +[← Previous Day](../day63/tasks.md) | [Next Day →](../day65/tasks.md) diff --git a/2023/day65/tasks.md b/2023/day65/tasks.md index 85d342d854..7cd99ebc76 100644 --- a/2023/day65/tasks.md +++ b/2023/day65/tasks.md @@ -1,15 +1,19 @@ # Day 65 - Working with Terraform Resources 🚀 + Yesterday, we saw how to create a Terraform script with Blocks and Resources. Today, we will dive deeper into Terraform resources. ## Understanding Terraform Resources + A resource in Terraform represents a component of your infrastructure, such as a physical server, a virtual machine, a DNS record, or an S3 bucket. Resources have attributes that define their properties and behaviors, such as the size and location of a virtual machine or the domain name of a DNS record. When you define a resource in Terraform, you specify the type of resource, a unique name for the resource, and the attributes that define the resource. Terraform uses the resource block to define resources in your Terraform configuration. ## Task 1: Create a security group + To allow traffic to the EC2 instance, you need to create a security group. Follow these steps: In your main.tf file, add the following code to create a security group: + ``` resource "aws_security_group" "web_server" { name_prefix = "web-server-sg" @@ -22,14 +26,17 @@ resource "aws_security_group" "web_server" { } } ``` + - Run terraform init to initialize the Terraform project. - Run terraform apply to create the security group. ## Task 2: Create an EC2 instance + - Now you can create an EC2 instance with Terraform. Follow these steps: - In your main.tf file, add the following code to create an EC2 instance: + ``` resource "aws_instance" "web_server" { ami = "ami-0557a15b87f6559cf" @@ -46,11 +53,15 @@ resource "aws_instance" "web_server" { EOF } ``` + Note: Replace the ami and key_name values with your own. You can find a list of available AMIs in the AWS documentation. Run terraform apply to create the EC2 instance. ## Task 3: Access your website + - Now that your EC2 instance is up and running, you can access the website you just hosted on it. Follow these steps: Happy Terraforming! + +[← Previous Day](../day64/tasks.md) | [Next Day →](../day66/tasks.md) diff --git a/2023/day66/tasks.md b/2023/day66/tasks.md index a686c57e12..795c3a4927 100644 --- a/2023/day66/tasks.md +++ b/2023/day66/tasks.md @@ -5,6 +5,7 @@ Welcome back to your Terraform journey. In the previous tasks, you have learned about the basics of Terraform, its configuration file, and creating an EC2 instance using Terraform. Today, we will explore more about Terraform and create multiple resources. ## Task: + - Create a VPC (Virtual Private Cloud) with CIDR block 10.0.0.0/16 - Create a public subnet with CIDR block 10.0.1.0/24 in the above VPC. - Create a private subnet with CIDR block 10.0.2.0/24 in the above VPC. @@ -18,6 +19,8 @@ In the previous tasks, you have learned about the basics of Terraform, its confi - Create an Elastic IP and associate it with the EC2 instance. - Open the website URL in a browser to verify that the website is hosted successfully. -#### This Terraform hands-on task is designed to test your proficiency in using Terraform for Infrastructure as Code (IaC) on AWS. You will be tasked with creating a VPC, subnets, an internet gateway, and launching an EC2 instance with a web server running on it. This task will showcase your skills in automating infrastructure deployment using Terraform. It's a popular interview question for companies looking for candidates with hands-on experience in Terraform. That's it for today. +#### This Terraform hands-on task is designed to test your proficiency in using Terraform for Infrastructure as Code (IaC) on AWS. You will be tasked with creating a VPC, subnets, an internet gateway, and launching an EC2 instance with a web server running on it. This task will showcase your skills in automating infrastructure deployment using Terraform. It's a popular interview question for companies looking for candidates with hands-on experience in Terraform. That's it for today. Happy Terraforming:) + +[← Previous Day](../day65/tasks.md) | [Next Day →](../day67/tasks.md) diff --git a/2023/day67/tasks.md b/2023/day67/tasks.md index af5d810aae..d5467b3b75 100644 --- a/2023/day67/tasks.md +++ b/2023/day67/tasks.md @@ -1,4 +1,5 @@ # Day 67: AWS S3 Bucket Creation and Management + ## AWS S3 Bucket Amazon S3 (Simple Storage Service) is an object storage service that offers industry-leading scalability, data availability, security, and performance. It can be used for a variety of use cases, such as storing and retrieving data, hosting static websites, and more. @@ -6,6 +7,7 @@ Amazon S3 (Simple Storage Service) is an object storage service that offers indu In this task, you will learn how to create and manage S3 buckets in AWS. ## Task + - Create an S3 bucket using Terraform. - Configure the bucket to allow public read access. - Create an S3 bucket policy that allows read-only access to a specific IAM user or role. @@ -16,3 +18,5 @@ In this task, you will learn how to create and manage S3 buckets in AWS. [Terraform S3 bucket resource](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket) Good luck and happy learning! + +[← Previous Day](../day66/tasks.md) | [Next Day →](../day68/tasks.md) diff --git a/2023/day68/tasks.md b/2023/day68/tasks.md index ee53e04797..26a335ca7a 100644 --- a/2023/day68/tasks.md +++ b/2023/day68/tasks.md @@ -1,15 +1,19 @@ # Day 68 - Scaling with Terraform 🚀 + Yesterday, we learned how to AWS S3 Bucket with Terraform. Today, we will see how to scale our infrastructure with Terraform. ## Understanding Scaling + Scaling is the process of adding or removing resources to match the changing demands of your application. As your application grows, you will need to add more resources to handle the increased load. And as the load decreases, you can remove the extra resources to save costs. Terraform makes it easy to scale your infrastructure by providing a declarative way to define your resources. You can define the number of resources you need and Terraform will automatically create or destroy the resources as needed. ## Task 1: Create an Auto Scaling Group + Auto Scaling Groups are used to automatically add or remove EC2 instances based on the current demand. Follow these steps to create an Auto Scaling Group: - In your main.tf file, add the following code to create an Auto Scaling Group: + ``` resource "aws_launch_configuration" "web_server_as" { image_id = "ami-005f9685cb30f234b" @@ -39,8 +43,8 @@ resource "aws_autoscaling_group" "web_server_asg" { - Run terraform apply to create the Auto Scaling Group. - ## Task 2: Test Scaling + - Go to the AWS Management Console and select the Auto Scaling Groups service. - Select the Auto Scaling Group you just created and click on the "Edit" button. @@ -58,3 +62,5 @@ resource "aws_autoscaling_group" "web_server_asg" { Congratulations🎊🎉 You have successfully scaled your infrastructure with Terraform. Happy Learning :) + +[← Previous Day](../day67/tasks.md) | [Next Day →](../day69/tasks.md) diff --git a/2023/day69/tasks.md b/2023/day69/tasks.md index 4fa53e9de3..d180d258c8 100644 --- a/2023/day69/tasks.md +++ b/2023/day69/tasks.md @@ -1,32 +1,17 @@ - # Day 69 - Meta-Arguments in Terraform - - When you define a resource block in Terraform, by default, this specifies one resource that will be created. To manage several of the same resources, you can use either count or for_each, which removes the need to write a separate block of code for each one. Using these options reduces overhead and makes your code neater. - - count is what is known as a ‘meta-argument’ defined by the Terraform language. Meta-arguments help achieve certain requirements within the resource block. - - ## Count - - The count meta-argument accepts a whole number and creates the number of instances of the resource specified. - - When each instance is created, it has its own distinct infrastructure object associated with it, so each can be managed separately. When the configuration is applied, each object can be created, destroyed, or updated as appropriate. - - eg. - - ``` terraform { @@ -47,7 +32,7 @@ required_version = ">= 1.2.0" } - + provider "aws" { @@ -55,19 +40,19 @@ region = "us-east-1" } - + resource "aws_instance" "server" { count = 4 - + ami = "ami-08c40ec9ead489470" instance_type = "t2.micro" - + tags = { @@ -77,21 +62,14 @@ Name = "Server ${count.index}" } - -``` - +``` ## for_each - - Like the count argument, the for_each meta-argument creates multiple instances of a module or resource block. However, instead of specifying the number of resources, the for_each meta-argument accepts a map or a set of strings. This is useful when multiple resources are required that have different values. Consider our Active directory groups example, with each group requiring a different owner. - - - ``` terraform { @@ -112,7 +90,7 @@ required_version = ">= 1.2.0" } - + provider "aws" { @@ -120,7 +98,7 @@ region = "us-east-1" } - + locals { @@ -134,13 +112,13 @@ ami_ids = toset([ } - + resource "aws_instance" "server" { for_each = local.ami_ids - + ami = each.key @@ -154,7 +132,7 @@ Name = "Server ${each.key}" } - + Multiple key value iteration @@ -170,19 +148,19 @@ ami_ids = { } - + resource "aws_instance" "server" { for_each = local.ami_ids - + ami = each.value instance_type = "t2.micro" - + tags = { @@ -194,11 +172,11 @@ Name = "Server ${each.key}" ``` - - ## Task-01 - Create the above Infrastructure as code and demonstrate the use of Count and for_each. - Write about meta-arguments and its use in Terraform. -Happy learning :) \ No newline at end of file +Happy learning :) + +[← Previous Day](../day68/tasks.md) | [Next Day →](../day70/tasks.md) diff --git a/2023/day70/tasks.md b/2023/day70/tasks.md index a2ab69473c..8d93a46d7b 100644 --- a/2023/day70/tasks.md +++ b/2023/day70/tasks.md @@ -1,22 +1,23 @@ # Day 70 - Terraform Modules - Modules are containers for multiple resources that are used together. A module consists of a collection of .tf and/or .tf.json files kept together in a directory -- A module can call other modules, which lets you include the child module's resources into the configuration in a concise way. +- A module can call other modules, which lets you include the child module's resources into the configuration in a concise way. - Modules can also be called multiple times, either within the same configuration or in separate configurations, allowing resource configurations to be packaged and re-used. ### Below is the format on how to use modules: + ``` # Creating a AWS EC2 Instance resource "aws_instance" "server-instance" { # Define number of instance instance_count = var.number_of_instances - + # Instance Configuration ami = var.ami instance_type = var.instance_type subnet_id = var.subnet_id vpc_security_group_ids = var.security_group - + # Instance Tagsid tags = { Name = "${var.instance_name}" @@ -31,24 +32,24 @@ variable "number_of_instances" { type = number default = 1 } - + variable "instance_name" { description = "Instance Name" } - + variable "ami" { description = "AMI ID" default = "ami-xxxx" } - + variable "instance_type" { description = "Instance Type" } - + variable "subnet_id" { description = "Subnet ID" } - + variable "security_group" { description = "Security Group" type = list(any) @@ -67,12 +68,13 @@ output "server_id" { ## Task-01 Explain the below in your own words and it shouldnt be copied from Internet 😉 + - Write about different modules Terraform. - Difference between Root Module and Child Module. - Is modules and Namespaces are same? Justify your answer for both Yes/No - - You all are doing great, and you have come so far. Well Done Everyone🎉 Thode mehnat aur krni hai bas to lge rho tab tak.....Happy learning :) + +[← Previous Day](../day69/tasks.md) | [Next Day →](../day71/tasks.md) diff --git a/2023/day71/tasks.md b/2023/day71/tasks.md index 5d163104e2..0be7811229 100644 --- a/2023/day71/tasks.md +++ b/2023/day71/tasks.md @@ -1,10 +1,14 @@ # Day 71 - Let's prepare for some interview questions of Terraform 🔥 ### 1. What is Terraform and how it is different from other IaaC tools? + ### 2. How do you call a main.tf module? + ### 3. What exactly is Sentinel? Can you provide few examples where we can use for Sentinel policies? + ### 4. You have a Terraform configuration file that defines an infrastructure deployment. However, there are multiple instances of the same resource that need to be created. How would you modify the configuration file to achieve this? -### 5. You want to know from which paths Terraform is loading providers referenced in your Terraform configuration (*.tf files). You need to enable debug messages to find this out. Which of the following would achieve this? + +### 5. You want to know from which paths Terraform is loading providers referenced in your Terraform configuration (\*.tf files). You need to enable debug messages to find this out. Which of the following would achieve this? A. Set the environment variable TF_LOG=TRACE @@ -14,23 +18,24 @@ C. Set the environment variable TF_VAR_log=TRACE D. Set the environment variable TF_LOG_PATH - ### 6. Below command will destroy everything that is being created in the infrastructure. Tell us how would you save any particular resource while destroying the complete infrastructure. ``` terraform destroy ``` - ### 7. Which module is used to store .tfstate file in S3? -### 8. How do you manage sensitive data in Terraform, such as API keys or passwords? -### 9. You are working on a Terraform project that needs to provision an S3 bucket, and a user with read and write access to the bucket. What resources would you use to accomplish this, and how would you configure them? -### 10. Who maintains Terraform providers? -### 11. How can we export data from one module to another? +### 8. How do you manage sensitive data in Terraform, such as API keys or passwords? +### 9. You are working on a Terraform project that needs to provision an S3 bucket, and a user with read and write access to the bucket. What resources would you use to accomplish this, and how would you configure them? +### 10. Who maintains Terraform providers? +### 11. How can we export data from one module to another? # + Waiting for your responses😉.....Till then Happy learning :) + +[← Previous Day](../day70/tasks.md) | [Next Day →](../day72/tasks.md) diff --git a/2023/day72/tasks.md b/2023/day72/tasks.md index ddde6eedee..e947278d34 100644 --- a/2023/day72/tasks.md +++ b/2023/day72/tasks.md @@ -1,13 +1,16 @@ Day 72 - Grafana🔥 -Hello Learners , you guys are doing really a good job. You will not be there 24*7 to monitor your resources. So, Today let’s monitor the resources in a smart way with - Grafana 🎉 +Hello Learners , you guys are doing really a good job. You will not be there 24\*7 to monitor your resources. So, Today let’s monitor the resources in a smart way with - Grafana 🎉 + +## Task 1: -Task 1: -------------------------------------------------------------------------------------------------------------- > What is Grafana? What are the features of Grafana? > Why Grafana? > What type of monitoring can be done via Grafana? > What databases work with Grafana? > What are metrics and visualizations in Grafana? > What is the difference between Grafana vs Prometheus? -------------------------------------------------------------------------------------------------------------- + +--- + +[← Previous Day](../day71/tasks.md) | [Next Day →](../day73/tasks.md) diff --git a/2023/day73/tasks.md b/2023/day73/tasks.md index c683a0099f..95877a876a 100644 --- a/2023/day73/tasks.md +++ b/2023/day73/tasks.md @@ -3,11 +3,14 @@ Hope you are now clear with the basics of grafana, like why we use, where we use Now, let's do some practical stuff. --------------------------------------------------------------------------------------------------------------------- +--- + Task: > Setup grafana in your local environment on AWS EC2. --------------------------------------------------------------------------------------------------------------------- +--- Ref: https://www.linkedin.com/posts/chetanrakhra_devops-project-share-activity-7042518379030556672-ZZA-?utm_source=share&utm_medium=member_desktop + +[← Previous Day](../day72/tasks.md) | [Next Day →](../day74/tasks.md) diff --git a/2023/day74/tasks.md b/2023/day74/tasks.md index db9af05362..7b50f083bc 100644 --- a/2023/day74/tasks.md +++ b/2023/day74/tasks.md @@ -4,14 +4,16 @@ You guys did amazing job last day setting up Grafana on Local 🔥. Now, let's do one step ahead. ------------------------------------------------------------------------------- +--- + Task: Connect an Linux and one Windows EC2 instance with Grafana and monitor the different components of the server. ------------------------------------------------------------------------------- +--- Don't forget to share this amazing work over LinkedIn and Tag us. ## Happy Learning :) +[← Previous Day](../day73/tasks.md) | [Next Day →](../day75/tasks.md) diff --git a/2023/day75/tasks.md b/2023/day75/tasks.md index 2d95f2059d..030d37cbfa 100644 --- a/2023/day75/tasks.md +++ b/2023/day75/tasks.md @@ -2,29 +2,29 @@ We have monitored ,😉 that you guys are understanding and doing amazing with monitoring tool. 👌 - Today, make it little bit more complex but interesting 😍 and let's add one more **Project** 🔥 to your resume. ------------------------------------------------------------------------------- +--- + ## Task: -- Install *Docker* and start docker service on a Linux EC2 through [USER DATA](https://github.com/LondheShubham153/90DaysOfDevOps/blob/0999394e87192863b5c190a90896249c31ce31af/2023/day39/tasks.md) . +- Install _Docker_ and start docker service on a Linux EC2 through [USER DATA](https://github.com/LondheShubham153/90DaysOfDevOps/blob/0999394e87192863b5c190a90896249c31ce31af/2023/day39/tasks.md) . - Create 2 Docker containers and run any basic application on those containers (A simple todo app will work). - Now intregrate the docker containers and share the real time logs with Grafana (Your Instance should be connected to Grafana and Docker plugin should be enabled on grafana). - Check the logs or docker container name on Grafana UI. ------------------------------------------------------------------------------- - +--- You can use [this video](https://youtu.be/y3SGHbixmJw) for your refernce. But it's always better to find your own way of doing. 😊 - ## Bonus : -- As you have done this amazing task, here is one bonus link.❤️ -## You can use this [refernce video](https://youtu.be/CCi957AnSfc) to intregrate *Prometheus* with *Grafana* and monitor Docker containers. Seems interesting ? +- As you have done this amazing task, here is one bonus link.❤️ +## You can use this [refernce video](https://youtu.be/CCi957AnSfc) to intregrate _Prometheus_ with _Grafana_ and monitor Docker containers. Seems interesting ? Don't forget to share this amazing work over LinkedIn and Tag us. ## Happy Learning :) + +[← Previous Day](../day74/tasks.md) | [Next Day →](../day76/tasks.md) diff --git a/2023/day76/tasks.md b/2023/day76/tasks.md index 9202cf3f6e..984bc8cfad 100644 --- a/2023/day76/tasks.md +++ b/2023/day76/tasks.md @@ -7,13 +7,14 @@ Dashboards consist of panels, each representing a part of the story you want you Every panel consists of a query and a visualization. The query defines what data you want to display, whereas the visualization defines how the data is displayed. ## Task 01 + - In the sidebar, hover your cursor over the Create (plus sign) icon and then click Dashboard. - Click Add a new panel. - In the Query editor below the graph, enter the query from earlier and then press Shift + Enter: -```sum(rate(tns_request_duration_seconds_count[5m])) by(route)``` +`sum(rate(tns_request_duration_seconds_count[5m])) by(route)` - In the Legend field, enter {{route}} to rename the time series in the legend. The graph legend updates when you click outside the field. @@ -27,4 +28,6 @@ Every panel consists of a query and a visualization. The query defines what data Read [this](https://grafana.com/tutorials/grafana-fundamentals/) in case you have any questions -Do share some amazing Dashboards with the community \ No newline at end of file +Do share some amazing Dashboards with the community + +[← Previous Day](../day75/tasks.md) | [Next Day →](../day77/tasks.md) diff --git a/2023/day77/tasks.md b/2023/day77/tasks.md index 76556664d3..fb7cbeb045 100644 --- a/2023/day77/tasks.md +++ b/2023/day77/tasks.md @@ -5,8 +5,10 @@ Grafana Alerting allows you to learn about problems in your systems moments afte Grafana Alerting is available for Grafana OSS, Grafana Enterprise, or Grafana Cloud. With Mimir and Loki alert rules you can run alert expressions closer to your data and at massive scale, all managed by the Grafana UI you are already familiar with. ## Task-01 + - Setup [Grafana cloud](https://grafana.com/products/cloud/) -- Setup sample alerting +- Setup sample alerting -Check out [this blog](https://grafana.com/docs/grafana/latest/alerting/) for more details +Check out [this blog](https://grafana.com/docs/grafana/latest/alerting/) for more details +[← Previous Day](../day76/tasks.md) | [Next Day →](../day78/tasks.md) diff --git a/2023/day78/tasks.md b/2023/day78/tasks.md index 68a740b7da..9fb615d12b 100644 --- a/2023/day78/tasks.md +++ b/2023/day78/tasks.md @@ -1,13 +1,14 @@ Day - 78 (Grafana Cloud) ------------------------------------------------------------------------------------------------------------- - +--- Task - 01 + 1. Setup alerts for EC2 instance. 2. Setup alerts for AWS Billing Alerts. - ------------------------------------------------------------------------------------------------------------- +--- For Reference: https://www.linkedin.com/posts/chetanrakhra_devops-project-share-activity-7044695663913148416-LfvD?utm_source=share&utm_medium=member_desktop + +[← Previous Day](../day77/tasks.md) | [Next Day →](../day79/tasks.md) diff --git a/2023/day79/tasks.md b/2023/day79/tasks.md index 18f4ccae80..7df8bd1a78 100644 --- a/2023/day79/tasks.md +++ b/2023/day79/tasks.md @@ -5,7 +5,7 @@ It's an open-source system for monitoring services and alerts based on a time se Tasks: ---------------------------------------------------------------------------------------------------------------------------------------------------------- +--- 1. What is the Architecture of Prometheus Monitoring? 2. What are the Features of Prometheus? @@ -13,6 +13,8 @@ Tasks: 4. What database is used by Prometheus? 5. What is the default data retention period in Prometheus? ---------------------------------------------------------------------------------------------------------------------------------------------------------- +--- Ref: https://www.devopsschool.com/blog/top-50-prometheus-interview-questions-and-answers/ + +[← Previous Day](../day78/tasks.md) | [Next Day →](../day80/tasks.md) diff --git a/2023/day80/tasks.md b/2023/day80/tasks.md index a65b015a9f..9524f97e09 100644 --- a/2023/day80/tasks.md +++ b/2023/day80/tasks.md @@ -1,17 +1,15 @@ # Project-1 + ========= # Project Description - The project aims to automate the building, testing, and deployment process of a web application using Jenkins and GitHub. The Jenkins pipeline will be triggered automatically by GitHub webhook integration when changes are made to the code repository. The pipeline will include stages such as building, testing, and deploying the application, with notifications and alerts for failed builds or deployments. - ## Task-01 - Do the hands-on Project, read [this](https://www.linkedin.com/posts/chetanrakhra_devops-project-share-activity-7011367641952993281-DHn5?utm_source=share&utm_medium=member_desktop) +Happy Learning :) - -Happy Learning :) \ No newline at end of file +[← Previous Day](../day79/tasks.md) | [Next Day →](../day81/tasks.md) diff --git a/2023/day81/tasks.md b/2023/day81/tasks.md index f00123df6b..62c459fd51 100644 --- a/2023/day81/tasks.md +++ b/2023/day81/tasks.md @@ -1,17 +1,15 @@ # Project-2 + ========= # Project Description - The project is about automating the deployment process of a web application using Jenkins and its declarative syntax. The pipeline includes stages like building, testing, and deploying to a staging environment. It also includes running acceptance tests and deploying to production if all tests pass. - ## Task-01 - Do the hands-on Project, read [this](https://www.linkedin.com/posts/chetanrakhra_devops-project-share-activity-7014971330496212992-6Q2m?utm_source=share&utm_medium=member_desktop) +Happy Learning :) - -Happy Learning :) \ No newline at end of file +[← Previous Day](../day80/tasks.md) | [Next Day →](../day82/tasks.md) diff --git a/2023/day82/tasks.md b/2023/day82/tasks.md index e99ef9e0b2..b1b1c4d5bb 100644 --- a/2023/day82/tasks.md +++ b/2023/day82/tasks.md @@ -1,17 +1,15 @@ # Project-3 + ========= # Project Description - The project involves hosting a static website using an AWS S3 bucket. Amazon S3 is an object storage service that provides a simple web services interface to store and retrieve any amount of data. The website files will be uploaded to an S3 bucket and configured to function as a static website. The bucket will be configured with the appropriate permissions and a unique domain name, making the website publicly accessible. Overall, the project aims to leverage the benefits of AWS S3 to host and scale a static website in a cost-effective and scalable manner. - ## Task-01 - Do the hands-on Project, read [this](https://www.linkedin.com/posts/chetanrakhra_aws-project-devopsjobs-activity-7016427742300663808-JAQd?utm_source=share&utm_medium=member_desktop) +Happy Learning :) - -Happy Learning :) \ No newline at end of file +[← Previous Day](../day81/tasks.md) | [Next Day →](../day83/tasks.md) diff --git a/2023/day83/tasks.md b/2023/day83/tasks.md index 36701dea81..cf7db513a5 100644 --- a/2023/day83/tasks.md +++ b/2023/day83/tasks.md @@ -1,17 +1,15 @@ # Project-4 + ========= # Project Description - The project aims to deploy a web application using Docker Swarm, a container orchestration tool that allows for easy management and scaling of containerized applications. The project will utilize Docker Swarm's production-ready features such as load balancing, rolling updates, and service discovery to ensure high availability and reliability of the web application. The project will involve creating a Dockerfile to package the application into a container and then deploying it onto a Swarm cluster. The Swarm cluster will be configured to provide automated failover, load balancing, and horizontal scaling to the application. The goal of the project is to demonstrate the benefits of Docker Swarm for deploying and managing containerized applications in production environments. - ## Task-01 - Do the hands-on Project, read [this](https://www.linkedin.com/posts/chetanrakhra_devops-project-share-activity-7034173810656296960-UjUw?utm_source=share&utm_medium=member_desktop) +Happy Learning :) - -Happy Learning :) \ No newline at end of file +[← Previous Day](../day82/tasks.md) | [Next Day →](../day84/tasks.md) diff --git a/2023/day84/tasks.md b/2023/day84/tasks.md index 999dfceef5..47a534461f 100644 --- a/2023/day84/tasks.md +++ b/2023/day84/tasks.md @@ -1,17 +1,15 @@ # Project-5 + ========= # Project Description - The project involves deploying a Netflix clone web application on a Kubernetes cluster, a popular container orchestration platform that simplifies the deployment and management of containerized applications. The project will require creating Docker images of the web application and its dependencies and deploying them onto the Kubernetes cluster using Kubernetes manifests. The Kubernetes cluster will provide benefits such as high availability, scalability, and automatic failover of the application. Additionally, the project will utilize Kubernetes tools such as Kubernetes Dashboard and kubectl to monitor and manage the deployed application. Overall, the project aims to demonstrate the power and benefits of Kubernetes for deploying and managing containerized applications at scale. - ## Task-01 - Get a netflix clone form [GitHub](https://github.com/devandres-tech/Netflix-Clone), read [this](https://www.linkedin.com/posts/chetanrakhra_devops-project-share-activity-7034173810656296960-UjUw?utm_source=share&utm_medium=member_desktop) and follow the Redit clone steps to similarly deploy a Netflix Clone +Happy Learning :) - -Happy Learning :) \ No newline at end of file +[← Previous Day](../day83/tasks.md) | [Next Day →](../day85/tasks.md) diff --git a/2023/day85/tasks.md b/2023/day85/tasks.md index e247bbfa66..af09a54c05 100644 --- a/2023/day85/tasks.md +++ b/2023/day85/tasks.md @@ -1,19 +1,14 @@ # Project-6 + ========= # Project Description - The project involves deploying a Node JS app on AWS ECS Fargate and AWS ECR. Read More about the tech stack [here](https://faun.pub/what-is-amazon-ecs-and-ecr-how-does-they-work-with-an-example-4acbf9be8415) - - - - ## Task-01 - - Get a NodeJs application from [GitHub](https://github.com/LondheShubham153/node-todo-cicd). - Build the Dockerfile present in the repo @@ -26,6 +21,6 @@ Read More about the tech stack [here](https://faun.pub/what-is-amazon-ecs-and-ec - Run the Project and share it on LinkedIn :) +Happy Learning :) - -Happy Learning :) \ No newline at end of file +[← Previous Day](../day84/tasks.md) | [Next Day →](../day86/tasks.md) diff --git a/2023/day86/tasks.md b/2023/day86/tasks.md index 95efc20df8..722ad45f98 100644 --- a/2023/day86/tasks.md +++ b/2023/day86/tasks.md @@ -1,26 +1,24 @@ # Project-7 + ========= # Project Description - The project involves deploying a Portfolio app on AWS S3 using GitHub Actions. Git Hub actions allows you to perform CICD with GitHub Repository integrated. - ## Task-01 - - Get a Portfolio application from [GitHub](https://github.com/LondheShubham153/tws-portfolio). - Build the GitHub Actions Workflow - Setup AWS CLI and AWS Login in order to sync website to S3 (to be done as a part of YAML) -- Follow this [video]() to understand it better +- Follow this [video]() to understand it better - Run the Project and share it on LinkedIn :) +Happy Learning :) - -Happy Learning :) \ No newline at end of file +[← Previous Day](../day85/tasks.md) | [Next Day →](../day87/tasks.md) diff --git a/2023/day87/tasks.md b/2023/day87/tasks.md index f13d529803..ebe61f4f09 100644 --- a/2023/day87/tasks.md +++ b/2023/day87/tasks.md @@ -1,26 +1,24 @@ # Project-8 + ========= # Project Description - The project involves deploying a react application on AWS Elastic BeanStalk using GitHub Actions. Git Hub actions allows you to perform CICD with GitHub Repository integrated. - ## Task-01 - -- Get source code from [GitHub](https://github.com/sitchatt/AWS_Elastic_BeanStalk_On_EC2.git). +- Get source code from [GitHub](https://github.com/sitchatt/AWS_Elastic_BeanStalk_On_EC2.git). - Setup AWS Elastic BeanStalk - Build the GitHub Actions Workflow -- Follow this [blog](https://www.linkedin.com/posts/sitabja-chatterjee_effortless-deployment-of-react-app-to-aws-activity-7053579065487687680-wZI8?utm_source=share&utm_medium=member_desktop) to understand it better +- Follow this [blog](https://www.linkedin.com/posts/sitabja-chatterjee_effortless-deployment-of-react-app-to-aws-activity-7053579065487687680-wZI8?utm_source=share&utm_medium=member_desktop) to understand it better - Run the Project and share it on LinkedIn :) - - Happy Learning :) + +[← Previous Day](../day86/tasks.md) | [Next Day →](../day88/tasks.md) diff --git a/2023/day88/tasks.md b/2023/day88/tasks.md index 04f7ce6306..c1dd8f6105 100644 --- a/2023/day88/tasks.md +++ b/2023/day88/tasks.md @@ -1,17 +1,15 @@ # Project-9 + ========= # Project Description - The project involves deploying a Django Todo app on AWS EC2 using Kubeadm Kubernetes cluster. Kubernetes Cluster helps in Auto-scaling and Auto-healing of your application. - ## Task-01 - - Get a Django Full Stack application from [GitHub](https://github.com/LondheShubham153/django-todo-cicd). - Setup the Kubernetes cluster using [this script](https://github.com/RishikeshOps/Scripts/blob/main/k8sss.sh) @@ -20,6 +18,6 @@ Kubernetes Cluster helps in Auto-scaling and Auto-healing of your application. - Run the Project and share it on LinkedIn :) +Happy Learning :) - -Happy Learning :) \ No newline at end of file +[← Previous Day](../day87/tasks.md) | [Next Day →](../day89/tasks.md) diff --git a/2023/day89/tasks.md b/2023/day89/tasks.md index c41e29809d..b05ea14a87 100644 --- a/2023/day89/tasks.md +++ b/2023/day89/tasks.md @@ -1,21 +1,19 @@ # Project-10 + ========= # Project Description - The project involves Mounting of AWS S3 Bucket On Amazon EC2 Linux Using S3FS. This is a AWS Mini Project that will teach you AWS, S3, EC2, S3FS. - ## Task-01 - - Create IAM user and set policies for the project resources using this [blog](https://medium.com/@chetxn/project-8-devops-implementation-8300b9ed1f2). - Utilize and make the best use of aws-cli - Run the Project and share it on LinkedIn :) - - Happy Learning :) + +[← Previous Day](../day88/tasks.md) | [Next Day →](../day90/tasks.md) diff --git a/2023/day90/tasks.md b/2023/day90/tasks.md index e69de29bb2..e3da5e3b34 100644 --- a/2023/day90/tasks.md +++ b/2023/day90/tasks.md @@ -0,0 +1,29 @@ +# Day 90: The Awesome Finale! 🎉 🎉 + +🚀 Can you believe it? You've hit the jackpot – Day 90, the grand finale of our DevOps bonanza. Time to give yourself a virtual high-five! + +### What's Next? + +While this marks the end of the official 90-day journey, remember that your learning journey in DevOps is far from over. There's always something new to explore, tools to master, and techniques to refine. We're continuing to curate more content, challenges, and resources to help you advance your DevOps expertise. + +### Share Your Achievement + +Share your journey with the world! Post about your accomplishments on social media using the hashtag #90DaysOfDevOps. Inspire others to join the DevOps movement and take charge of their learning path. + +### Keep the Momentum Going! + +The knowledge and skills you've gained during these 90 days are just the beginning. Keep practicing, experimenting, and collaborating. DevOps is a continuous journey of improvement and innovation. + +### Star the Repository + +If you've found value in this repository and the DevOps content we've curated, consider showing your appreciation by starring this repository. Your support motivates us to keep creating high-quality content and resources for the community. + +**[🌟 Star this repository](https://github.com/LondheShubham153/90DaysOfDevOps)** + +Thank you for being part of the "90 Days of DevOps" adventure. +Keep coding, automating, deploying, and innovating! 🎈 + +With gratitude, +@TrainWithShubham + +[← Previous Day](../Day89/tasks.md) diff --git a/README.md b/README.md index 34b875ddb4..c5884a0c5b 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,20 @@ # #90DaysOfDevOps Challenge -## Learn, Upskill, Grow with the Community -Join our DevOps community challenge starting on January 1st, 2023 and embark on a 90-day journey to become a better DevOps practitioner. This repository serves as an open invitation to all DevOps enthusiasts who are looking to enhance their skills and knowledge. By participating in this challenge, you will have the opportunity to learn from others in the community, collaborate with like-minded individuals, and ultimately strengthen your DevOps abilities. +## Learn, Upskill, Grow with the Community + +Join our DevOps community challenge starting on January 1st, 2023 and embark on a 90-day journey to become a better DevOps practitioner. This repository serves as an open invitation to all DevOps enthusiasts who are looking to enhance their skills and knowledge. By participating in this challenge, you will have the opportunity to learn from others in the community, collaborate with like-minded individuals, and ultimately strengthen your DevOps abilities. Let's come together to grow and achieve new heights in DevOps! +📖 **Discover More in Our Detailed Table of Contents!** Explore the richness of our content and find what you're looking for efficiently. Check out our [TOC here](./TOC.md). + ## Steps: + - Fork[https://github.com/LondheShubham153/90DaysOfDevOps/fork] the Repo. - Learn Everyday and add your learnings in the day wise folders. - Check out what others are Learning and help/learn from them. - Showcase your learnings on LinkedIn - These are our community Links. - Telegram Channel: https://t.me/trainwithshubham diff --git a/TOC.md b/TOC.md new file mode 100644 index 0000000000..6ab4598c88 --- /dev/null +++ b/TOC.md @@ -0,0 +1,136 @@ +## Table of Contents + +Below is the index of the incredible DevOps journey that awaits you: + +... + +### 🌟 [Day 1-7 : Introduction to DevOps and Linux Basics](./2023/day01/) + +- Description: Kickstart your 90-day journey with the foundational principles of DevOps. Dive deep into the Linux ecosystem, exploring commands, shell scripting, and file permissions. +- Topics Covered: + - [Understanding and defining DevOps](./2023/day01/tasks.md) + - [Getting hands-on with basic to advanced Linux commands](./2023/day02/tasks.md) + - [Grasping the concepts of Linux Shell Scripting](./2023/day04/tasks.md) + - [Exploring advanced shell scripting techniques with practical tasks.](./2023/day05/tasks.md) + - [Deep dive into file permissions and Access Control Lists (ACLs)](./2023/day06/tasks.md) + - [Insights into package managers in Linux and understanding systemctl and systemd](./2023/day07/tasks.md) + +### 🚀 [Day 8-12: Mastering Git & GitHub: From Basics to Advanced Techniques](./2023/day08/) + +- Description: Embark on a comprehensive journey through Git and GitHub, from grasping the fundamental concepts to exploring advanced techniques that are essential for DevOps. +- Topics Covered: + - [Introduction and understanding of Git and GitHub.](./2023/day08/tasks.md) + - [Grasping the concept and advantages of Version Control Systems, with a focus on Centralized vs. Distributed.](./2023/day08/tasks.md) + - [Diving deep into the significance, distinctions, and practicalities of Git and GitHub, including setting up repositories and understanding branch differences.](./2023/day09/tasks.md) + - [Exploring advanced Git concepts such as branching, revert, reset, rebase, merge, stash, cherry-pick, and conflict resolution.](./2023/day10/tasks.md) + - [Concluding with celebrations, crafting a Git cheatsheet, and fostering a spirit of continuous learning.](./2023/day12/tasks.md) + +### 💼 [Day 13-15: Delving into Python Essentials for DevOps](./2023/day13/) + +- Description: Dive into the world of Python, as this programming language plays a pivotal role in a DevOps engineer's toolkit. Cover the basics, explore diverse data types, understand essential data structures, and leverage Python libraries for DevOps tasks. +- Topics Covered: + - [Introduction to Python: its definition, creator, and the extensive libraries and frameworks it offers.](./2023/day13/tasks.md) + - [Understanding Python's data types and structures.](./2023/day14/tasks.md) + - [Utilizing Python libraries for DevOps tasks while emphasizing hands-on work with data structures and file formats.](./2023/day15/tasks.md) + +### 🐳 [Day 16-21: Deep Dive into Docker for DevOps Engineers](./2023/day16/) + +- Description: This module immerses DevOps Engineers into the extensive world of Docker. It equips you with the hands-on skills necessary to build, manage, and optimize Docker containers, create Docker projects, understand related concepts, and share your knowledge with the community. +- Topics Covered: + - [The essence of Docker and its revolutionary packaging into standardized units known as containers.](./2023/day16/tasks.md) + - [A special project day focused on Dockerfiles – understanding their significance and constructing one for a simple web application.](./2023/day17/tasks.md) + - [Expanding knowledge on Docker Compose, its configuration language YAML, and the magic they bring to multi-container applications.](./2023/day18/tasks.md) + - [Docker’s storage solutions with Docker Volume, understanding its independence and how it can benefit container data management.](./2023/day19/tasks.md) + - [Important interview Questions](./2023/day21/tasks.md) + +### 🛠️ [Day 22-29: Diving into Jenkins: Basics to Advanced](./2023/day22/) + +- Description: Delve into Jenkins's world, navigating from its foundational concepts to advanced functionalities integral for DevOps. This will empower you to master CI/CD pipelines, understand the anatomy of Jenkins projects, and optimize Jenkins in the DevOps lifecycle. +- Topics Covered: + - [Introduction to Jenkins and its significance in the DevOps realm.](./2023/day22/tasks.md) + - [Detailed exploration of Jenkins Freestyle Projects.](./2023/day23/tasks.md) + - [Crafting an end-to-end Jenkins CI/CD project for a Node JS application.](./2023/day24/tasks.md) + - [Jenkins Declarative Pipelines, understanding the distinction between declarative and scripted pipelines.](./2023/day26/tasks.md) + - [Leveraging Docker with Jenkins to enhance CI/CD workflows.](./2023/day27/tasks.md) + - [Jenkins Agents and the orchestration between the master and agent for optimized task execution.](./2023/day28/tasks.md) + - [Jenkins Important interview Questions.](./2023/day29/tasks.md) + +### ☸️ [Day 30-37: Kubernetes Mastery: From Overview to Advanced Implementation](./2023/day30/) + +- Description: Dive deep into Kubernetes, the leading container management platform. Spanning from its foundations and architecture, all the way to advanced configurations, services, and best practices. Equip yourself not only with hands-on skills but also with critical insights and understanding. +- Topics Covered: + - [Historical background of Kubernetes, its inspiration from Google's Borg, and its significant role in DevOps.](./2023/day30/tasks.md) + - [Initial setup with launching a Kubernetes Cluster, getting hands-on with minikube, and deploying Nginx.](./2023/day31/tasks.md) + - [Advanced cluster operations, including deployments with features like auto-healing and auto-scaling.](./2023/day32/tasks.md) + - [Working with core Kubernetes concepts like Namespaces, Services, ConfigMaps, Secrets, and Persistent Volumes.](./2023/day33/tasks.md) + - [Mastering ConfigMaps and Secrets in Kubernete](./2023/day35/tasks.md) + - [Important interview questions related to Kubernetes.](./2023/day37/tasks.md) + +### ☁️ [Day 38-53: AWS's vast ecosystem and its dominance in the cloud industry.](./2023/day38/) + +- Description: Dive into Amazon Web Services, starting with the fundamentals and progressing to more complex concepts and tools. Over the course of these days, learn the intricacies of AWS, set up essential services, and work hands-on with CI/CD pipeline concepts. +- Topics Covered: + - [Introduction to AWS and its fundamental components.](./2023/day38/tasks.md) + - [Understanding IAM (Identity and Access Management)](./2023/day39/tasks.md) + - [Hands-on with AWS EC2 (Elastic Compute Cloud), including automation and setting up Application Load Balancers.](./2023/day40/tasks.md) + - [Working with AWS-CLI and S3 programmatic access.](./2023/day42/tasks.md) + - [Grasping the RDS (Relational Database Service) and deploying a WordPress website.](./2023/day44/tasks.md) + - [Monitoring and alerting with AWS CloudWatch and SNS.](./2023/day46/tasks.md) + - [Delving into ECS (Elastic Container Service) and preparing for AWS-based interviews.](./2023/day48/tasks.md) + - [Embarking on a 4-day intensive journey to set up a CI/CD pipeline on AWS, incorporating tools such as CodeCommit, CodeBuild, CodeDeploy, CodePipeline, and S3.](./2023/day50/tasks.md) + +### 🛠️ [Day 54-59: Journey Through Ansible: Configuration Management & Automation](./2023/day54/) + +- Description: Venture into the realm of Infrastructure as Code (IaC) and Configuration Management with a detailed focus on Ansible. From basic setups to complex playbooks and hands-on projects, master the nuances of Ansible through step-by-step tasks and comprehensive modules. +- Topics Covered: + - [Introduction to Infrastructure as Code and its significance.](./2023/day54/tasks.md) + - [Diving deep into Configuration Management and the power of Ansible.](./2023/day55/tasks.md) + - [A closer look at Ansible: from installation on AWS EC2 to understanding the hosts file and setting up additional EC2 instances.](./2023/day55/tasks.md) + - [Ad-hoc commands in Ansible: quick commands versus playbooks, their utility, and hands-on tasks involving pinging servers and checking uptime.](./2023/day56/tasks.md) + - [Enhancing understanding through video explanations to make Ansible more engaging and relatable.](./2023/day57/tasks.md) + - [Exploring Ansible Playbooks: their importance, use cases, and deep dives into configurations, deployment, roles, and variables.](./2023/day58/tasks.md) + - [A practical project to solidify understanding: deploying a web app using Ansible, including EC2 setup, Ansible installations, inventory file access, Nginx installations, and deploying a sample webpage.](./2023/day59/tasks.md) + +### ⚙️ [Day 60-71: Dive into Terraform: From Basics to Modules](./2023/day60/) + +- Description: Delve deep into Terraform, the renowned infrastructure-as-code tool. Spanning an 11-day learning journey, explore its fundamental concepts, automation potentials, advanced configurations, and best practices for AWS deployment. +- Topics Covered: + - [Introduction to Terraform and its pivotal role in automating EC2 instances.](./2023/day60/tasks.md) + - [Familiarizing with basic and essential Terraform commands.](./2023/day61/tasks.md) + - [The integration between Terraform and Docker, encompassing Blocks, Resources, and providers.](./2023/day62/tasks.md) + - [Understanding the significance of Terraform variables, and how they interplay in Terraform configurations.](./2023/day63/tasks.md) + - [Deep-dive into the realms of Terraform with AWS, emphasizing resource creation and management.](./2023/day64/tasks.md) + - [Expanding horizons with hands-on Terraform projects, crafting AWS infrastructure using Infrastructure-as-Code techniques.](./2023/day66/tasks.md) + - [AWS S3 Bucket creation, management, and the underlying intricacies.](./2023/day67/tasks.md) + - [Embracing scalability with Terraform - comprehending the art of scaling infrastructure.](./2023/day68/tasks.md) + - [Unraveling the world of Meta-Arguments and their application in Terraform.](./2023/day69/tasks.md) + - [Introduction to the modular world of Terraform - the core, the applications, and the benefits.](./2023/day70/tasks.md) + - [Preparing and acing Terraform interview questions.](./2023/day71/tasks.md) + +### [Day 72-78: 📊 Grafana Mastery: Monitoring, Dashboarding, and Alerting](./2023/day72/) + +- Description: Grafana, one of the most versatile open-source platforms for observability. From understanding its essence to setting it up and further integrating it with various platforms like Docker and cloud services, this comprehensive guide offers a mix of theory and hands-on tasks. +- Topics Covered: + - [Introducing Grafana and exploring its features, benefits, monitoring capabilities, databases compatibility, metrics, visualizations, and distinction from Prometheus.](./2023/day72/tasks.md) + - [Setting up Grafana on a local environment within AWS EC2.](./2023/day73/tasks.md) + - [Connecting AWS EC2 instances with Grafana for efficient monitoring.](./2023/day74/tasks.md) + - [Implementing Docker, creating containers, and sharing real-time logs with Grafana.](./2023/day75/tasks.md) + - [Constructing a Grafana dashboard for an organized visualization of metrics.](./2023/day76/tasks.md) + - [Establishing alert systems with Grafana for prompt notifications on system irregularities.](./2023/day77/tasks.md) + - [Exploring Grafana Cloud, setting up alerts for EC2 instances, and managing AWS billing alerts.](./2023/day78/tasks.md) + +### [Day 79+🔥: Comprehensive Dive into DevOps Projects & Prometheus Mastery](./2023/day79/) + +- Description: Delve into an extensive journey exploring the vast capabilities of Prometheus, combined with hands-on DevOps projects that span a variety of tools, platforms, and methodologies. Learn how to monitor, automate, deploy, and manage applications effectively using modern DevOps techniques. +- Topics Covered: + - [In-depth understanding of Prometheus: its architecture, features, components, database, and data retention.](./2023/day79/tasks.md) + - Projects to automate and streamline processes: + - [Building, testing, and deploying with Jenkins and GitHub.](./2023/day80/tasks.md) + - [Deploying using Jenkins' declarative syntax.](./2023/day81/tasks.md) + - [Hosting static websites on AWS S3.](./2023/day82/tasks.md) + - [Application deployment with Docker Swarm.](./2023/day83/tasks.md) + - [Deploying a Netflix clone using Kubernetes.](./2023/day84/tasks.md) + - [Utilizing AWS ECS Fargate and ECR with a Node JS app.](./2023/day85/tasks.md) + - [Deployment on AWS platforms using GitHub Actions.](./2023/day86/tasks.md) + - [Setting up and deploying a Django Todo app on AWS EC2 with a Kubeadm Kubernetes cluster.](./2023/day88/tasks.md) + - [Mounting AWS S3 Bucket on Amazon EC2 using S3FS.](./2023/day89/tasks.md) From 3050625d72c0829180279e725d016f1594ad3099 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Sun, 13 Aug 2023 04:06:35 +0000 Subject: [PATCH 150/394] submission day 17 --- submission/day17/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/submission/day17/README.md b/submission/day17/README.md index e69de29bb2..620ab997b6 100644 --- a/submission/day17/README.md +++ b/submission/day17/README.md @@ -0,0 +1,5 @@ +# Dockerfile use in Docker + +Here's My DockerFile Submission + +[Dockerfile Deepdive](https://www.linkedin.com/posts/paragpallavsingh_dockerfile-deepdive-complete-dockerfile-activity-7095642983236083714-aVae?utm_source=share&utm_medium=member_desktop) From f181765f990e06e179107a389ed4dda04efe6730 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Sun, 13 Aug 2023 11:53:21 +0000 Subject: [PATCH 151/394] day 18 sub flask app with redis --- submission/day18/Dockerfile | 11 +++++++++ .../day18/__pycache__/app.cpython-37.pyc | Bin 0 -> 796 bytes submission/day18/app.py | 23 ++++++++++++++++++ submission/day18/compose.yaml | 11 +++++++++ submission/day18/requirements.txt | 2 ++ 5 files changed, 47 insertions(+) create mode 100644 submission/day18/Dockerfile create mode 100644 submission/day18/__pycache__/app.cpython-37.pyc create mode 100644 submission/day18/app.py create mode 100644 submission/day18/compose.yaml create mode 100644 submission/day18/requirements.txt diff --git a/submission/day18/Dockerfile b/submission/day18/Dockerfile new file mode 100644 index 0000000000..9344bd18a0 --- /dev/null +++ b/submission/day18/Dockerfile @@ -0,0 +1,11 @@ +#syntax=docker/dockerfile:1 +FROM python:3.7-alpine +WORKDIR /code +ENV FLASK_APP=app.py +ENV FLASK_RUN_HOST=0.0.0.0 +RUN apk add --no-cache gcc musl-dev linux-headers +COPY requirements.txt requirements.txt +RUN pip install -r requirements.txt +EXPOSE 5000 +COPY . . +CMD ["flask", "run"] diff --git a/submission/day18/__pycache__/app.cpython-37.pyc b/submission/day18/__pycache__/app.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53666892260efab3a0cd5f40a321882e14ca2f82 GIT binary patch literal 796 zcmYjPK~L2{5T4m~ODP~~F!8v0>je@|9t;?X#uFh*0`%ZZ=`OtT`nq*@p8@1~5U&1* z$I-vxuP}Qu@kIOwo}BHA#%X7Eb~~N<=G%F(vXTMG^xJp2#Q=VW&0mShc}{9~$w-jc zKrvsjK-#m0jiVw$P?3tSu;2<$6B)@^@-M7dkcnKlh9XsbwkXpZl#4RE28zohzJ+}0 zma@W5j-J12N;~r0C|TS3*F%7u`FN=NoGP8#;MTCpTmms4NGfyt@Gm;-ag()~bOC-Oc@B5)8iu{BJa0u^{1JZCt z5R;u-PE`m??W{p^Z-Y4@CHb+HFL+*+)le02-B!j#bm}v8R;kX_y0w0FTeq#M!sewh z+W6SjW97MRld~&SKxOCyh`)2xf=O)1Od>F8-k!!=~0ZY(4pfz7I%e2ht<;P)IOc({9 z4hC&GR)c|$sD8oUgaI;vqj^DY^u(z?$A7f~$)+!uJ{xN}Y1C$*%7z*#OL3X>4ojE* E0CiKj(EtDd literal 0 HcmV?d00001 diff --git a/submission/day18/app.py b/submission/day18/app.py new file mode 100644 index 0000000000..5cd1a5a34c --- /dev/null +++ b/submission/day18/app.py @@ -0,0 +1,23 @@ +import time + +import redis +from flask import Flask + +app = Flask(__name__) +cache = redis.Redis(host='redis', port=6379) + +def get_hit_count(): + retries = 5 + while True: + try: + return cache.incr('hits') + except redis.exceptions.ConnectionError as exc: + if retries == 0: + raise exc + retries -= 1 + time.sleep(0.5) + +@app.route('/') +def hello(): + count = get_hit_count() + return 'Hello World! You have been seen {} times.\n\n\n

This is a sample docker app by Parag based on redis '.format(count) diff --git a/submission/day18/compose.yaml b/submission/day18/compose.yaml new file mode 100644 index 0000000000..da11822f7b --- /dev/null +++ b/submission/day18/compose.yaml @@ -0,0 +1,11 @@ +services: + web: + build: . + ports: + - "8000:5000" + volumes: + - .:/code + environment: + FLASK_DEBUG: "true" + redis: + image: "redis:alpine" diff --git a/submission/day18/requirements.txt b/submission/day18/requirements.txt new file mode 100644 index 0000000000..1a5dc97b12 --- /dev/null +++ b/submission/day18/requirements.txt @@ -0,0 +1,2 @@ +flask +redis From 4c24adc9febbe87f7651f569b45d3364e3c35147 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Sun, 13 Aug 2023 11:59:24 +0000 Subject: [PATCH 152/394] use dockerfile to make flask app --- submission/day18/{ => flask_app}/Dockerfile | 0 submission/day18/{ => flask_app}/README.md | 0 .../{ => flask_app}/__pycache__/app.cpython-37.pyc | Bin submission/day18/{ => flask_app}/app.py | 0 submission/day18/{ => flask_app}/compose.yaml | 0 submission/day18/{ => flask_app}/requirements.txt | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename submission/day18/{ => flask_app}/Dockerfile (100%) rename submission/day18/{ => flask_app}/README.md (100%) rename submission/day18/{ => flask_app}/__pycache__/app.cpython-37.pyc (100%) rename submission/day18/{ => flask_app}/app.py (100%) rename submission/day18/{ => flask_app}/compose.yaml (100%) rename submission/day18/{ => flask_app}/requirements.txt (100%) diff --git a/submission/day18/Dockerfile b/submission/day18/flask_app/Dockerfile similarity index 100% rename from submission/day18/Dockerfile rename to submission/day18/flask_app/Dockerfile diff --git a/submission/day18/README.md b/submission/day18/flask_app/README.md similarity index 100% rename from submission/day18/README.md rename to submission/day18/flask_app/README.md diff --git a/submission/day18/__pycache__/app.cpython-37.pyc b/submission/day18/flask_app/__pycache__/app.cpython-37.pyc similarity index 100% rename from submission/day18/__pycache__/app.cpython-37.pyc rename to submission/day18/flask_app/__pycache__/app.cpython-37.pyc diff --git a/submission/day18/app.py b/submission/day18/flask_app/app.py similarity index 100% rename from submission/day18/app.py rename to submission/day18/flask_app/app.py diff --git a/submission/day18/compose.yaml b/submission/day18/flask_app/compose.yaml similarity index 100% rename from submission/day18/compose.yaml rename to submission/day18/flask_app/compose.yaml diff --git a/submission/day18/requirements.txt b/submission/day18/flask_app/requirements.txt similarity index 100% rename from submission/day18/requirements.txt rename to submission/day18/flask_app/requirements.txt From 36c04106cdb2f3911c924a030d7e33789e3b5289 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Sun, 13 Aug 2023 12:00:32 +0000 Subject: [PATCH 153/394] update readme location --- submission/day18/{flask_app => }/README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename submission/day18/{flask_app => }/README.md (100%) diff --git a/submission/day18/flask_app/README.md b/submission/day18/README.md similarity index 100% rename from submission/day18/flask_app/README.md rename to submission/day18/README.md From ef115c04cc85b46a4987f6ce0e66be0e659f62ce Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Sun, 13 Aug 2023 18:06:09 +0530 Subject: [PATCH 154/394] Update README.md Add images to Day 18 --- submission/day18/README.md | 122 +++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) diff --git a/submission/day18/README.md b/submission/day18/README.md index e69de29bb2..6685f4d88f 100644 --- a/submission/day18/README.md +++ b/submission/day18/README.md @@ -0,0 +1,122 @@ +# Day 18 Dockerfile and Docker-Compose + +## **Making a Flask app using Redis through Docker compose** + +1. **Adding Flask App and define dependencies** +Adding project files as + +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/1e739373-dee5-4c82-a158-a440a2250d7a) + +2. **Writing the Dockerfile** +``` +#syntax=docker/dockerfile:1 +FROM python:3.7-alpine +WORKDIR /code +ENV FLASK_APP=app.py +ENV FLASK_RUN_HOST=0.0.0.0 +RUN apk add --no-cache gcc musl-dev linux-headers +COPY requirements.txt requirements.txt +RUN pip install -r requirements.txt +EXPOSE 5000 +COPY . . +CMD ["flask", "run"] +``` + + +4. **Writing services in docker compose (yaml file)** +``` +services: + web: + build: . + ports: + - "8000:5000" + redis: + image: "redis:alpine" +``` +4. **Build and Run using docker-compose up** +``` +docker-compose up +``` +image +

+image +

+image +

+ +## Here is the running app + +image + +On pressing **Ctrl+C** + +image +

+ +## **Some other commands** + +***1. to stop the application*** +``` +docker-compose down +``` + +image + + +***2. to run the container in detached mode*** +``` +docker-compose up -d +``` + +image + + +***3. to stop the detached container*** +``` +docker-compose stop +``` +image + + +## SOME Suggestions if you are working in AWS Free Tier Account + +1. ***Use these commands to find your instance slowness*** + +> To check the available memory +``` +df -h +``` +image + + +> To check all the container whether running or stopped ones. +``` +docker ps -a +``` +image + + +> To remove unused container +``` +docker rm +#refer above image +``` + +> To check all the images +``` +docker images -a +``` +image + + +> To delelte an image +``` +docker rmi +``` +image + +image + + + +*Please note: you can delete only untagged images. If the above command does not work, first remove the container attched then try this* From c44ba7718f2de6fb8c201266dba0942cf162e2dd Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Sun, 13 Aug 2023 18:12:01 +0530 Subject: [PATCH 155/394] Update README.md - Add docker link --- submission/day18/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/submission/day18/README.md b/submission/day18/README.md index 6685f4d88f..f3eda3467d 100644 --- a/submission/day18/README.md +++ b/submission/day18/README.md @@ -120,3 +120,5 @@ docker rmi *Please note: you can delete only untagged images. If the above command does not work, first remove the container attched then try this* + +Side note: https://docs.docker.com/compose/gettingstarted/ --> This is a good reference point for learners. Just understand each component step by step instead of copy paste and you will be having pretty decent understanding. From 25bf977259394d0a9e5112be1db87148555f2b97 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Sun, 13 Aug 2023 18:21:31 +0530 Subject: [PATCH 156/394] Update README.md - Add volume prune --- submission/day18/README.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/submission/day18/README.md b/submission/day18/README.md index f3eda3467d..6dc4cc1c17 100644 --- a/submission/day18/README.md +++ b/submission/day18/README.md @@ -102,6 +102,19 @@ docker rm #refer above image ``` +> To check all the volumes created +``` +docker volume ls +``` +image + +> To prune unused volumes +``` +docker volume prune +``` +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/17c2195d-c2e9-4439-8f70-6df3639a3410) + + > To check all the images ``` docker images -a @@ -117,8 +130,6 @@ docker rmi image - - *Please note: you can delete only untagged images. If the above command does not work, first remove the container attched then try this* Side note: https://docs.docker.com/compose/gettingstarted/ --> This is a good reference point for learners. Just understand each component step by step instead of copy paste and you will be having pretty decent understanding. From 3b8470308127d8c1ab61a5c968454d137a5e5883 Mon Sep 17 00:00:00 2001 From: Rohan Balgotra <112085387+Simbaa815@users.noreply.github.com> Date: Tue, 15 Aug 2023 15:05:25 +0530 Subject: [PATCH 157/394] Improved Readme Links: Community & Event Sessions Enhanced session events and community links for a more engaging Readme experience. --- README.md | 51 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 34b875ddb4..c561e865ac 100644 --- a/README.md +++ b/README.md @@ -11,26 +11,49 @@ Let's come together to grow and achieve new heights in DevOps! - Check out what others are Learning and help/learn from them. - Showcase your learnings on LinkedIn +## These are our community Links + + +   + + + +   -These are our community Links. + + +   -- Telegram Channel: https://t.me/trainwithshubham -- Discord Channel: https://discord.gg/hs3Pmc5F -- WhatsApp Group: https://chat.whatsapp.com/FvRlAAZVxUhCUSZ0Y1s7KY -- YouTube Channel: https://www.youtube.com/@TrainWithShubham -- Website: https://www.trainwithshubham.com/ -- LinkedIn: https://www.linkedin.com/in/shubhamlondhe1996/ + + +   + + + +  -## Events -YouTube Live Announcement: -https://youtu.be/rO5Rllir-LM + + +  -YouTube Playlist for DevOps: -https://youtube.com/playlist?list=PLlfy9GnSVerRqYJgVYO0UiExj5byjrW8u +## Events -DevOps Course: -https://bit.ly/devops-batch-4 +### YouTube Live Announcement: + + +   + +### YouTube Playlist for DevOps: + + +   + +### DevOps Course: + + +  ## Thanks to all contributors ❤ From a22bb0b742e2d68dcb11861157eb4ea03cb67247 Mon Sep 17 00:00:00 2001 From: Prajwal Deshpande <71492927+prajwalpd7@users.noreply.github.com> Date: Tue, 15 Aug 2023 17:57:01 +0530 Subject: [PATCH 158/394] navigation made easy --- 2023/day90/tasks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2023/day90/tasks.md b/2023/day90/tasks.md index e3da5e3b34..8e31513d21 100644 --- a/2023/day90/tasks.md +++ b/2023/day90/tasks.md @@ -26,4 +26,4 @@ Keep coding, automating, deploying, and innovating! 🎈 With gratitude, @TrainWithShubham -[← Previous Day](../Day89/tasks.md) +[← Previous Day](../day89/tasks.md) From 89186da6494a6dbfc054d03a4a881dacff086d82 Mon Sep 17 00:00:00 2001 From: Prajwal Deshpande <71492927+prajwalpd7@users.noreply.github.com> Date: Tue, 15 Aug 2023 22:52:35 +0530 Subject: [PATCH 159/394] Navigation made easy --- 2023/day05/tasks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2023/day05/tasks.md b/2023/day05/tasks.md index 199471a77e..db9355ab48 100644 --- a/2023/day05/tasks.md +++ b/2023/day05/tasks.md @@ -50,4 +50,4 @@ A user is an entity, in a Linux operating system, that can manipulate files and Post your daily work on Linkedin and le [me](https://www.linkedin.com/in/shubhamlondhe1996/) know , writing an article is the best :) -[← Previous Day](../Day04/tasks.md) | [Next Day →](../Day06/tasks.md) +[← Previous Day](../day04/tasks.md) | [Next Day →](../day06/tasks.md) From 008ec977f18e07c8a915a255f1383e5634a60462 Mon Sep 17 00:00:00 2001 From: Prajwal Deshpande <71492927+prajwalpd7@users.noreply.github.com> Date: Tue, 15 Aug 2023 22:54:04 +0530 Subject: [PATCH 160/394] Navigation made easy --- 2023/day04/tasks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2023/day04/tasks.md b/2023/day04/tasks.md index 84a354485a..1ea09abac5 100644 --- a/2023/day04/tasks.md +++ b/2023/day04/tasks.md @@ -28,4 +28,4 @@ Article Reference: [Click here to read basic Linux Shell Scripting](https://devo YouTube Vedio: [EASIEST Shell Scripting Tutorial for DevOps Engineers](https://www.youtube.com/watch?v=_-D6gkRj7xc&list=PLlfy9GnSVerQr-Se9JRE_tZJk3OUoHCkh&index=3) -[← Previous Day](../Day03/tasks.md) | [Next Day →](../Day05/tasks.md) +[← Previous Day](../day03/tasks.md) | [Next Day →](../day05/tasks.md) From f3bcbc82e2a8591e710f623b8240592d626bbea4 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Tue, 15 Aug 2023 11:58:14 +0000 Subject: [PATCH 161/394] add folders till day28 --- submission/day19/flask_app/Dockerfile | 11 +++++++++ .../flask_app/__pycache__/app.cpython-37.pyc | Bin 0 -> 796 bytes submission/day19/flask_app/app.py | 23 ++++++++++++++++++ submission/day19/flask_app/compose.yaml | 11 +++++++++ submission/day19/flask_app/requirements.txt | 2 ++ submission/day20/README.md | 0 submission/day21/README.md | 0 submission/day22/README.md | 0 submission/day23/README.md | 0 submission/day24/README.md | 0 submission/day25/README.md | 0 submission/day26/README.md | 0 submission/day27/README.md | 0 submission/day28/README.md | 0 14 files changed, 47 insertions(+) create mode 100644 submission/day19/flask_app/Dockerfile create mode 100644 submission/day19/flask_app/__pycache__/app.cpython-37.pyc create mode 100644 submission/day19/flask_app/app.py create mode 100644 submission/day19/flask_app/compose.yaml create mode 100644 submission/day19/flask_app/requirements.txt create mode 100644 submission/day20/README.md create mode 100644 submission/day21/README.md create mode 100644 submission/day22/README.md create mode 100644 submission/day23/README.md create mode 100644 submission/day24/README.md create mode 100644 submission/day25/README.md create mode 100644 submission/day26/README.md create mode 100644 submission/day27/README.md create mode 100644 submission/day28/README.md diff --git a/submission/day19/flask_app/Dockerfile b/submission/day19/flask_app/Dockerfile new file mode 100644 index 0000000000..9344bd18a0 --- /dev/null +++ b/submission/day19/flask_app/Dockerfile @@ -0,0 +1,11 @@ +#syntax=docker/dockerfile:1 +FROM python:3.7-alpine +WORKDIR /code +ENV FLASK_APP=app.py +ENV FLASK_RUN_HOST=0.0.0.0 +RUN apk add --no-cache gcc musl-dev linux-headers +COPY requirements.txt requirements.txt +RUN pip install -r requirements.txt +EXPOSE 5000 +COPY . . +CMD ["flask", "run"] diff --git a/submission/day19/flask_app/__pycache__/app.cpython-37.pyc b/submission/day19/flask_app/__pycache__/app.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44a38ed662b6b4d525c4bb1cafc557205a7afac7 GIT binary patch literal 796 zcmYjPF>lo{5WaKb*Sxf)fQrOu*s`<|6GPP^DiBjuL8Z1CcuHfpFMWA&u>DY5`WR?e z{=@6YuVF==keDhaRwmAQ0&&Tm&(7uUyU+K0c{v4=Uthn;Ee7x-Z2n42&NEWGOGbjk z8uIyyIntihY#ikgf{Ijpg*jJv+LMutCI8Iw1=*7e*N`WQ&-yaCLD`q-HBekC@eO2) zx0DrjGW7gqUD%Q5M#;)nKOX{Q%*R7*osU~>Tp0p`5I_iUw@K|=G7_h7ws)R7n4x4h zlr{#(PNUO!l$t$+DI#1vz62SKn0a!EpOF0cDNMofSx@pC`o14pqR5YU0Eh6dcR(7> z2x4#NmQxkNQaNjo+}mJINJ+kLWec8{MLAS?Ts5UJ5uN%}ot3I}m2RwG+15>?%CLE1 zj5a=Y)mV9MYo*$ZI5NtaN?9M#PhY^SP=en}>!p@zy=dFD_S`R@C^w+`gHlf#*QWq` zpA2A(jGh!%F(E%eb1(di>;KpaPy?clt-ItnxT4M_&WMG;RmOHM%2%qcwb<9DmXE}t zo`_-bUWp^68exO^Fckr_T}#t+qutyaR#wnk2wRNXS_!GkkurkNilcL}TbSZR92Hhc zp&QZNsK{7{&G(MA85b_xc-KtV?%V`;o(}_-RdQ_@JzzaF4`|I6%@Qqhdiik}786Fn zCxby#jMZS^BdVYC*I|H6;Amcu8$EHV%kf{WK(gryCL3cdC$-uPRM}7?VF@mg-eJk& E9|Cx~QUCw| literal 0 HcmV?d00001 diff --git a/submission/day19/flask_app/app.py b/submission/day19/flask_app/app.py new file mode 100644 index 0000000000..5cd1a5a34c --- /dev/null +++ b/submission/day19/flask_app/app.py @@ -0,0 +1,23 @@ +import time + +import redis +from flask import Flask + +app = Flask(__name__) +cache = redis.Redis(host='redis', port=6379) + +def get_hit_count(): + retries = 5 + while True: + try: + return cache.incr('hits') + except redis.exceptions.ConnectionError as exc: + if retries == 0: + raise exc + retries -= 1 + time.sleep(0.5) + +@app.route('/') +def hello(): + count = get_hit_count() + return 'Hello World! You have been seen {} times.\n\n\n

This is a sample docker app by Parag based on redis '.format(count) diff --git a/submission/day19/flask_app/compose.yaml b/submission/day19/flask_app/compose.yaml new file mode 100644 index 0000000000..da11822f7b --- /dev/null +++ b/submission/day19/flask_app/compose.yaml @@ -0,0 +1,11 @@ +services: + web: + build: . + ports: + - "8000:5000" + volumes: + - .:/code + environment: + FLASK_DEBUG: "true" + redis: + image: "redis:alpine" diff --git a/submission/day19/flask_app/requirements.txt b/submission/day19/flask_app/requirements.txt new file mode 100644 index 0000000000..1a5dc97b12 --- /dev/null +++ b/submission/day19/flask_app/requirements.txt @@ -0,0 +1,2 @@ +flask +redis diff --git a/submission/day20/README.md b/submission/day20/README.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/submission/day21/README.md b/submission/day21/README.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/submission/day22/README.md b/submission/day22/README.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/submission/day23/README.md b/submission/day23/README.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/submission/day24/README.md b/submission/day24/README.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/submission/day25/README.md b/submission/day25/README.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/submission/day26/README.md b/submission/day26/README.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/submission/day27/README.md b/submission/day27/README.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/submission/day28/README.md b/submission/day28/README.md new file mode 100644 index 0000000000..e69de29bb2 From 19c888de84531a77c88116af62507d718ac81653 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Wed, 16 Aug 2023 06:59:47 +0530 Subject: [PATCH 162/394] Update README.md day22 task --- submission/day22/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/submission/day22/README.md b/submission/day22/README.md index e69de29bb2..0d67dc38c2 100644 --- a/submission/day22/README.md +++ b/submission/day22/README.md @@ -0,0 +1,5 @@ +# Day 22 Task Make a Jenkins job + +image + +image From 9e9edd501a278913470e86204695c85b8e260c7b Mon Sep 17 00:00:00 2001 From: Prajwal Deshpande <71492927+prajwalpd7@users.noreply.github.com> Date: Thu, 17 Aug 2023 11:41:42 +0530 Subject: [PATCH 163/394] Navigation made easy some corrections --- 2023/day05/tasks.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/2023/day05/tasks.md b/2023/day05/tasks.md index db9355ab48..94aa3deb75 100644 --- a/2023/day05/tasks.md +++ b/2023/day05/tasks.md @@ -1,6 +1,6 @@ # Day 5 Task: Advanced Linux Shell Scripting for DevOps Engineers with User management -If you noticed that there are total 90 sub directories in the directory '2023' of this repository. What did you think, how did I create 90 directories. Manually one by one or using a script, or a command ? +If you noticed that there are a total 90 sub-directories in the directory '2023' of this repository. What did you think, how did I create 90 directories? Manually one by one or using a script, or a command? All 90 directories within seconds using a simple command. @@ -10,7 +10,7 @@ All 90 directories within seconds using a simple command. 1. You have to do the same using Shell Script i.e using either Loops or command with start day and end day variables using arguments - -So Write a bash script createDirectories.sh that when the script is executed with three given arguments (one is directory name and second is start number of directories and third is the end number of directories ) it creates specified number of directories with a dynamic directory name. +So Write a bash script create directories.sh that when the script is executed with three given arguments (one is the directory name and second is start number of directories and third is the end number of directories ) it creates a specified number of directories with a dynamic directory name. Example 1: When the script is executed as @@ -28,7 +28,7 @@ You may need to use loops or commands (or both), based on your preference . [Che 2. Create a Script to backup all your work done till now. -Backups are an important part of DevOps Engineers day to Day activities +Backups are an important part of DevOps Engineer's day to Day activities The video in References will help you to understand How a DevOps Engineer takes backups (it can feel a bit difficult but keep trying, Nothing is impossible.) Watch [this video](https://youtu.be/aolKiws4Joc) @@ -48,6 +48,6 @@ A user is an entity, in a Linux operating system, that can manipulate files and [Check out this reference: https://www.geeksforgeeks.org/user-management-in-linux/](https://www.geeksforgeeks.org/user-management-in-linux/) -Post your daily work on Linkedin and le [me](https://www.linkedin.com/in/shubhamlondhe1996/) know , writing an article is the best :) +Post your daily work on Linkedin and let [me](https://www.linkedin.com/in/shubhamlondhe1996/) know , writing an article is the best :) [← Previous Day](../day04/tasks.md) | [Next Day →](../day06/tasks.md) From 3ac7b1074feebfb3ddbd462674e7f6882977f2d3 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Fri, 25 Aug 2023 09:56:45 +0530 Subject: [PATCH 164/394] Update README.md day 20 submission --- submission/day20/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/submission/day20/README.md b/submission/day20/README.md index e69de29bb2..71bebd2737 100644 --- a/submission/day20/README.md +++ b/submission/day20/README.md @@ -0,0 +1,3 @@ +Docker Cheatsheet + +![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/445c857a-8dee-434b-b8d7-c3e20e01356b) From 3e0a2bf8878b35b4ef3607cd935a8ed5a4500f14 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Fri, 25 Aug 2023 12:00:48 +0530 Subject: [PATCH 165/394] Update README.md add docker questions answers --- submission/day21/README.md | 416 +++++++++++++++++++++++++++++++++++++ 1 file changed, 416 insertions(+) diff --git a/submission/day21/README.md b/submission/day21/README.md index e69de29bb2..3c6296f100 100644 --- a/submission/day21/README.md +++ b/submission/day21/README.md @@ -0,0 +1,416 @@ +## Day 21 Task: Docker Important interview Questions. + + +## Docker Interview + Docker is a good topic to ask in DevOps Engineer Interviews, mostly for freshers. + One must surely try these questions in order to be better in Docker + +## Questions + + +### 1. What is the Difference between an Image, Container and Engine? + +| Aspect | Image | Container | Engine | +|--------------------|----------------------------------------|-----------------------------------------|-----------------------------------------| +| Definition | Static snapshot of an application | Running instance of an image | Software that manages and runs containers | +| Contents | Includes code, runtime, libraries, etc. | Includes the image and runtime context | Provides tools and services for containers | +| Portability | Highly portable | Portable | Enables portability and orchestration | +| Isolation | Not executable on its own | Isolated runtime environment | Manages isolation and resource allocation | +| Lifecycle | Created, stored, and shared | Created, started, stopped, and removed | Installed, configured, and operated | +| Purpose | Basis for creating containers | Runnable instance of an application | Manages containerization and deployment | +| Interaction | Used to create containers | Created from images, runs applications | Used to build, manage, and run containers| +| Persistence | Can be stored in a registry | Exists only while running | Persistent management of containers | +| Networking | No network configuration | Can have network settings | Manages networking for containers | +| Storage | No state storage | Can have state stored inside | Coordinates storage resources | +| Example Technologies | Docker images, OCI images | Docker containers, Kubernetes pods | Docker Engine, containerd, Kubernetes | + +### 2. What is the Difference between the Docker command COPY vs ADD? + +| Aspect | COPY | ADD | +|----------------------|---------------------------------|----------------------------------| +| Purpose | Copies files and directories | Copies files and directories | +| Source | Can copy from the build context | Can copy from the build context | +| Destination | Only works with the container's file system | Can also extract archives and handle URLs | +| Extraction | Does not automatically extract archives | Can automatically extract common archives (e.g., `.tar`, `.gzip`) | +| URL Handling | Cannot handle URLs | Can download from URLs | +| Ownership & Permissions | Preserves ownership and permissions | Copies with default permissions | +| Cache Busting | Only invalidates cache if source file changes | Invalidates cache if source URL or contents change | +| Use Cases | Best for simple file copying | Offers additional features like URL handling and archive extraction | + +### 3. What is the Difference between the Docker command CMD vs RUN? + +| Aspect | CMD | RUN | +|----------------------|--------------------------------------------------|--------------------------------------------------| +| Purpose | Specifies the default command for the container | Executes commands during image build | +| Usage | Typically used once at the end of a Dockerfile | Can be used multiple times in a Dockerfile | +| Command Execution | Executes only when the container starts | Executes during image build | +| Overriding | Can be overridden by a command during container run | Commands are fixed in the image | +| Default | Provides the default behavior for the container | Does not change the container behavior | +| Parameters | Executable command and optional arguments | Shell command(s) and arguments to execute | +| Example | `CMD ["nginx", "-g", "daemon off;"]` | `RUN apt-get update && apt-get install -y curl`| + + +### 4. How Will you reduce the size of the Docker image? + +Reducing the size of a Docker image is important for optimizing storage, transfer times, and resource consumption. Here are several strategies you can employ to achieve a smaller Docker image size: +1. **Use Minimal Base Images:** + Choose lightweight base images like Alpine Linux or BusyBox instead of full-fledged operating systems. These minimal images contain only essential components, leading to smaller image sizes. + +2. **Multi-Stage Builds:** + Utilize multi-stage builds to separate build-time dependencies from runtime artifacts. This involves creating multiple build stages in the Dockerfile, where the final stage only includes the necessary runtime components. This can significantly reduce the image size. + +3. **Minimize Layers:** + Each instruction in a Dockerfile creates a new layer in the image. Minimize the number of instructions to reduce the number of layers. Combine multiple commands into a single RUN instruction when possible. + +4. **Use COPY Instead of ADD:** + Use the `COPY` command instead of `ADD` to copy files into the image. `COPY` is simpler and doesn't perform any automatic extraction, reducing the chances of unintended increase in image size. + +5. **Cleanup Unnecessary Files:** + Remove temporary files, caches, and any files that are not required in the final image. Use the `RUN` instruction to delete files immediately after they've been used to avoid unnecessary layers. + +6. **Avoid Installing Unnecessary Packages:** + When installing software packages, only include the dependencies required for your application to run. Minimize the number of extra packages that get installed. + +7. **Use Specific Version Tags:** + When installing software, specify exact version numbers for packages and dependencies. Avoid using generic or latest tags as they might result in larger images when dependencies change. + +8. **Compress Files Before Adding:** + If you need to include large files, compress them before adding them to the image. Then, you can decompress them during runtime. + +9. **Use .dockerignore:** + Create a `.dockerignore` file in your project directory to exclude unnecessary files and directories from being added to the image during the build process. + +10. **Alpine Package Optimization:** + When using Alpine Linux, you can optimize package installation by specifying the `--no-cache` flag in the `RUN` command to prevent the creation of cache files. + +11. **Optimize Dockerfile Instructions:** + Optimize the order of Dockerfile instructions. Place instructions that change infrequently (e.g., installing dependencies) before instructions that change frequently (e.g., copying source code). + +12. **Clean Up Apt and Yum Cache:** + If using Debian-based (`apt`) or Red Hat-based (`yum`) package managers, clean up the package cache in the same `RUN` command after installing packages. + +### 5. Why and when to use Docker? + +1. **Isolation and Consistency:** Docker provides containerization, isolating applications and their dependencies from the underlying system. This ensures consistent behavior across various environments, from development to production, reducing the "it works on my machine" problem. + +2. **Portability:** Docker containers encapsulate the application and its dependencies into a single package. This makes it easy to move applications between different hosts, cloud platforms, and on-premises environments, fostering a "write once, run anywhere" approach. + +3. **Resource Efficiency:** Docker containers share the host OS kernel, consuming fewer resources compared to traditional virtualization. This allows you to run more applications on the same infrastructure, optimizing resource utilization. + +4. **Rapid Deployment and Scaling:** Docker's lightweight nature enables fast application deployment and scaling. You can easily spin up new containers or replicate existing ones to handle varying levels of load, improving application responsiveness. + +5. **Microservices and DevOps:** Docker is well-suited for microservices architectures and DevOps practices. It allows teams to develop, test, and deploy small, independent services in parallel, enabling quicker iterations, continuous integration, and continuous deployment. + +### 6. Explain the Docker components and how they interact with each other. + +Docker consists of several key components that work together to enable containerization, deployment, and management of applications. Here's a brief overview of these components and how they interact: + +1. **Docker Daemon:** + The Docker daemon (dockerd) is a background process running on the host system. It's responsible for building, running, and managing containers. It listens for Docker API requests and communicates with the container runtime to manage containers' execution. + +2. **Docker Client:** + The Docker client (docker) is the command-line interface used by users to interact with the Docker daemon. It allows users to issue commands to build, run, stop, and manage containers. The client communicates with the Docker daemon via the Docker API. + +3. **Docker Images:** + Docker images are the building blocks of containers. An image is a lightweight, standalone, executable software package that includes the application code, runtime, libraries, and dependencies. Images are created from a set of instructions defined in a Dockerfile and can be stored in registries for distribution. + +4. **Docker Containers:** + Containers are instances of Docker images. They encapsulate the application, its dependencies, and runtime settings in an isolated environment. Containers share the host OS kernel but have their own isolated file system, networking, and process space. + +5. **Docker Compose:** + Docker Compose is a tool for defining and running multi-container Docker applications. It uses a YAML file to define services, networks, and volumes for different containers in a single application stack. Compose simplifies managing complex applications with multiple interconnected services. + +6. **Docker Registry:** + Docker registries are repositories for storing and distributing Docker images. The most common public registry is Docker Hub, but private registries can also be set up for secure image storage and distribution within an organization. + +7. **Docker Network:** + Docker networks allow containers to communicate with each other and with the outside world. They provide isolation and manage networking resources for containers, enabling seamless communication between containers on the same or different hosts. + +8. **Docker Volumes:** + Docker volumes are a way to manage persistent data for containers. Volumes can be mounted into containers, allowing data to be stored separately from the container's file system and persist even after a container is removed. + +### 7. Explain the terminology: Docker Compose, Docker File, Docker Image, Docker Container? + +1. **Docker Compose:** + Docker Compose is a tool for defining and managing multi-container Docker applications. It uses a YAML file to define the services, networks, and volumes that make up an application stack. Compose simplifies the process of orchestrating and running interconnected containers by allowing you to define and manage the entire application environment in a single configuration file. + +2. **Dockerfile:** + A Dockerfile is a text file that contains a set of instructions for building a Docker image. It defines the base image, sets up the environment, installs dependencies, copies files, and configures settings needed for your application. Dockerfiles are used to automate the creation of consistent and reproducible Docker images. + +3. **Docker Image:** + A Docker image is a standalone, executable software package that includes everything needed to run an application, such as the code, runtime, libraries, and dependencies. Images are created from Dockerfiles and can be shared, stored in registries, and used to create containers. Images serve as templates for containers and ensure consistent application behavior across different environments. + +4. **Docker Container:** + A Docker container is a runnable instance of a Docker image. Containers are isolated environments that encapsulate an application and its dependencies. They share the host OS kernel but have their own isolated file system, networking, and process space. Containers are lightweight, portable, and can be started, stopped, and replicated quickly. + +Together, these components enable efficient application development, deployment, and management through containerization. + +### 8. In what real scenarios have you used Docker? + +Here are some of the common scenarios where Docker is commonly used in the software development and deployment world: + +1. **Microservices Architecture:** Docker is often used to containerize individual microservices within a larger application. This approach allows each microservice to be developed, tested, and deployed independently, improving scalability and maintainability. + +2. **DevOps Practices:** Docker is a key tool in implementing DevOps practices. It helps in creating consistent development, testing, and production environments, reducing discrepancies between different stages of the software development lifecycle. + +3. **Continuous Integration and Continuous Deployment (CI/CD):** Docker images can be easily integrated into CI/CD pipelines, ensuring that the same image used during development is also used for testing and deployment. This helps catch issues earlier in the development process. + +4. **Local Development:** Developers often use Docker to replicate the production environment on their local machines. This ensures that what they build and test locally closely matches the production environment. + +5. **Portability and Cloud Deployment:** Docker's portability is particularly useful when deploying applications to the cloud. It allows you to package an application and its dependencies into a single container, making it easy to move and run across different cloud providers. + +6. **Isolation for Testing:** Docker containers provide isolation, making it easier to test software in a controlled environment without affecting the host system. This is especially valuable for testing different software configurations. + +7. **Legacy Application Modernization:** Docker can help modernize legacy applications by packaging them in containers. This allows older applications to run on modern infrastructure and take advantage of containerization benefits. + +8. **Resource Optimization:** By using Docker's lightweight containers, you can optimize resource utilization on servers, running multiple containers on a single host while maintaining isolation. + +9. **Big Data and Analytics:** Docker is used in big data environments to create isolated containers for various analytics tools, databases, and frameworks, ensuring consistent environments for data processing and analysis. + +10. **Edge Computing:** Docker's lightweight and consistent runtime makes it suitable for deploying applications at the edge of the network, where resource constraints and diverse hardware environments exist. + +### 9. Docker vs Hypervisor? + +| Aspect | Docker (Containerization) | Hypervisor (Virtualization) | +|----------------------|--------------------------------------------|--------------------------------------------| +| **Isolation Level** | Operating system-level virtualization | Full hardware-level virtualization | +| **Overhead** | Minimal resource overhead | Higher resource overhead | +| **Performance** | Near-native performance | Slightly lower performance due to overhead | +| **Resource Usage** | Shares host OS kernel, efficient resource usage | Emulates complete hardware, resource-intensive | +| **Portability** | Highly portable across environments | Less portable, requires more configuration | +| **Start Time** | Near-instant startup and shutdown | Longer startup and shutdown times | +| **Density** | Higher container density on a host | Lower VM density due to resource needs | +| **Networking** | Shared network stack with host and other containers | Separate virtual network stack for each VM | +| **Storage** | Shared file system with host and other containers | Virtual disk images for each VM | +| **Orchestration** | Integrated with tools like Docker Compose and Kubernetes | Requires separate management tools | +| **Use Cases** | Microservices, DevOps, lightweight apps | Legacy applications, complex environments | + +### 10. What are the advantages and disadvantages of using docker? + +| **Advantages** | **Disadvantages** | +|-----------------------------------------------|------------------------------------------------| +| **Isolation**: Containers provide application isolation without the overhead of full virtualization. | **Learning Curve**: New concepts and tools to master. | +| **Portability**: Consistent environments across development, testing, and production. | **Resource Overhead**: Slight performance overhead due to shared kernel. | +| **Resource Efficiency**: Containers share the host OS kernel, leading to efficient resource utilization. | **Limited OS Support**: Works best on Linux; Windows and macOS support has limitations. | +| **Rapid Deployment**: Containers start quickly and can be scaled up or down easily. | **Security Concerns**: Misconfiguration can lead to vulnerabilities. | +| **Version Control**: Images provide versioned snapshots of applications and dependencies. | **Complex Networking**: Networking between containers can be complex. | +| **Microservices**: Ideal for microservices architecture and modular application design. | **Persistence**: Containers are typically stateless, requiring separate solutions for data storage. | +| **Ecosystem**: Rich ecosystem with tools like Docker Compose and Kubernetes for orchestration. | **Image Size**: Images can be large, especially with full environments. | +| **DevOps Integration**: Facilitates CI/CD pipelines and DevOps practices. | **Incompatibility**: Some legacy applications might not work well in containers. | +| **Isolation and Compatibility**: Containers can run side by side with different dependencies. | **Continuous Maintenance**: Images and containers need regular updates and management. | +| **Development Consistency**: Replicate production environment on local machine for development. | **Lack of GUI**: Docker is primarily command-line driven; graphical interfaces are limited. | + +### 11. What is a Docker namespace? + +In Docker, namespaces are a key component of containerization that provide process isolation and resource separation between containers and the host system. They create a virtualized environment for each container, isolating processes, filesystems, networks, and other resources. This allows multiple containers to run on the same host without interfering with each other or the host system. + +Here's a brief overview of namespaces along with an example: + +**Namespace Types in Docker:** + +1. **PID Namespace (pid):** Provides process isolation. Each container sees only its own set of processes, with process IDs (PIDs) unique within the namespace. + +2. **Network Namespace (net):** Isolates networking resources, including network interfaces, IP addresses, routing tables, and firewall rules. + +3. **Mount Namespace (mnt):** Provides filesystem isolation. Containers have their own filesystem hierarchy, separate from the host and other containers. + +4. **UTS Namespace (uts):** Isolates hostname and domain name, allowing each container to have its own identity for these attributes. + +5. **IPC Namespace (ipc):** Isolates inter-process communication (IPC) resources such as shared memory segments and semaphores. + +6. **User Namespace (user):** Isolates user and group IDs, allowing containers to have their own user and group mappings. + +**Example:** + +Let's consider a scenario where two Docker containers are running on the same host, both serving web applications. Each container needs to run its own web server on port 80. + +In this case, the network namespace ensures that both containers can use port 80 without conflict. Each container's network namespace is isolated, allowing them to have their own IP addresses, network interfaces, and routing tables. + +Container 1: +- Network Namespace: Isolated +- IP Address: 172.17.0.2 +- Port 80: Mapped to 8080 + +Container 2: +- Network Namespace: Isolated +- IP Address: 172.17.0.3 +- Port 80: Mapped to 8081 + +### 12. What is a Docker registry? + +A Docker registry is a centralized repository that stores Docker images. It allows you to manage, distribute, and share Docker images across different environments and teams. Docker Hub is one of the most popular public Docker registries, but you can also set up private registries to control image distribution within your organization. + +Here's a brief overview of a Docker registry along with an example: + +**Public Docker Registry (Docker Hub):** +Docker Hub is a public registry where you can find and share Docker images. It's commonly used for open-source projects and public applications. You can pull images from Docker Hub to your local machine or directly to your server for deployment. + +**Private Docker Registry:** +A private Docker registry is used to store images that are not meant to be shared publicly. You can set up your own private registry to maintain control over image distribution, security, and access within your organization. + +**Example: Using Docker Hub** + +1. **Pulling an Image:** + Let's say you want to use the official `nginx` web server image from Docker Hub. + + ``` + docker pull nginx + ``` + +2. **Pushing an Image (Private Registry):** + If you have your own private registry, you can push an image to it. Here, we'll use a hypothetical private registry at `registry.example.com`. + + ``` + docker tag nginx registry.example.com/my-nginx + docker push registry.example.com/my-nginx + ``` + +3. **Pulling an Image from Private Registry:** + To pull an image from your private registry, you need to log in first. + + ``` + docker login registry.example.com + docker pull registry.example.com/my-nginx + ``` + +### 13. What is an entry point? + +In Docker, the `ENTRYPOINT` instruction is used in a Dockerfile to specify the command that will be executed when a container is started from an image. It essentially sets the default command that will run as the primary process inside the container. This command can be overridden when the container is run by providing additional arguments. + +Here's a brief explanation of the `ENTRYPOINT` instruction: + +**Usage:** +The `ENTRYPOINT` instruction is used in a Dockerfile to define the primary command to run when the container starts. + +**Example:** +Consider a Dockerfile for a Python application that runs a script named `app.py`. You can use the `ENTRYPOINT` instruction to set the default command for the container: + +```Dockerfile +FROM python:3.9 + +WORKDIR /app + +COPY app.py . + +ENTRYPOINT ["python", "app.py"] +``` + +In this example, the `ENTRYPOINT` is set to `["python", "app.py"]`. When you run a container from this image, the `app.py` script will be executed as the primary process. + +### 14. How to implement CI/CD in Docker? + +Refer Blog : [How to build a CI/CD pipeline with Docker](https://circleci.com/blog/build-cicd-piplines-using-docker/) + +### 15. Will data on the container be lost when the docker container exits? + +Yes, by default, any data stored within a Docker container will be lost when the container exits. Docker containers are designed to be ephemeral, meaning they are created and destroyed as needed. When a container is stopped or removed, the data within it, such as files, databases, and changes made during its runtime, will not persist unless you take specific steps to ensure data persistence. + +To retain data across container restarts or removals, you can use the following approaches: + +1. **Docker Volumes:** + Docker volumes are a way to store data outside the container's filesystem, ensuring that the data persists even if the container is removed. Volumes can be used to store application data, configuration files, and databases. You can attach volumes to containers using the `-v` or `--volume` flag when running the `docker run` command. + + Example: + ```sh + docker run -v /path/on/host:/path/in/container my-app + ``` + +2. **Docker Bind Mounts:** + Similar to volumes, bind mounts allow you to map a host system directory into a container. Changes made to files in the bind mount on the host are reflected immediately in the container, and vice versa. This provides more flexibility compared to volumes. + + Example: + ```sh + docker run -v /host/directory:/container/directory my-app + ``` + +3. **Named Volumes:** + Docker also supports creating named volumes, which are managed by Docker and can be shared between multiple containers. Named volumes make it easier to manage and reuse data across containers. + + Example: + ```sh + docker run -v my-volume:/data my-app + ``` + +4. **Docker Compose:** + When using Docker Compose, you can define volumes in your `docker-compose.yml` file to ensure data persistence across services defined in the compose file. + + Example: + ```yaml + version: "3" + services: + web: + image: nginx + volumes: + - my-volume:/usr/share/nginx/html + volumes: + my-volume: + ``` + +By using these methods, you can ensure that important data and changes made within a Docker container are preserved even after the container exits, restarts, or is removed. + +### 16. What is a Docker swarm? + +Docker Swarm, also known as Docker Swarm Mode, is a native clustering and orchestration solution for Docker. It allows you to create and manage a cluster of Docker nodes (machines) that work together as a single virtual Docker host. Docker Swarm provides a simple and integrated way to deploy and manage containerized applications at scale. + +Here's a brief overview of Docker Swarm: + +**Key Concepts:** + +1. **Manager Nodes:** These are the control plane nodes that manage the cluster and orchestrate the deployment of services and tasks. + +2. **Worker Nodes:** These are the worker machines that run containers based on the instructions provided by the manager nodes. + +3. **Services:** Services are the declarative definitions of tasks to be run on the swarm. They define how many replicas of a container should run, which image to use, ports to expose, and more. + +4. **Tasks:** Tasks are individual units of work that run containers as part of a service. Each replica of a service is a task. + +5. **Load Balancing:** Docker Swarm provides built-in load balancing for services across the worker nodes. + +6. **Overlay Networking:** Swarm supports overlay networking, allowing containers to communicate with each other across nodes as if they were on the same network. + +7. **Rolling Updates and Rollbacks:** Swarm enables rolling updates and rollbacks for services, ensuring minimal downtime during updates. + +8. **High Availability:** Swarm supports high availability by allowing you to create manager node replicas, preventing a single point of failure. + +### 17. What are the docker commands for the following: + +- **View Running Containers:** + ``` + docker ps + ``` + +- **Run Container with a Specific Name:** + ``` + docker run --name my-container my-image + ``` + +- **Export a Docker Container:** + ``` + docker export my-container > container-export.tar + ``` + +- **Import an Existing Docker Image:** + ```sh + docker import container-export.tar my-imported-image + ``` + +- **Delete a Container:** + ``` + docker rm my-container + ``` + +- **Remove Stopped Containers, Unused Networks, Build Caches, and Dangling Images:** + ``` + docker system prune + ``` + + You can also use the `-a` flag to remove all unused images, not just dangling ones. + + ``` + docker system prune -a + ``` +

+Parag Pallav Singh LinkedIn +Parag Pallav Singh Facebook +Parag Pallav Singh Twitter +Parag Pallav Singh Blog From 413b1e0733f670d039f49f6a2b3d1c223d17a56d Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh <40052830+paragpallavsingh@users.noreply.github.com> Date: Fri, 25 Aug 2023 13:20:09 +0530 Subject: [PATCH 166/394] Update README.md --- submission/day21/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/submission/day21/README.md b/submission/day21/README.md index 3c6296f100..9a39643b14 100644 --- a/submission/day21/README.md +++ b/submission/day21/README.md @@ -1,4 +1,7 @@ -## Day 21 Task: Docker Important interview Questions. +## Day 21 Task: Docker Essential Concepts + + + ## Docker Interview From 9dc60201f0c2c078ba17812bce2f4456e24e97a2 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Sat, 26 Aug 2023 17:50:59 +0530 Subject: [PATCH 167/394] rename tasks.md to README.md for good rendering --- 2023/day01/{tasks.md => README.md} | 0 2023/day02/{tasks.md => README.md} | 0 2023/day03/{tasks.md => README.md} | 0 2023/day04/{tasks.md => README.md} | 0 2023/day05/{tasks.md => README.md} | 0 2023/day06/{tasks.md => README.md} | 0 2023/day07/{tasks.md => README.md} | 0 2023/day08/{tasks.md => README.md} | 102 +++++++++--------- 2023/day09/{tasks.md => README.md} | 56 +++++----- 2023/day10/{tasks.md => README.md} | 0 2023/day11/{tasks.md => README.md} | 114 ++++++++++---------- 2023/day12/{tasks.md => README.md} | 34 +++--- 2023/day13/{tasks.md => README.md} | 58 +++++------ 2023/day14/{tasks.md => README.md} | 122 +++++++++++----------- 2023/day15/{tasks.md => README.md} | 0 2023/day16/{tasks.md => README.md} | 0 2023/day17/{tasks.md => README.md} | 62 +++++------ 2023/day18/{tasks.md => README.md} | 86 ++++++++-------- 2023/day19/{tasks.md => README.md} | 78 +++++++------- 2023/day20/{tasks.md => README.md} | 32 +++--- 2023/day21/{tasks.md => README.md} | 0 2023/day22/{tasks.md => README.md} | 60 +++++------ 2023/day23/{tasks.md => README.md} | 80 +++++++-------- 2023/day24/{tasks.md => README.md} | 0 2023/day25/{tasks.md => README.md} | 0 2023/day26/{tasks.md => README.md} | 0 2023/day27/{tasks.md => README.md} | 0 2023/day28/{tasks.md => README.md} | 0 2023/day29/{tasks.md => README.md} | 66 ++++++------ 2023/day30/{tasks.md => README.md} | 0 2023/day31/{tasks.md => README.md} | 130 +++++++++++------------ 2023/day32/{tasks.md => README.md} | 54 +++++----- 2023/day33/{tasks.md => README.md} | 68 ++++++------ 2023/day34/{tasks.md => README.md} | 72 ++++++------- 2023/day35/{tasks.md => README.md} | 74 ++++++------- 2023/day36/{tasks.md => README.md} | 102 +++++++++--------- 2023/day37/{tasks.md => README.md} | 86 ++++++++-------- 2023/day38/{tasks.md => README.md} | 60 +++++------ 2023/day39/{tasks.md => README.md} | 82 +++++++-------- 2023/day40/{tasks.md => README.md} | 0 2023/day41/{tasks.md => README.md} | 106 +++++++++---------- 2023/day42/{tasks.md => README.md} | 0 2023/day43/{tasks.md => README.md} | 64 ++++++------ 2023/day44/{tasks.md => README.md} | 0 2023/day45/{tasks.md => README.md} | 0 2023/day46/{tasks.md => README.md} | 70 ++++++------- 2023/day47/{tasks.md => README.md} | 42 ++++---- 2023/day48/{tasks.md => README.md} | 80 +++++++-------- 2023/day49/{tasks.md => README.md} | 50 ++++----- 2023/day50/{tasks.md => README.md} | 0 2023/day51/{tasks.md => README.md} | 0 2023/day52/{tasks.md => README.md} | 0 2023/day53/{tasks.md => README.md} | 0 2023/day54/{tasks.md => README.md} | 0 2023/day55/{tasks.md => README.md} | 0 2023/day56/{tasks.md => README.md} | 0 2023/day57/{tasks.md => README.md} | 0 2023/day58/{tasks.md => README.md} | 0 2023/day59/{tasks.md => README.md} | 0 2023/day60/{tasks.md => README.md} | 62 +++++------ 2023/day61/{tasks.md => README.md} | 74 ++++++------- 2023/day62/{tasks.md => README.md} | 0 2023/day63/{tasks.md => README.md} | 0 2023/day64/{tasks.md => README.md} | 0 2023/day65/{tasks.md => README.md} | 134 ++++++++++++------------ 2023/day66/{tasks.md => README.md} | 52 +++++----- 2023/day67/{tasks.md => README.md} | 44 ++++---- 2023/day68/{tasks.md => README.md} | 132 ++++++++++++------------ 2023/day69/{tasks.md => README.md} | 0 2023/day70/{tasks.md => README.md} | 160 ++++++++++++++--------------- 2023/day71/{tasks.md => README.md} | 82 +++++++-------- 2023/day72/{tasks.md => README.md} | 32 +++--- 2023/day73/{tasks.md => README.md} | 32 +++--- 2023/day74/{tasks.md => README.md} | 38 +++---- 2023/day75/{tasks.md => README.md} | 60 +++++------ 2023/day76/{tasks.md => README.md} | 0 2023/day77/{tasks.md => README.md} | 0 2023/day78/{tasks.md => README.md} | 28 ++--- 2023/day79/{tasks.md => README.md} | 40 ++++---- 2023/day80/{tasks.md => README.md} | 0 2023/day81/{tasks.md => README.md} | 0 2023/day82/{tasks.md => README.md} | 0 2023/day83/{tasks.md => README.md} | 0 2023/day84/{tasks.md => README.md} | 0 2023/day85/{tasks.md => README.md} | 0 2023/day86/{tasks.md => README.md} | 0 2023/day87/{tasks.md => README.md} | 48 ++++----- 2023/day88/{tasks.md => README.md} | 0 2023/day89/{tasks.md => README.md} | 38 +++---- 2023/day90/{tasks.md => README.md} | 0 90 files changed, 1573 insertions(+), 1573 deletions(-) rename 2023/day01/{tasks.md => README.md} (100%) rename 2023/day02/{tasks.md => README.md} (100%) rename 2023/day03/{tasks.md => README.md} (100%) rename 2023/day04/{tasks.md => README.md} (100%) rename 2023/day05/{tasks.md => README.md} (100%) rename 2023/day06/{tasks.md => README.md} (100%) rename 2023/day07/{tasks.md => README.md} (100%) rename 2023/day08/{tasks.md => README.md} (98%) rename 2023/day09/{tasks.md => README.md} (97%) rename 2023/day10/{tasks.md => README.md} (100%) rename 2023/day11/{tasks.md => README.md} (98%) rename 2023/day12/{tasks.md => README.md} (97%) rename 2023/day13/{tasks.md => README.md} (97%) rename 2023/day14/{tasks.md => README.md} (97%) rename 2023/day15/{tasks.md => README.md} (100%) rename 2023/day16/{tasks.md => README.md} (100%) rename 2023/day17/{tasks.md => README.md} (98%) rename 2023/day18/{tasks.md => README.md} (98%) rename 2023/day19/{tasks.md => README.md} (98%) rename 2023/day20/{tasks.md => README.md} (98%) rename 2023/day21/{tasks.md => README.md} (100%) rename 2023/day22/{tasks.md => README.md} (98%) rename 2023/day23/{tasks.md => README.md} (98%) rename 2023/day24/{tasks.md => README.md} (100%) rename 2023/day25/{tasks.md => README.md} (100%) rename 2023/day26/{tasks.md => README.md} (100%) rename 2023/day27/{tasks.md => README.md} (100%) rename 2023/day28/{tasks.md => README.md} (100%) rename 2023/day29/{tasks.md => README.md} (97%) rename 2023/day30/{tasks.md => README.md} (100%) rename 2023/day31/{tasks.md => README.md} (97%) rename 2023/day32/{tasks.md => README.md} (97%) rename 2023/day33/{tasks.md => README.md} (97%) rename 2023/day34/{tasks.md => README.md} (98%) rename 2023/day35/{tasks.md => README.md} (98%) rename 2023/day36/{tasks.md => README.md} (98%) rename 2023/day37/{tasks.md => README.md} (96%) rename 2023/day38/{tasks.md => README.md} (98%) rename 2023/day39/{tasks.md => README.md} (98%) rename 2023/day40/{tasks.md => README.md} (100%) rename 2023/day41/{tasks.md => README.md} (98%) rename 2023/day42/{tasks.md => README.md} (100%) rename 2023/day43/{tasks.md => README.md} (98%) rename 2023/day44/{tasks.md => README.md} (100%) rename 2023/day45/{tasks.md => README.md} (100%) rename 2023/day46/{tasks.md => README.md} (98%) rename 2023/day47/{tasks.md => README.md} (98%) rename 2023/day48/{tasks.md => README.md} (98%) rename 2023/day49/{tasks.md => README.md} (98%) rename 2023/day50/{tasks.md => README.md} (100%) rename 2023/day51/{tasks.md => README.md} (100%) rename 2023/day52/{tasks.md => README.md} (100%) rename 2023/day53/{tasks.md => README.md} (100%) rename 2023/day54/{tasks.md => README.md} (100%) rename 2023/day55/{tasks.md => README.md} (100%) rename 2023/day56/{tasks.md => README.md} (100%) rename 2023/day57/{tasks.md => README.md} (100%) rename 2023/day58/{tasks.md => README.md} (100%) rename 2023/day59/{tasks.md => README.md} (100%) rename 2023/day60/{tasks.md => README.md} (97%) rename 2023/day61/{tasks.md => README.md} (95%) rename 2023/day62/{tasks.md => README.md} (100%) rename 2023/day63/{tasks.md => README.md} (100%) rename 2023/day64/{tasks.md => README.md} (100%) rename 2023/day65/{tasks.md => README.md} (97%) rename 2023/day66/{tasks.md => README.md} (98%) rename 2023/day67/{tasks.md => README.md} (97%) rename 2023/day68/{tasks.md => README.md} (97%) rename 2023/day69/{tasks.md => README.md} (100%) rename 2023/day70/{tasks.md => README.md} (96%) rename 2023/day71/{tasks.md => README.md} (97%) rename 2023/day72/{tasks.md => README.md} (97%) rename 2023/day73/{tasks.md => README.md} (96%) rename 2023/day74/{tasks.md => README.md} (95%) rename 2023/day75/{tasks.md => README.md} (97%) rename 2023/day76/{tasks.md => README.md} (100%) rename 2023/day77/{tasks.md => README.md} (100%) rename 2023/day78/{tasks.md => README.md} (96%) rename 2023/day79/{tasks.md => README.md} (97%) rename 2023/day80/{tasks.md => README.md} (100%) rename 2023/day81/{tasks.md => README.md} (100%) rename 2023/day82/{tasks.md => README.md} (100%) rename 2023/day83/{tasks.md => README.md} (100%) rename 2023/day84/{tasks.md => README.md} (100%) rename 2023/day85/{tasks.md => README.md} (100%) rename 2023/day86/{tasks.md => README.md} (100%) rename 2023/day87/{tasks.md => README.md} (96%) rename 2023/day88/{tasks.md => README.md} (100%) rename 2023/day89/{tasks.md => README.md} (96%) rename 2023/day90/{tasks.md => README.md} (100%) diff --git a/2023/day01/tasks.md b/2023/day01/README.md similarity index 100% rename from 2023/day01/tasks.md rename to 2023/day01/README.md diff --git a/2023/day02/tasks.md b/2023/day02/README.md similarity index 100% rename from 2023/day02/tasks.md rename to 2023/day02/README.md diff --git a/2023/day03/tasks.md b/2023/day03/README.md similarity index 100% rename from 2023/day03/tasks.md rename to 2023/day03/README.md diff --git a/2023/day04/tasks.md b/2023/day04/README.md similarity index 100% rename from 2023/day04/tasks.md rename to 2023/day04/README.md diff --git a/2023/day05/tasks.md b/2023/day05/README.md similarity index 100% rename from 2023/day05/tasks.md rename to 2023/day05/README.md diff --git a/2023/day06/tasks.md b/2023/day06/README.md similarity index 100% rename from 2023/day06/tasks.md rename to 2023/day06/README.md diff --git a/2023/day07/tasks.md b/2023/day07/README.md similarity index 100% rename from 2023/day07/tasks.md rename to 2023/day07/README.md diff --git a/2023/day08/tasks.md b/2023/day08/README.md similarity index 98% rename from 2023/day08/tasks.md rename to 2023/day08/README.md index 84edf082cf..f695de7680 100644 --- a/2023/day08/tasks.md +++ b/2023/day08/README.md @@ -1,51 +1,51 @@ -# Day 8 Task: Basic Git & GitHub for DevOps Engineers. - -## What is Git? - -Git is a version control system that allows you to track changes to files and coordinate work on those files among multiple people. It is commonly used for software development, but it can be used to track changes to any set of files. - -With Git, you can keep a record of who made changes to what part of a file, and you can revert back to earlier versions of the file if needed. Git also makes it easy to collaborate with others, as you can share changes and merge the changes made by different people into a single version of a file. - -## What is Github? - -GitHub is a web-based platform that provides hosting for version control using Git. It is a subsidiary of Microsoft, and it offers all of the distributed version control and source code management (SCM) functionality of Git as well as adding its own features. GitHub is a very popular platform for developers to share and collaborate on projects, and it is also used for hosting open-source projects. - -## What is Version Control? How many types of version controls we have? - -Version control is a system that tracks changes to a file or set of files over time so that you can recall specific versions later. It allows you to revert files back to a previous state, revert the entire project back to a previous state, compare changes over time, see who last modified something that might be causing a problem, who introduced an issue and when, and more. - -There are two main types of version control systems: centralized version control systems and distributed version control systems. - -1. A centralized version control system (CVCS) uses a central server to store all the versions of a project's files. Developers "check out" files from the central server, make changes, and then "check in" the updated files. Examples of CVCS include Subversion and Perforce. - -2. A distributed version control system (DVCS) allows developers to "clone" an entire repository, including the entire version history of the project. This means that they have a complete local copy of the repository, including all branches and past versions. Developers can work independently and then later merge their changes back into the main repository. Examples of DVCS include Git, Mercurial, and Darcs. - -## Why we use distributed version control over centralized version control? - -1. Better collaboration: In a DVCS, every developer has a full copy of the repository, including the entire history of all changes. This makes it easier for developers to work together, as they don't have to constantly communicate with a central server to commit their changes or to see the changes made by others. - -2. Improved speed: Because developers have a local copy of the repository, they can commit their changes and perform other version control actions faster, as they don't have to communicate with a central server. - -3. Greater flexibility: With a DVCS, developers can work offline and commit their changes later when they do have an internet connection. They can also choose to share their changes with only a subset of the team, rather than pushing all of their changes to a central server. - -4. Enhanced security: In a DVCS, the repository history is stored on multiple servers and computers, which makes it more resistant to data loss. If the central server in a CVCS goes down or the repository becomes corrupted, it can be difficult to recover the lost data. - -Overall, the decentralized nature of a DVCS allows for greater collaboration, flexibility, and security, making it a popular choice for many teams. - -## Task: - -- Install Git on your computer (if it is not already installed). You can download it from the official website at https://git-scm.com/downloads -- Create a free account on GitHub (if you don't already have one). You can sign up at https://github.com/ -- Learn the basics of Git by reading through the [video](https://youtu.be/AT1uxOLsCdk) This will give you an understanding of what Git is, how it works, and how to use it to track changes to files. - -## Exercises: - -1. Create a new repository on GitHub and clone it to your local machine -2. Make some changes to a file in the repository and commit them to the repository using Git -3. Push the changes back to the repository on GitHub - -Reff :- https://youtu.be/AT1uxOLsCdk - -Post your daily work on Linkedin and le me know , writing an article is the best :) - -[← Previous Day](../day07/tasks.md) | [Next Day →](../day09/tasks.md) +# Day 8 Task: Basic Git & GitHub for DevOps Engineers. + +## What is Git? + +Git is a version control system that allows you to track changes to files and coordinate work on those files among multiple people. It is commonly used for software development, but it can be used to track changes to any set of files. + +With Git, you can keep a record of who made changes to what part of a file, and you can revert back to earlier versions of the file if needed. Git also makes it easy to collaborate with others, as you can share changes and merge the changes made by different people into a single version of a file. + +## What is Github? + +GitHub is a web-based platform that provides hosting for version control using Git. It is a subsidiary of Microsoft, and it offers all of the distributed version control and source code management (SCM) functionality of Git as well as adding its own features. GitHub is a very popular platform for developers to share and collaborate on projects, and it is also used for hosting open-source projects. + +## What is Version Control? How many types of version controls we have? + +Version control is a system that tracks changes to a file or set of files over time so that you can recall specific versions later. It allows you to revert files back to a previous state, revert the entire project back to a previous state, compare changes over time, see who last modified something that might be causing a problem, who introduced an issue and when, and more. + +There are two main types of version control systems: centralized version control systems and distributed version control systems. + +1. A centralized version control system (CVCS) uses a central server to store all the versions of a project's files. Developers "check out" files from the central server, make changes, and then "check in" the updated files. Examples of CVCS include Subversion and Perforce. + +2. A distributed version control system (DVCS) allows developers to "clone" an entire repository, including the entire version history of the project. This means that they have a complete local copy of the repository, including all branches and past versions. Developers can work independently and then later merge their changes back into the main repository. Examples of DVCS include Git, Mercurial, and Darcs. + +## Why we use distributed version control over centralized version control? + +1. Better collaboration: In a DVCS, every developer has a full copy of the repository, including the entire history of all changes. This makes it easier for developers to work together, as they don't have to constantly communicate with a central server to commit their changes or to see the changes made by others. + +2. Improved speed: Because developers have a local copy of the repository, they can commit their changes and perform other version control actions faster, as they don't have to communicate with a central server. + +3. Greater flexibility: With a DVCS, developers can work offline and commit their changes later when they do have an internet connection. They can also choose to share their changes with only a subset of the team, rather than pushing all of their changes to a central server. + +4. Enhanced security: In a DVCS, the repository history is stored on multiple servers and computers, which makes it more resistant to data loss. If the central server in a CVCS goes down or the repository becomes corrupted, it can be difficult to recover the lost data. + +Overall, the decentralized nature of a DVCS allows for greater collaboration, flexibility, and security, making it a popular choice for many teams. + +## Task: + +- Install Git on your computer (if it is not already installed). You can download it from the official website at https://git-scm.com/downloads +- Create a free account on GitHub (if you don't already have one). You can sign up at https://github.com/ +- Learn the basics of Git by reading through the [video](https://youtu.be/AT1uxOLsCdk) This will give you an understanding of what Git is, how it works, and how to use it to track changes to files. + +## Exercises: + +1. Create a new repository on GitHub and clone it to your local machine +2. Make some changes to a file in the repository and commit them to the repository using Git +3. Push the changes back to the repository on GitHub + +Reff :- https://youtu.be/AT1uxOLsCdk + +Post your daily work on Linkedin and le me know , writing an article is the best :) + +[← Previous Day](../day07/tasks.md) | [Next Day →](../day09/tasks.md) diff --git a/2023/day09/tasks.md b/2023/day09/README.md similarity index 97% rename from 2023/day09/tasks.md rename to 2023/day09/README.md index a25a3a91aa..25c3197aa8 100644 --- a/2023/day09/tasks.md +++ b/2023/day09/README.md @@ -1,28 +1,28 @@ -# Day 9 Task: Deep Dive in Git & GitHub for DevOps Engineers. - -## Find the answers by your understandings(Shoulden't be copied by internet & used hand-made diagrams) of below quistions and Write blog on it. - -1. What is Git and why is it important? -2. What is difference Between Main Branch and Master Branch?? -3. Can you explain the difference between Git and GitHub? -4. How do you create a new repository on GitHub? -5. What is difference between local & remote repository? How to connect local to remote? - -## Tasks - -task-1: - -- Set your user name and email address, which will be associated with your commits. - -task-2: - -- Create a repository named "Devops" on GitHub -- Connect your local repository to the repository on GitHub. -- Create a new file in Devops/Git/Day-02.txt & add some content to it -- Push your local commits to the repository on GitHub - -reff :- https://youtu.be/AT1uxOLsCdk - -Note: These steps assume that you have already installed Git on your computer and have created a GitHub account. If you need help with these prerequisites, you can refer to the [day-08](https://github.com/LondheShubham153/90DaysOfDevOps/blob/ee7c53f276edb02a85a97282027028295be17c04/2023/day08/tasks.md) - -[← Previous Day](../day08/tasks.md) | [Next Day →](../day10/tasks.md) +# Day 9 Task: Deep Dive in Git & GitHub for DevOps Engineers. + +## Find the answers by your understandings(Shoulden't be copied by internet & used hand-made diagrams) of below quistions and Write blog on it. + +1. What is Git and why is it important? +2. What is difference Between Main Branch and Master Branch?? +3. Can you explain the difference between Git and GitHub? +4. How do you create a new repository on GitHub? +5. What is difference between local & remote repository? How to connect local to remote? + +## Tasks + +task-1: + +- Set your user name and email address, which will be associated with your commits. + +task-2: + +- Create a repository named "Devops" on GitHub +- Connect your local repository to the repository on GitHub. +- Create a new file in Devops/Git/Day-02.txt & add some content to it +- Push your local commits to the repository on GitHub + +reff :- https://youtu.be/AT1uxOLsCdk + +Note: These steps assume that you have already installed Git on your computer and have created a GitHub account. If you need help with these prerequisites, you can refer to the [day-08](https://github.com/LondheShubham153/90DaysOfDevOps/blob/ee7c53f276edb02a85a97282027028295be17c04/2023/day08/tasks.md) + +[← Previous Day](../day08/tasks.md) | [Next Day →](../day10/tasks.md) diff --git a/2023/day10/tasks.md b/2023/day10/README.md similarity index 100% rename from 2023/day10/tasks.md rename to 2023/day10/README.md diff --git a/2023/day11/tasks.md b/2023/day11/README.md similarity index 98% rename from 2023/day11/tasks.md rename to 2023/day11/README.md index 2dd52c88c2..018810b3e5 100644 --- a/2023/day11/tasks.md +++ b/2023/day11/README.md @@ -1,57 +1,57 @@ -# Day 11 Task: Advance Git & GitHub for DevOps Engineers: Part-2 - -## Git Stash: - -Git stash is a command that allows you to temporarily save changes you have made in your working directory, without committing them. This is useful when you need to switch to a different branch to work on something else, but you don't want to commit the changes you've made in your current branch yet. - -To use Git stash, you first create a new branch and make some changes to it. Then you can use the command git stash to save those changes. This will remove the changes from your working directory and record them in a new stash. You can apply these changes later. git stash list command shows the list of stashed changes. - -You can also use git stash drop to delete a stash and git stash clear to delete all the stashes. - -## Cherry-pick: - -Git cherry-pick is a command that allows you to select specific commits from one branch and apply them to another. This can be useful when you want to selectively apply changes that were made in one branch to another. - -To use git cherry-pick, you first create two new branches and make some commits to them. Then you use git cherry-pick command to select the specific commits from one branch and apply them to the other. - -## Resolving Conflicts: - -Conflicts can occur when you merge or rebase branches that have diverged, and you need to manually resolve the conflicts before git can proceed with the merge/rebase. -git status command shows the files that have conflicts, git diff command shows the difference between the conflicting versions and git add command is used to add the resolved files. - -# Task-01 - -- Create a new branch and make some changes to it. -- Use git stash to save the changes without committing them. -- Switch to a different branch, make some changes and commit them. -- Use git stash pop to bring the changes back and apply them on top of the new commits. - -# Task-02 - -- In version01.txt of development branch add below lines after “This is the bug fix in development branch” that you added in Day10 and reverted to this commit. -- Line2>> After bug fixing, this is the new feature with minor alteration” - - Commit this with message “ Added feature2.1 in development branch” - -- Line3>> This is the advancement of previous feature - - Commit this with message “ Added feature2.2 in development branch” - -- Line4>> Feature 2 is completed and ready for release - - Commit this with message “ Feature2 completed” - -- All these commits messages should be reflected in Production branch too which will come out from Master branch (Hint: try rebase). - -# Task-03 - -- In Production branch Cherry pick Commit “Added feature2.2 in development branch” and added below lines in it: -- Line to be added after Line3>> This is the advancement of previous feature -- Line4>>Added few more changes to make it more optimized. -- Commit: Optimized the feature - -## Reference [video](https://youtu.be/apGV9Kg7ics) - -You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. Happy Learning :) - -[← Previous Day](../day10/tasks.md) | [Next Day →](../day12/tasks.md) +# Day 11 Task: Advance Git & GitHub for DevOps Engineers: Part-2 + +## Git Stash: + +Git stash is a command that allows you to temporarily save changes you have made in your working directory, without committing them. This is useful when you need to switch to a different branch to work on something else, but you don't want to commit the changes you've made in your current branch yet. + +To use Git stash, you first create a new branch and make some changes to it. Then you can use the command git stash to save those changes. This will remove the changes from your working directory and record them in a new stash. You can apply these changes later. git stash list command shows the list of stashed changes. + +You can also use git stash drop to delete a stash and git stash clear to delete all the stashes. + +## Cherry-pick: + +Git cherry-pick is a command that allows you to select specific commits from one branch and apply them to another. This can be useful when you want to selectively apply changes that were made in one branch to another. + +To use git cherry-pick, you first create two new branches and make some commits to them. Then you use git cherry-pick command to select the specific commits from one branch and apply them to the other. + +## Resolving Conflicts: + +Conflicts can occur when you merge or rebase branches that have diverged, and you need to manually resolve the conflicts before git can proceed with the merge/rebase. +git status command shows the files that have conflicts, git diff command shows the difference between the conflicting versions and git add command is used to add the resolved files. + +# Task-01 + +- Create a new branch and make some changes to it. +- Use git stash to save the changes without committing them. +- Switch to a different branch, make some changes and commit them. +- Use git stash pop to bring the changes back and apply them on top of the new commits. + +# Task-02 + +- In version01.txt of development branch add below lines after “This is the bug fix in development branch” that you added in Day10 and reverted to this commit. +- Line2>> After bug fixing, this is the new feature with minor alteration” + + Commit this with message “ Added feature2.1 in development branch” + +- Line3>> This is the advancement of previous feature + + Commit this with message “ Added feature2.2 in development branch” + +- Line4>> Feature 2 is completed and ready for release + + Commit this with message “ Feature2 completed” + +- All these commits messages should be reflected in Production branch too which will come out from Master branch (Hint: try rebase). + +# Task-03 + +- In Production branch Cherry pick Commit “Added feature2.2 in development branch” and added below lines in it: +- Line to be added after Line3>> This is the advancement of previous feature +- Line4>>Added few more changes to make it more optimized. +- Commit: Optimized the feature + +## Reference [video](https://youtu.be/apGV9Kg7ics) + +You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. Happy Learning :) + +[← Previous Day](../day10/tasks.md) | [Next Day →](../day12/tasks.md) diff --git a/2023/day12/tasks.md b/2023/day12/README.md similarity index 97% rename from 2023/day12/tasks.md rename to 2023/day12/README.md index 4f42e3554d..e5ec5a8f1c 100644 --- a/2023/day12/tasks.md +++ b/2023/day12/README.md @@ -1,17 +1,17 @@ -## Finally!! 🎉 - -You have completed the Linux & Git-GitHub handson and I hope you have learned something interesting from it.🙌 - -Now why not make an interesting 😉 assignment, which not only will help you for the future but also for the DevOps Community! - -Let’s make a well articulated and documented **"cheat-sheet"** with all the commands you learned so far in Linux, Git-GitHub and brief info about its usage. - -Let’s show us your knowledge mixed with your creativity😎 - -_I have added a [cheatsheet](https://www.sqltutorial.org/wp-content/uploads/2016/04/SQL-Cheat-Sheet-2.png) for your reference, Make sure every cheatsheet must be UNIQUE_ - -Post it on Linkedin and Spread the knowledge.😃 - -**Happy Learning :)** - -[← Previous Day](../day11/tasks.md) | [Next Day →](../day13/tasks.md) +## Finally!! 🎉 + +You have completed the Linux & Git-GitHub handson and I hope you have learned something interesting from it.🙌 + +Now why not make an interesting 😉 assignment, which not only will help you for the future but also for the DevOps Community! + +Let’s make a well articulated and documented **"cheat-sheet"** with all the commands you learned so far in Linux, Git-GitHub and brief info about its usage. + +Let’s show us your knowledge mixed with your creativity😎 + +_I have added a [cheatsheet](https://www.sqltutorial.org/wp-content/uploads/2016/04/SQL-Cheat-Sheet-2.png) for your reference, Make sure every cheatsheet must be UNIQUE_ + +Post it on Linkedin and Spread the knowledge.😃 + +**Happy Learning :)** + +[← Previous Day](../day11/tasks.md) | [Next Day →](../day13/tasks.md) diff --git a/2023/day13/tasks.md b/2023/day13/README.md similarity index 97% rename from 2023/day13/tasks.md rename to 2023/day13/README.md index d33f2f10c7..78613a6903 100644 --- a/2023/day13/tasks.md +++ b/2023/day13/README.md @@ -1,29 +1,29 @@ -Hello Dosto 😎 - -Let's Start with Basics of Python as this is also important for Devops Engineer to build the logic and Programs. - -**What is Python?** - -- Python is a Open source, general purpose, high level, and object-oriented programming language. -- It was created by **Guido van Rossum** -- Python consists of vast libraries and various frameworks like Django,Tensorflow, Flask, Pandas, Keras etc. - -**How to Install Python?** - -You can install Python in your System whether it is window, MacOS, ubuntu, centos etc. Below are the links for the installation: - -- [Windows Installation](https://www.python.org/downloads/) -- Ubuntu: apt-get install python3.6 - -Task1: - -1. Install Python in your respective OS, and check the version. -2. Read about different Data Types in Python. - -You can get the complete Playlist [here](https://www.youtube.com/watch?v=abPgj_3hzVY&list=PLlfy9GnSVerS_L5z0COaF7rsbgWmJXTOM)🙌 - -Don't forget to share your Journey over linkedin. Let the community know that you have started another chapter of your Journey. - -Happy Learning, Ruko Mat Phod do😃 - -[← Previous Day](../day12/tasks.md) | [Next Day →](../day14/tasks.md) +Hello Dosto 😎 + +Let's Start with Basics of Python as this is also important for Devops Engineer to build the logic and Programs. + +**What is Python?** + +- Python is a Open source, general purpose, high level, and object-oriented programming language. +- It was created by **Guido van Rossum** +- Python consists of vast libraries and various frameworks like Django,Tensorflow, Flask, Pandas, Keras etc. + +**How to Install Python?** + +You can install Python in your System whether it is window, MacOS, ubuntu, centos etc. Below are the links for the installation: + +- [Windows Installation](https://www.python.org/downloads/) +- Ubuntu: apt-get install python3.6 + +Task1: + +1. Install Python in your respective OS, and check the version. +2. Read about different Data Types in Python. + +You can get the complete Playlist [here](https://www.youtube.com/watch?v=abPgj_3hzVY&list=PLlfy9GnSVerS_L5z0COaF7rsbgWmJXTOM)🙌 + +Don't forget to share your Journey over linkedin. Let the community know that you have started another chapter of your Journey. + +Happy Learning, Ruko Mat Phod do😃 + +[← Previous Day](../day12/tasks.md) | [Next Day →](../day14/tasks.md) diff --git a/2023/day14/tasks.md b/2023/day14/README.md similarity index 97% rename from 2023/day14/tasks.md rename to 2023/day14/README.md index 82b16a68ee..7c72a3748f 100644 --- a/2023/day14/tasks.md +++ b/2023/day14/README.md @@ -1,61 +1,61 @@ -## Day 14 Task: Python Data Types and Data Structures for DevOps - -### New day, New Topic.... Let's learn along 😉 - -### Data Types - -- Data types are the classification or categorization of data items. It represents the kind of value that tells what operations can be performed on a particular data. -- Since everything is an object in Python programming, data types are actually classes and variables are instance (object) of these classes. -- Python has the following data types built-in by default: Numeric(Integer, complex, float), Sequential(string,lists, tuples), Boolean, Set, Dictionaries, etc - -To check what is the data type of the variable used, we can simply write: -`your_variable=100` -`type(your_variable)` - -### Data Structures - -Data Structures are a way of organizing data so that it can be accessed more efficiently depending upon the situation. Data Structures are fundamentals of any programming language around which a program is built. Python helps to learn the fundamental of these data structures in a simpler way as compared to other programming languages. - -- Lists - Python Lists are just like the arrays, declared in other languages which is an ordered collection of data. It is very flexible as the items in a list do not need to be of the same type - -- Tuple - Python Tuple is a collection of Python objects much like a list but Tuples are immutable in nature i.e. the elements in the tuple cannot be added or removed once created. Just like a List, a Tuple can also contain elements of various types. - -- Dictionary - Python dictionary is like hash tables in any other language with the time complexity of O(1). It is an unordered collection of data values, used to store data values like a map, which, unlike other Data Types that hold only a single value as an element, Dictionary holds the key:value pair. Key-value is provided in the dictionary to make it more optimized - -## Tasks - -1. Give the Difference between List, Tuple and set. Do Handson and put screenshots as per your understanding. -2. Create below Dictionary and use Dictionary methods to print your favourite tool just by using the keys of the Dictionary. - -``` -fav_tools = -{ - 1:"Linux", - 2:"Git", - 3:"Docker", - 4:"Kubernetes", - 5:"Terraform", - 6:"Ansible", - 7:"Chef" -} -``` - -3. Create a List of cloud service providers - eg. - -``` -cloud_providers = ["AWS","GCP","Azure"] -``` - -Write a program to add `Digital Ocean` to the list of cloud_providers and sort the list in alphabetical order. - -[Hint: Use keys to built in functions for Lists] - -If you want to deep dive further, Watch [Python](https://youtu.be/abPgj_3hzVY) - -You can share the learning with everyone over linkedin and tag us along 😃 - -[← Previous Day](../day13/tasks.md) | [Next Day →](../day15/tasks.md) +## Day 14 Task: Python Data Types and Data Structures for DevOps + +### New day, New Topic.... Let's learn along 😉 + +### Data Types + +- Data types are the classification or categorization of data items. It represents the kind of value that tells what operations can be performed on a particular data. +- Since everything is an object in Python programming, data types are actually classes and variables are instance (object) of these classes. +- Python has the following data types built-in by default: Numeric(Integer, complex, float), Sequential(string,lists, tuples), Boolean, Set, Dictionaries, etc + +To check what is the data type of the variable used, we can simply write: +`your_variable=100` +`type(your_variable)` + +### Data Structures + +Data Structures are a way of organizing data so that it can be accessed more efficiently depending upon the situation. Data Structures are fundamentals of any programming language around which a program is built. Python helps to learn the fundamental of these data structures in a simpler way as compared to other programming languages. + +- Lists + Python Lists are just like the arrays, declared in other languages which is an ordered collection of data. It is very flexible as the items in a list do not need to be of the same type + +- Tuple + Python Tuple is a collection of Python objects much like a list but Tuples are immutable in nature i.e. the elements in the tuple cannot be added or removed once created. Just like a List, a Tuple can also contain elements of various types. + +- Dictionary + Python dictionary is like hash tables in any other language with the time complexity of O(1). It is an unordered collection of data values, used to store data values like a map, which, unlike other Data Types that hold only a single value as an element, Dictionary holds the key:value pair. Key-value is provided in the dictionary to make it more optimized + +## Tasks + +1. Give the Difference between List, Tuple and set. Do Handson and put screenshots as per your understanding. +2. Create below Dictionary and use Dictionary methods to print your favourite tool just by using the keys of the Dictionary. + +``` +fav_tools = +{ + 1:"Linux", + 2:"Git", + 3:"Docker", + 4:"Kubernetes", + 5:"Terraform", + 6:"Ansible", + 7:"Chef" +} +``` + +3. Create a List of cloud service providers + eg. + +``` +cloud_providers = ["AWS","GCP","Azure"] +``` + +Write a program to add `Digital Ocean` to the list of cloud_providers and sort the list in alphabetical order. + +[Hint: Use keys to built in functions for Lists] + +If you want to deep dive further, Watch [Python](https://youtu.be/abPgj_3hzVY) + +You can share the learning with everyone over linkedin and tag us along 😃 + +[← Previous Day](../day13/tasks.md) | [Next Day →](../day15/tasks.md) diff --git a/2023/day15/tasks.md b/2023/day15/README.md similarity index 100% rename from 2023/day15/tasks.md rename to 2023/day15/README.md diff --git a/2023/day16/tasks.md b/2023/day16/README.md similarity index 100% rename from 2023/day16/tasks.md rename to 2023/day16/README.md diff --git a/2023/day17/tasks.md b/2023/day17/README.md similarity index 98% rename from 2023/day17/tasks.md rename to 2023/day17/README.md index c545883775..02aba5d132 100644 --- a/2023/day17/tasks.md +++ b/2023/day17/README.md @@ -1,31 +1,31 @@ -## Day 17 Task: Docker Project for DevOps Engineers. - -### You people are doing just amazing in **#90daysofdevops**. Today's challenge is so special Because You are going to do DevOps project today with Docker. Are You Exited 😍 - -# Dockerfile - -Docker is a tool that makes it easy to run applications in containers. Containers are like small packages that hold everything an application needs to run. To create these containers, developers use something called a Dockerfile. - -A Dockerfile is like a set of instructions for making a container. It tells Docker what base image to use, what commands to run, and what files to include. For example, if you were making a container for a website, the Dockerfile might tell Docker to use an official web server image, copy the files for your website into the container, and start the web server when the container starts. - -For more about Dockerfile visit [here](https://rushikesh-mashidkar.hashnode.dev/dockerfile-docker-compose-swarm-and-volumes) - -task: - -- Create a Dockerfile for a simple web application (e.g. a Node.js or Python app) - -- Build the image using the Dockerfile and run the container - -- Verify that the application is working as expected by accessing it in a web browser - -- Push the image to a public or private repository (e.g. Docker Hub ) - -For Refference Project visit [here](https://youtu.be/Tevxhn6Odc8) - -If you want to dive further, Watch [bootcamp](https://youtube.com/playlist?list=PLlfy9GnSVerRqYJgVYO0UiExj5byjrW8u) - -You can share the learning with everyone over linkedin and tag us along 😃 - -Happy Learning:) - -[← Previous Day](../day16/tasks.md) | [Next Day →](../day18/tasks.md) +## Day 17 Task: Docker Project for DevOps Engineers. + +### You people are doing just amazing in **#90daysofdevops**. Today's challenge is so special Because You are going to do DevOps project today with Docker. Are You Exited 😍 + +# Dockerfile + +Docker is a tool that makes it easy to run applications in containers. Containers are like small packages that hold everything an application needs to run. To create these containers, developers use something called a Dockerfile. + +A Dockerfile is like a set of instructions for making a container. It tells Docker what base image to use, what commands to run, and what files to include. For example, if you were making a container for a website, the Dockerfile might tell Docker to use an official web server image, copy the files for your website into the container, and start the web server when the container starts. + +For more about Dockerfile visit [here](https://rushikesh-mashidkar.hashnode.dev/dockerfile-docker-compose-swarm-and-volumes) + +task: + +- Create a Dockerfile for a simple web application (e.g. a Node.js or Python app) + +- Build the image using the Dockerfile and run the container + +- Verify that the application is working as expected by accessing it in a web browser + +- Push the image to a public or private repository (e.g. Docker Hub ) + +For Refference Project visit [here](https://youtu.be/Tevxhn6Odc8) + +If you want to dive further, Watch [bootcamp](https://youtube.com/playlist?list=PLlfy9GnSVerRqYJgVYO0UiExj5byjrW8u) + +You can share the learning with everyone over linkedin and tag us along 😃 + +Happy Learning:) + +[← Previous Day](../day16/tasks.md) | [Next Day →](../day18/tasks.md) diff --git a/2023/day18/tasks.md b/2023/day18/README.md similarity index 98% rename from 2023/day18/tasks.md rename to 2023/day18/README.md index 61f4b9b7a9..388b095f23 100644 --- a/2023/day18/tasks.md +++ b/2023/day18/README.md @@ -1,43 +1,43 @@ -# Day 18 Task: Docker for DevOps Engineers - -Till now you have created Docker file and pushed it to the Repository. Let's move forward and dig more on other Docker concepts. -Aj thodi padhai krte hai on Docker Compose 😃 - -## Docker Compose - -- Docker Compose is a tool that was developed to help define and share multi-container applications. -- With Compose, we can create a YAML file to define the services and with a single command, can spin everything up or tear it all down. -- Learn more about docker-compose [visit here](https://tecadmin.net/tutorial/docker/docker-compose/) - -## What is YAML? - -- YAML is a data serialization language that is often used for writing configuration files. Depending on whom you ask, YAML stands for yet another markup language or YAML ain’t markup language (a recursive acronym), which emphasizes that YAML is for data, not documents. -- YAML is a popular programming language because it is human-readable and easy to understand. -- YAML files use a .yml or .yaml extension. -- Read more about it [here](https://www.redhat.com/en/topics/automation/what-is-yaml) - -## Task-1 - -Learn how to use the docker-compose.yml file, to set up the environment, configure the services and links between different containers, and also to use environment variables in the docker-compose.yml file. - -[Sample docker-compose.yaml file](https://github.com/LondheShubham153/90DaysOfDevOps/blob/master/2023/day18/docker-compose.yaml) - -## Task-2 - -- Pull a pre-existing Docker image from a public repository (e.g. Docker Hub) and run it on your local machine. Run the container as a non-root user (Hint- Use `usermod ` command to give user permission to docker). Make sure you reboot instance after giving permission to user. -- Inspect the container's running processes and exposed ports using the docker inspect command. -- Use the docker logs command to view the container's log output. -- Use the docker stop and docker start commands to stop and start the container. -- Use the docker rm command to remove the container when you're done. - -## How to run Docker commands without sudo? - -- Make sure docker is installed and system is updated (This is already been completed as a part of previous tasks): -- sudo usermod -a -G docker $USER -- Reboot the machine. - -For reference you can watch this [video](https://youtu.be/Tevxhn6Odc8) - -You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. Happy Learning :) - -[← Previous Day](../day17/tasks.md) | [Next Day →](../day19/tasks.md) +# Day 18 Task: Docker for DevOps Engineers + +Till now you have created Docker file and pushed it to the Repository. Let's move forward and dig more on other Docker concepts. +Aj thodi padhai krte hai on Docker Compose 😃 + +## Docker Compose + +- Docker Compose is a tool that was developed to help define and share multi-container applications. +- With Compose, we can create a YAML file to define the services and with a single command, can spin everything up or tear it all down. +- Learn more about docker-compose [visit here](https://tecadmin.net/tutorial/docker/docker-compose/) + +## What is YAML? + +- YAML is a data serialization language that is often used for writing configuration files. Depending on whom you ask, YAML stands for yet another markup language or YAML ain’t markup language (a recursive acronym), which emphasizes that YAML is for data, not documents. +- YAML is a popular programming language because it is human-readable and easy to understand. +- YAML files use a .yml or .yaml extension. +- Read more about it [here](https://www.redhat.com/en/topics/automation/what-is-yaml) + +## Task-1 + +Learn how to use the docker-compose.yml file, to set up the environment, configure the services and links between different containers, and also to use environment variables in the docker-compose.yml file. + +[Sample docker-compose.yaml file](https://github.com/LondheShubham153/90DaysOfDevOps/blob/master/2023/day18/docker-compose.yaml) + +## Task-2 + +- Pull a pre-existing Docker image from a public repository (e.g. Docker Hub) and run it on your local machine. Run the container as a non-root user (Hint- Use `usermod ` command to give user permission to docker). Make sure you reboot instance after giving permission to user. +- Inspect the container's running processes and exposed ports using the docker inspect command. +- Use the docker logs command to view the container's log output. +- Use the docker stop and docker start commands to stop and start the container. +- Use the docker rm command to remove the container when you're done. + +## How to run Docker commands without sudo? + +- Make sure docker is installed and system is updated (This is already been completed as a part of previous tasks): +- sudo usermod -a -G docker $USER +- Reboot the machine. + +For reference you can watch this [video](https://youtu.be/Tevxhn6Odc8) + +You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. Happy Learning :) + +[← Previous Day](../day17/tasks.md) | [Next Day →](../day19/tasks.md) diff --git a/2023/day19/tasks.md b/2023/day19/README.md similarity index 98% rename from 2023/day19/tasks.md rename to 2023/day19/README.md index b702452467..9936bb70c7 100644 --- a/2023/day19/tasks.md +++ b/2023/day19/README.md @@ -1,39 +1,39 @@ -# Day 19 Task: Docker for DevOps Engineers - -**Till now you have learned how to create docker-compose.yml file and pushed it to the Repository. Let's move forward and dig more on other Docker-compose.yml concepts.** -**Aaj thodi padhai krte hai on Docker Volume & Docker Network** 😃 - -# Docker-Volume - -Docker allows you to create something called volumes. Volumes are like separate storage areas that can be accessed by containers. They allow you to store data, like a database, outside the container, so it doesn't get deleted when the container is deleted. -You can also mount from the same volume and create more containers having same data. -[reference](https://docs.docker.com/storage/volumes/) - -# Docker Network - -Docker allows you to create virtual spaces called networks, where you can connect multiple containers (small packages that hold all the necessary files for a specific application to run) together. This way, the containers can communicate with each other and with the host machine (the computer on which the Docker is installed). -When we run a container, it has its own storage space that is only accessible by that specific container. If we want to share that storage space with other containers, we can't do that. [reference](https://docs.docker.com/network/) - -## Task-1 - -- Create a multi-container docker-compose file which will bring _UP_ and bring _DOWN_ containers in a single shot ( Example - Create application and database container ) - -_hints:_ - -- Use the `docker-compose up` command with the `-d` flag to start a multi-container application in detached mode. -- Use the `docker-compose scale` command to increase or decrease the number of replicas for a specific service. You can also add [`replicas`](https://stackoverflow.com/questions/63408708/how-to-scale-from-within-docker-compose-file) in deployment file for _auto-scaling_. -- Use the `docker-compose ps` command to view the status of all containers, and `docker-compose logs` to view the logs of a specific service. -- Use the `docker-compose down` command to stop and remove all containers, networks, and volumes associated with the application - -## Task-2 - -- Learn how to use Docker Volumes and Named Volumes to share files and directories between multiple containers. -- Create two or more containers that read and write data to the same volume using the `docker run --mount` command. -- Verify that the data is the same in all containers by using the docker exec command to run commands inside each container. -- Use the docker volume ls command to list all volumes and docker volume rm command to remove the volume when you're done. - -## You can use this task as _Project_ to add in your resume. - -You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. Happy Learning :) - -[← Previous Day](../day18/tasks.md) | [Next Day →](../day20/tasks.md) +# Day 19 Task: Docker for DevOps Engineers + +**Till now you have learned how to create docker-compose.yml file and pushed it to the Repository. Let's move forward and dig more on other Docker-compose.yml concepts.** +**Aaj thodi padhai krte hai on Docker Volume & Docker Network** 😃 + +# Docker-Volume + +Docker allows you to create something called volumes. Volumes are like separate storage areas that can be accessed by containers. They allow you to store data, like a database, outside the container, so it doesn't get deleted when the container is deleted. +You can also mount from the same volume and create more containers having same data. +[reference](https://docs.docker.com/storage/volumes/) + +# Docker Network + +Docker allows you to create virtual spaces called networks, where you can connect multiple containers (small packages that hold all the necessary files for a specific application to run) together. This way, the containers can communicate with each other and with the host machine (the computer on which the Docker is installed). +When we run a container, it has its own storage space that is only accessible by that specific container. If we want to share that storage space with other containers, we can't do that. [reference](https://docs.docker.com/network/) + +## Task-1 + +- Create a multi-container docker-compose file which will bring _UP_ and bring _DOWN_ containers in a single shot ( Example - Create application and database container ) + +_hints:_ + +- Use the `docker-compose up` command with the `-d` flag to start a multi-container application in detached mode. +- Use the `docker-compose scale` command to increase or decrease the number of replicas for a specific service. You can also add [`replicas`](https://stackoverflow.com/questions/63408708/how-to-scale-from-within-docker-compose-file) in deployment file for _auto-scaling_. +- Use the `docker-compose ps` command to view the status of all containers, and `docker-compose logs` to view the logs of a specific service. +- Use the `docker-compose down` command to stop and remove all containers, networks, and volumes associated with the application + +## Task-2 + +- Learn how to use Docker Volumes and Named Volumes to share files and directories between multiple containers. +- Create two or more containers that read and write data to the same volume using the `docker run --mount` command. +- Verify that the data is the same in all containers by using the docker exec command to run commands inside each container. +- Use the docker volume ls command to list all volumes and docker volume rm command to remove the volume when you're done. + +## You can use this task as _Project_ to add in your resume. + +You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. Happy Learning :) + +[← Previous Day](../day18/tasks.md) | [Next Day →](../day20/tasks.md) diff --git a/2023/day20/tasks.md b/2023/day20/README.md similarity index 98% rename from 2023/day20/tasks.md rename to 2023/day20/README.md index 185dd1b944..f25709ca0d 100644 --- a/2023/day20/tasks.md +++ b/2023/day20/README.md @@ -1,16 +1,16 @@ -## Finally!! 🎉 - -You have completed✅ the Docker handson and I hope you have learned something interesting from it.🙌 - -Now it's time to take your Docker skills to the next level by creating a comprehensive cheat-sheet of all the commands you've learned so far. This cheat-sheet should include commands for both Docker and Docker-Compose, as well as brief explanations of their usage. -This cheat-sheet will not only help you in the future but also contribute to the DevOps community by providing a useful resource for others.😊🙌 - -So, put your knowledge and creativity to the test and create a cheat-sheet that truly stands out! 🚀 - -_I have added a [cheatsheet](https://cdn.hashnode.com/res/hashnode/image/upload/v1670863735841/r6xdXpsap.png?auto=compress,format&format=webp) for your reference, Make sure every cheatsheet must be UNIQUE_ - -Post it on Linkedin and Spread the knowledge.😃 - -**Happy Learning :)** - -[← Previous Day](../day19/tasks.md) | [Next Day →](../day21/tasks.md) +## Finally!! 🎉 + +You have completed✅ the Docker handson and I hope you have learned something interesting from it.🙌 + +Now it's time to take your Docker skills to the next level by creating a comprehensive cheat-sheet of all the commands you've learned so far. This cheat-sheet should include commands for both Docker and Docker-Compose, as well as brief explanations of their usage. +This cheat-sheet will not only help you in the future but also contribute to the DevOps community by providing a useful resource for others.😊🙌 + +So, put your knowledge and creativity to the test and create a cheat-sheet that truly stands out! 🚀 + +_I have added a [cheatsheet](https://cdn.hashnode.com/res/hashnode/image/upload/v1670863735841/r6xdXpsap.png?auto=compress,format&format=webp) for your reference, Make sure every cheatsheet must be UNIQUE_ + +Post it on Linkedin and Spread the knowledge.😃 + +**Happy Learning :)** + +[← Previous Day](../day19/tasks.md) | [Next Day →](../day21/tasks.md) diff --git a/2023/day21/tasks.md b/2023/day21/README.md similarity index 100% rename from 2023/day21/tasks.md rename to 2023/day21/README.md diff --git a/2023/day22/tasks.md b/2023/day22/README.md similarity index 98% rename from 2023/day22/tasks.md rename to 2023/day22/README.md index 858ae879a1..dceba195ca 100644 --- a/2023/day22/tasks.md +++ b/2023/day22/README.md @@ -1,30 +1,30 @@ -# Day-22 : Getting Started with Jenkins 😃 - -**Linux, Git, Git-Hub, Docker finish ho chuka hai to chaliye seekhte hai inko deploy krne ke lye CI-CD tool:** - -## What is Jenkins? - -- Jenkins is an open source continuous integration-continuous delivery and deployment (CI/CD) automation software DevOps tool written in the Java programming language. It is used to implement CI/CD workflows, called pipelines. - -- Jenkins is a tool that is used for automation, and it is an open-source server that allows all the developers to build, test and deploy software. It works or runs on java as it is written in java. By using Jenkins we can make a continuous integration of projects(jobs) or end-to-endpoint automation. - -- Jenkins achieves Continuous Integration with the help of plugins. Plugins allow the integration of Various DevOps stages. If you want to integrate a particular tool, you need to install the plugins for that tool. For example Git, Maven 2 project, Amazon EC2, HTML publisher etc. - -**Let us do discuss the necessity of this tool before going ahead to the procedural part for installation:** - -- Nowadays, humans are becoming lazy😴 day by day so even having digital screens and just one click button in front of us then also need some automation. - -- Here, I’m referring to that part of automation where we need not have to look upon a process(here called a job) for completion and after it doing another job. For that, we have Jenkins with us. - -Note: By now Jenkins should be installed on your machine(as it was a part of previous tasks, if not follow [Installation Guide](https://youtu.be/OkVtBKqMt7I)) - -## Tasks: - -**1. What you understood in Jenkin, write a small article in your own words (Don't copy from Internet Directly)** - -**2.Create a freestyle pipeline to print "Hello World!!** -Hint: Use link for [Article](https://www.geeksforgeeks.org/what-is-jenkins) - -Don't forget to post your progress on Linkedin. Till then Happy learning :) - -[← Previous Day](../day21/tasks.md) | [Next Day →](../day23/tasks.md) +# Day-22 : Getting Started with Jenkins 😃 + +**Linux, Git, Git-Hub, Docker finish ho chuka hai to chaliye seekhte hai inko deploy krne ke lye CI-CD tool:** + +## What is Jenkins? + +- Jenkins is an open source continuous integration-continuous delivery and deployment (CI/CD) automation software DevOps tool written in the Java programming language. It is used to implement CI/CD workflows, called pipelines. + +- Jenkins is a tool that is used for automation, and it is an open-source server that allows all the developers to build, test and deploy software. It works or runs on java as it is written in java. By using Jenkins we can make a continuous integration of projects(jobs) or end-to-endpoint automation. + +- Jenkins achieves Continuous Integration with the help of plugins. Plugins allow the integration of Various DevOps stages. If you want to integrate a particular tool, you need to install the plugins for that tool. For example Git, Maven 2 project, Amazon EC2, HTML publisher etc. + +**Let us do discuss the necessity of this tool before going ahead to the procedural part for installation:** + +- Nowadays, humans are becoming lazy😴 day by day so even having digital screens and just one click button in front of us then also need some automation. + +- Here, I’m referring to that part of automation where we need not have to look upon a process(here called a job) for completion and after it doing another job. For that, we have Jenkins with us. + +Note: By now Jenkins should be installed on your machine(as it was a part of previous tasks, if not follow [Installation Guide](https://youtu.be/OkVtBKqMt7I)) + +## Tasks: + +**1. What you understood in Jenkin, write a small article in your own words (Don't copy from Internet Directly)** + +**2.Create a freestyle pipeline to print "Hello World!!** +Hint: Use link for [Article](https://www.geeksforgeeks.org/what-is-jenkins) + +Don't forget to post your progress on Linkedin. Till then Happy learning :) + +[← Previous Day](../day21/tasks.md) | [Next Day →](../day23/tasks.md) diff --git a/2023/day23/tasks.md b/2023/day23/README.md similarity index 98% rename from 2023/day23/tasks.md rename to 2023/day23/README.md index 9802ba20eb..974eb63d24 100644 --- a/2023/day23/tasks.md +++ b/2023/day23/README.md @@ -1,40 +1,40 @@ -# Day 23 Task: Jenkins Freestyle Project for DevOps Engineers. - -The Community is absolutely crushing it in the #90daysofdevops journey. Today's challenge is particularly exciting as it entails creating a Jenkins Freestyle Project, an opportunity for DevOps engineers to showcase their skills and push their limits. Who's ready to dive in and make it happen? 😍 - -## What is CI/CD? - -- CI or Continuous Integration is the practice of automating the integration of code changes from multiple developers into a single codebase. It is a software development practice where the developers commit their work frequently into the central code repository (Github or Stash). Then there are automated tools that build the newly committed code and do a code review, etc as required upon integration. - The key goals of Continuous Integration are to find and address bugs quicker, make the process of integrating code across a team of developers easier, improve software quality and reduce the time it takes to release new feature updates. - -- CD or Continuous Delivery is carried out after Continuous Integration to make sure that we can release new changes to our customers quickly in an error-free way. This includes running integration and regression tests in the staging area (similar to the production environment) so that the final release is not broken in production. It ensures to automate the release process so that we have a release-ready product at all times and we can deploy our application at any point in time. - -## What Is a Build Job? - -A Jenkins build job contains the configuration for automating a specific task or step in the application building process. These tasks include gathering dependencies, compiling, archiving, or transforming code, and testing and deploying code in different environments. - -Jenkins supports several types of build jobs, such as freestyle projects, pipelines, multi-configuration projects, folders, multibranch pipelines, and organization folders. - -## What is Freestyle Projects ?? 🤔 - -A freestyle project in Jenkins is a type of project that allows you to build, test, and deploy software using a variety of different options and configurations. Here are a few tasks that you could complete when working with a freestyle project in Jenkins: - -# Task-01 - -- create a agent for your app. ( which you deployed from docker in earlier task) -- Create a new Jenkins freestyle project for your app. -- In the "Build" section of the project, add a build step to run the "docker build" command to build the image for the container. -- Add a second step to run the "docker run" command to start a container using the image created in step 3. - -# Task-02 - -- Create Jenkins project to run "docker-compose up -d" command to start the multiple containers defined in the compose file (Hint- use day-19 Application & Database docker-compose file) -- Set up a cleanup step in the Jenkins project to run "docker-compose down" command to stop and remove the containers defined in the compose file. - -For Refference jenkins Freestyle Project visit [here](https://youtu.be/wwNWgG5htxs) - -You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. - -Happy Learning:) - -[← Previous Day](../day22/tasks.md) | [Next Day →](../day24/tasks.md) +# Day 23 Task: Jenkins Freestyle Project for DevOps Engineers. + +The Community is absolutely crushing it in the #90daysofdevops journey. Today's challenge is particularly exciting as it entails creating a Jenkins Freestyle Project, an opportunity for DevOps engineers to showcase their skills and push their limits. Who's ready to dive in and make it happen? 😍 + +## What is CI/CD? + +- CI or Continuous Integration is the practice of automating the integration of code changes from multiple developers into a single codebase. It is a software development practice where the developers commit their work frequently into the central code repository (Github or Stash). Then there are automated tools that build the newly committed code and do a code review, etc as required upon integration. + The key goals of Continuous Integration are to find and address bugs quicker, make the process of integrating code across a team of developers easier, improve software quality and reduce the time it takes to release new feature updates. + +- CD or Continuous Delivery is carried out after Continuous Integration to make sure that we can release new changes to our customers quickly in an error-free way. This includes running integration and regression tests in the staging area (similar to the production environment) so that the final release is not broken in production. It ensures to automate the release process so that we have a release-ready product at all times and we can deploy our application at any point in time. + +## What Is a Build Job? + +A Jenkins build job contains the configuration for automating a specific task or step in the application building process. These tasks include gathering dependencies, compiling, archiving, or transforming code, and testing and deploying code in different environments. + +Jenkins supports several types of build jobs, such as freestyle projects, pipelines, multi-configuration projects, folders, multibranch pipelines, and organization folders. + +## What is Freestyle Projects ?? 🤔 + +A freestyle project in Jenkins is a type of project that allows you to build, test, and deploy software using a variety of different options and configurations. Here are a few tasks that you could complete when working with a freestyle project in Jenkins: + +# Task-01 + +- create a agent for your app. ( which you deployed from docker in earlier task) +- Create a new Jenkins freestyle project for your app. +- In the "Build" section of the project, add a build step to run the "docker build" command to build the image for the container. +- Add a second step to run the "docker run" command to start a container using the image created in step 3. + +# Task-02 + +- Create Jenkins project to run "docker-compose up -d" command to start the multiple containers defined in the compose file (Hint- use day-19 Application & Database docker-compose file) +- Set up a cleanup step in the Jenkins project to run "docker-compose down" command to stop and remove the containers defined in the compose file. + +For Refference jenkins Freestyle Project visit [here](https://youtu.be/wwNWgG5htxs) + +You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. + +Happy Learning:) + +[← Previous Day](../day22/tasks.md) | [Next Day →](../day24/tasks.md) diff --git a/2023/day24/tasks.md b/2023/day24/README.md similarity index 100% rename from 2023/day24/tasks.md rename to 2023/day24/README.md diff --git a/2023/day25/tasks.md b/2023/day25/README.md similarity index 100% rename from 2023/day25/tasks.md rename to 2023/day25/README.md diff --git a/2023/day26/tasks.md b/2023/day26/README.md similarity index 100% rename from 2023/day26/tasks.md rename to 2023/day26/README.md diff --git a/2023/day27/tasks.md b/2023/day27/README.md similarity index 100% rename from 2023/day27/tasks.md rename to 2023/day27/README.md diff --git a/2023/day28/tasks.md b/2023/day28/README.md similarity index 100% rename from 2023/day28/tasks.md rename to 2023/day28/README.md diff --git a/2023/day29/tasks.md b/2023/day29/README.md similarity index 97% rename from 2023/day29/tasks.md rename to 2023/day29/README.md index e2b9886663..189e301847 100644 --- a/2023/day29/tasks.md +++ b/2023/day29/README.md @@ -1,33 +1,33 @@ -## Day 29 Task: Jenkins Important interview Questions. - -

- - -## Jenkins Interview - -Here are some Jenkins-specific questions related to Docker that one can use during a DevOps Engineer interview: - -## Questions - -1. What’s the difference between continuous integration, continuous delivery, and continuous deployment? -2. Benefits of CI/CD -3. What is meant by CI-CD? -4. What is Jenkins Pipeline? -5. How do you configure the job in Jenkins? -6. Where do you find errors in Jenkins? -7. In Jenkins how can you find log files? -8. Jenkins workflow and write a script for this workflow? -9. How to create continuous deployment in Jenkins? -10. How build job in Jenkins? -11. Why we use pipeline in Jenkins? -12. Is Only Jenkins enough for automation? -13. How will you handle secrets? -14. Explain diff stages in CI-CD setup -15. Name some of the plugins in Jenkin? - -These questions will help you in your next DevOps Interview. -Write a Blog and share it on LinkedIn. - -_Happy Learning :)_ - -[← Previous Day](../day28/tasks.md) | [Next Day →](../day30/tasks.md) +## Day 29 Task: Jenkins Important interview Questions. + +

+ + +## Jenkins Interview + +Here are some Jenkins-specific questions related to Docker that one can use during a DevOps Engineer interview: + +## Questions + +1. What’s the difference between continuous integration, continuous delivery, and continuous deployment? +2. Benefits of CI/CD +3. What is meant by CI-CD? +4. What is Jenkins Pipeline? +5. How do you configure the job in Jenkins? +6. Where do you find errors in Jenkins? +7. In Jenkins how can you find log files? +8. Jenkins workflow and write a script for this workflow? +9. How to create continuous deployment in Jenkins? +10. How build job in Jenkins? +11. Why we use pipeline in Jenkins? +12. Is Only Jenkins enough for automation? +13. How will you handle secrets? +14. Explain diff stages in CI-CD setup +15. Name some of the plugins in Jenkin? + +These questions will help you in your next DevOps Interview. +Write a Blog and share it on LinkedIn. + +_Happy Learning :)_ + +[← Previous Day](../day28/tasks.md) | [Next Day →](../day30/tasks.md) diff --git a/2023/day30/tasks.md b/2023/day30/README.md similarity index 100% rename from 2023/day30/tasks.md rename to 2023/day30/README.md diff --git a/2023/day31/tasks.md b/2023/day31/README.md similarity index 97% rename from 2023/day31/tasks.md rename to 2023/day31/README.md index e18e6260de..f538bc319f 100644 --- a/2023/day31/tasks.md +++ b/2023/day31/README.md @@ -1,65 +1,65 @@ -## Day 31 Task: Launching your First Kubernetes Cluster with Nginx running - -### Awesome! You learned the architecture of one of the top most important tool "Kubernetes" in your previous task. - -## What about doing some hands-on now? - -Let's read about minikube and implement _k8s_ in our local machine - -1. **What is minikube?** - -_Ans_:- Minikube is a tool which quickly sets up a local Kubernetes cluster on macOS, Linux, and Windows. It can deploy as a VM, a container, or on bare-metal. - -Minikube is a pared-down version of Kubernetes that gives you all the benefits of Kubernetes with a lot less effort. - -This makes it an interesting option for users who are new to containers, and also for projects in the world of edge computing and the Internet of Things. - -2. **Features of minikube** - -_Ans_ :- - -(a) Supports the latest Kubernetes release (+6 previous minor versions) - -(b) Cross-platform (Linux, macOS, Windows) - -(c) Deploy as a VM, a container, or on bare-metal - -(d) Multiple container runtimes (CRI-O, containerd, docker) - -(e) Direct API endpoint for blazing fast image load and build - -(f) Advanced features such as LoadBalancer, filesystem mounts, FeatureGates, and network policy - -(g) Addons for easily installed Kubernetes applications - -(h) Supports common CI environments - -## Task-01: - -## Install minikube on your local - -For installation, you can Visit [this page](https://minikube.sigs.k8s.io/docs/start/). - -If you want to try an alternative way, you can check [this](https://k8s-docs.netlify.app/en/docs/tasks/tools/install-minikube/). - -## Let's understand the concept **pod** - -_Ans:-_ - -Pods are the smallest deployable units of computing that you can create and manage in Kubernetes. - -A Pod (as in a pod of whales or pea pod) is a group of one or more containers, with shared storage and network resources, and a specification for how to run the containers. A Pod's contents are always co-located and co-scheduled, and run in a shared context. A Pod models an application-specific "logical host": it contains one or more application containers which are relatively tightly coupled. - -You can read more about pod from [here](https://kubernetes.io/docs/concepts/workloads/pods/) . - -## Task-02: - -## Create your first pod on Kubernetes through minikube. - -We are suggesting you make an nginx pod, but you can always show your creativity and do it on your own. - -**Having an issue? Don't worry, adding a sample yaml file for pod creation, you can always refer that.** - -_Happy Learning :)_ - -[← Previous Day](../day30/tasks.md) | [Next Day →](../day32/tasks.md) +## Day 31 Task: Launching your First Kubernetes Cluster with Nginx running + +### Awesome! You learned the architecture of one of the top most important tool "Kubernetes" in your previous task. + +## What about doing some hands-on now? + +Let's read about minikube and implement _k8s_ in our local machine + +1. **What is minikube?** + +_Ans_:- Minikube is a tool which quickly sets up a local Kubernetes cluster on macOS, Linux, and Windows. It can deploy as a VM, a container, or on bare-metal. + +Minikube is a pared-down version of Kubernetes that gives you all the benefits of Kubernetes with a lot less effort. + +This makes it an interesting option for users who are new to containers, and also for projects in the world of edge computing and the Internet of Things. + +2. **Features of minikube** + +_Ans_ :- + +(a) Supports the latest Kubernetes release (+6 previous minor versions) + +(b) Cross-platform (Linux, macOS, Windows) + +(c) Deploy as a VM, a container, or on bare-metal + +(d) Multiple container runtimes (CRI-O, containerd, docker) + +(e) Direct API endpoint for blazing fast image load and build + +(f) Advanced features such as LoadBalancer, filesystem mounts, FeatureGates, and network policy + +(g) Addons for easily installed Kubernetes applications + +(h) Supports common CI environments + +## Task-01: + +## Install minikube on your local + +For installation, you can Visit [this page](https://minikube.sigs.k8s.io/docs/start/). + +If you want to try an alternative way, you can check [this](https://k8s-docs.netlify.app/en/docs/tasks/tools/install-minikube/). + +## Let's understand the concept **pod** + +_Ans:-_ + +Pods are the smallest deployable units of computing that you can create and manage in Kubernetes. + +A Pod (as in a pod of whales or pea pod) is a group of one or more containers, with shared storage and network resources, and a specification for how to run the containers. A Pod's contents are always co-located and co-scheduled, and run in a shared context. A Pod models an application-specific "logical host": it contains one or more application containers which are relatively tightly coupled. + +You can read more about pod from [here](https://kubernetes.io/docs/concepts/workloads/pods/) . + +## Task-02: + +## Create your first pod on Kubernetes through minikube. + +We are suggesting you make an nginx pod, but you can always show your creativity and do it on your own. + +**Having an issue? Don't worry, adding a sample yaml file for pod creation, you can always refer that.** + +_Happy Learning :)_ + +[← Previous Day](../day30/tasks.md) | [Next Day →](../day32/tasks.md) diff --git a/2023/day32/tasks.md b/2023/day32/README.md similarity index 97% rename from 2023/day32/tasks.md rename to 2023/day32/README.md index 6ecb16969c..9067b11713 100644 --- a/2023/day32/tasks.md +++ b/2023/day32/README.md @@ -1,27 +1,27 @@ -## Day 32 Task: Launching your Kubernetes Cluster with Deployment - -### Congratulation ! on your learning on K8s on Day-31 - -## What is Deployment in k8s - -A Deployment provides a configuration for updates for Pods and ReplicaSets. - -You describe a desired state in a Deployment, and the Deployment Controller changes the actual state to the desired state at a controlled rate. You can define Deployments to create new replicas for scaling, or to remove existing Deployments and adopt all their resources with new Deployments. - -## Today's task let's keep it very simple. - -## Task-1: - -**Create one Deployment file to deploy a sample todo-app on K8s using "Auto-healing" and "Auto-Scaling" feature** - -- add a deployment.yml file (sample is kept in the folder for your reference) -- apply the deployment to your k8s (minikube) cluster by command - `kubectl apply -f deployment.yml` - -Let's make your resume shine with one more project ;) - -**Having an issue? Don't worry, adding a sample deployment file , you can always refer that or wathch [this video](https://youtu.be/ONrbWFJXLLk)** - -Happy Learning :) - -[← Previous Day](../day31/tasks.md) | [Next Day →](../day33/tasks.md) +## Day 32 Task: Launching your Kubernetes Cluster with Deployment + +### Congratulation ! on your learning on K8s on Day-31 + +## What is Deployment in k8s + +A Deployment provides a configuration for updates for Pods and ReplicaSets. + +You describe a desired state in a Deployment, and the Deployment Controller changes the actual state to the desired state at a controlled rate. You can define Deployments to create new replicas for scaling, or to remove existing Deployments and adopt all their resources with new Deployments. + +## Today's task let's keep it very simple. + +## Task-1: + +**Create one Deployment file to deploy a sample todo-app on K8s using "Auto-healing" and "Auto-Scaling" feature** + +- add a deployment.yml file (sample is kept in the folder for your reference) +- apply the deployment to your k8s (minikube) cluster by command + `kubectl apply -f deployment.yml` + +Let's make your resume shine with one more project ;) + +**Having an issue? Don't worry, adding a sample deployment file , you can always refer that or wathch [this video](https://youtu.be/ONrbWFJXLLk)** + +Happy Learning :) + +[← Previous Day](../day31/tasks.md) | [Next Day →](../day33/tasks.md) diff --git a/2023/day33/tasks.md b/2023/day33/README.md similarity index 97% rename from 2023/day33/tasks.md rename to 2023/day33/README.md index 5b310d60a9..7e27ffc367 100644 --- a/2023/day33/tasks.md +++ b/2023/day33/README.md @@ -1,34 +1,34 @@ -# Day 33 Task: Working with Namespaces and Services in Kubernetes - -### Congrats🎊🎉 on updating your Deployment yesterday💥🙌 - -## What are Namespaces and Services in k8s - -In Kubernetes, Namespaces are used to create isolated environments for resources. Each Namespace is like a separate cluster within the same physical cluster. Services are used to expose your Pods and Deployments to the network. Read more about Namespace [Here](https://kubernetes.io/docs/concepts/workloads/pods/user-namespaces/) - -# Today's task: - -## Task 1: - -- Create a Namespace for your Deployment - -- Use the command `kubectl create namespace ` to create a Namespace - -- Update the deployment.yml file to include the Namespace - -- Apply the updated deployment using the command: - `kubectl apply -f deployment.yml -n ` - -- Verify that the Namespace has been created by checking the status of the Namespaces in your cluster. - -## Task 2: - -- Read about Services, Load Balancing, and Networking in Kubernetes. Refer official documentation of kubernetes [Link](https://kubernetes.io/docs/concepts/services-networking/) - -Need help with Namespaces? Check out this [video](https://youtu.be/K3jNo4z5Jx8) for assistance. - -Keep growing your Kubernetes knowledge💥🙌 - -Happy Learning! :) - -[← Previous Day](../day32/tasks.md) | [Next Day →](../day34/tasks.md) +# Day 33 Task: Working with Namespaces and Services in Kubernetes + +### Congrats🎊🎉 on updating your Deployment yesterday💥🙌 + +## What are Namespaces and Services in k8s + +In Kubernetes, Namespaces are used to create isolated environments for resources. Each Namespace is like a separate cluster within the same physical cluster. Services are used to expose your Pods and Deployments to the network. Read more about Namespace [Here](https://kubernetes.io/docs/concepts/workloads/pods/user-namespaces/) + +# Today's task: + +## Task 1: + +- Create a Namespace for your Deployment + +- Use the command `kubectl create namespace ` to create a Namespace + +- Update the deployment.yml file to include the Namespace + +- Apply the updated deployment using the command: + `kubectl apply -f deployment.yml -n ` + +- Verify that the Namespace has been created by checking the status of the Namespaces in your cluster. + +## Task 2: + +- Read about Services, Load Balancing, and Networking in Kubernetes. Refer official documentation of kubernetes [Link](https://kubernetes.io/docs/concepts/services-networking/) + +Need help with Namespaces? Check out this [video](https://youtu.be/K3jNo4z5Jx8) for assistance. + +Keep growing your Kubernetes knowledge💥🙌 + +Happy Learning! :) + +[← Previous Day](../day32/tasks.md) | [Next Day →](../day34/tasks.md) diff --git a/2023/day34/tasks.md b/2023/day34/README.md similarity index 98% rename from 2023/day34/tasks.md rename to 2023/day34/README.md index 374db996c2..0fec921099 100644 --- a/2023/day34/tasks.md +++ b/2023/day34/README.md @@ -1,36 +1,36 @@ -# Day 34 Task: Working with Services in Kubernetes - -### Congratulation🎊 on your learning on Deployments in K8s on Day-33 - -## What are Services in K8s - -In Kubernetes, Services are objects that provide stable network identities to Pods and abstract away the details of Pod IP addresses. Services allow Pods to receive traffic from other Pods, Services, and external clients. - -## Task-1: - -- Create a Service for your todo-app Deployment from Day-32 -- Create a Service definition for your todo-app Deployment in a YAML file. -- Apply the Service definition to your K8s (minikube) cluster using the `kubectl apply -f service.yml -n ` command. -- Verify that the Service is working by accessing the todo-app using the Service's IP and Port in your Namespace. - -## Task-2: - -- Create a ClusterIP Service for accessing the todo-app from within the cluster -- Create a ClusterIP Service definition for your todo-app Deployment in a YAML file. -- Apply the ClusterIP Service definition to your K8s (minikube) cluster using the `kubectl apply -f cluster-ip-service.yml -n ` command. -- Verify that the ClusterIP Service is working by accessing the todo-app from another Pod in the cluster in your Namespace. - -## Task-3: - -- Create a LoadBalancer Service for accessing the todo-app from outside the cluster -- Create a LoadBalancer Service definition for your todo-app Deployment in a YAML file. -- Apply the LoadBalancer Service definition to your K8s (minikube) cluster using the `kubectl apply -f load-balancer-service.yml -n ` command. -- Verify that the LoadBalancer Service is working by accessing the todo-app from outside the cluster in your Namespace. - -Struggling with Services? Take a look at this video for a step-by-step [guide](https://youtu.be/OJths_RojFA). - -Need help with Services in Kubernetes? Check out the Kubernetes [documentation](https://kubernetes.io/docs/concepts/services-networking/service/) for assistance. - -Happy Learning :) - -[← Previous Day](../day33/tasks.md) | [Next Day →](../day35/tasks.md) +# Day 34 Task: Working with Services in Kubernetes + +### Congratulation🎊 on your learning on Deployments in K8s on Day-33 + +## What are Services in K8s + +In Kubernetes, Services are objects that provide stable network identities to Pods and abstract away the details of Pod IP addresses. Services allow Pods to receive traffic from other Pods, Services, and external clients. + +## Task-1: + +- Create a Service for your todo-app Deployment from Day-32 +- Create a Service definition for your todo-app Deployment in a YAML file. +- Apply the Service definition to your K8s (minikube) cluster using the `kubectl apply -f service.yml -n ` command. +- Verify that the Service is working by accessing the todo-app using the Service's IP and Port in your Namespace. + +## Task-2: + +- Create a ClusterIP Service for accessing the todo-app from within the cluster +- Create a ClusterIP Service definition for your todo-app Deployment in a YAML file. +- Apply the ClusterIP Service definition to your K8s (minikube) cluster using the `kubectl apply -f cluster-ip-service.yml -n ` command. +- Verify that the ClusterIP Service is working by accessing the todo-app from another Pod in the cluster in your Namespace. + +## Task-3: + +- Create a LoadBalancer Service for accessing the todo-app from outside the cluster +- Create a LoadBalancer Service definition for your todo-app Deployment in a YAML file. +- Apply the LoadBalancer Service definition to your K8s (minikube) cluster using the `kubectl apply -f load-balancer-service.yml -n ` command. +- Verify that the LoadBalancer Service is working by accessing the todo-app from outside the cluster in your Namespace. + +Struggling with Services? Take a look at this video for a step-by-step [guide](https://youtu.be/OJths_RojFA). + +Need help with Services in Kubernetes? Check out the Kubernetes [documentation](https://kubernetes.io/docs/concepts/services-networking/service/) for assistance. + +Happy Learning :) + +[← Previous Day](../day33/tasks.md) | [Next Day →](../day35/tasks.md) diff --git a/2023/day35/tasks.md b/2023/day35/README.md similarity index 98% rename from 2023/day35/tasks.md rename to 2023/day35/README.md index 555ce760e4..5ea4436eb3 100644 --- a/2023/day35/tasks.md +++ b/2023/day35/README.md @@ -1,37 +1,37 @@ -# Day 35: Mastering ConfigMaps and Secrets in Kubernetes🔒🔑🛡️ - -### 👏🎉 Yay! Yesterday we conquered Namespaces and Services 💪💻🔗🚀 - -## What are ConfigMaps and Secrets in k8s - -In Kubernetes, ConfigMaps and Secrets are used to store configuration data and secrets, respectively. ConfigMaps store configuration data as key-value pairs, while Secrets store sensitive data in an encrypted form. - -- _Example :- Imagine you're in charge of a big spaceship (Kubernetes cluster) with lots of different parts (containers) that need information to function properly. - ConfigMaps are like a file cabinet where you store all the information each part needs in simple, labeled folders (key-value pairs). - Secrets, on the other hand, are like a safe where you keep the important, sensitive information that shouldn't be accessible to just anyone (encrypted data). - So, using ConfigMaps and Secrets, you can ensure each part of your spaceship (Kubernetes cluster) has the information it needs to work properly and keep sensitive information secure! 🚀_ -- Read more about [ConfigMap](https://kubernetes.io/docs/concepts/configuration/configmap/) & [Secret](https://kubernetes.io/docs/concepts/configuration/secret/). - -## Today's task: - -## Task 1: - -- Create a ConfigMap for your Deployment -- Create a ConfigMap for your Deployment using a file or the command line -- Update the deployment.yml file to include the ConfigMap -- Apply the updated deployment using the command: `kubectl apply -f deployment.yml -n ` -- Verify that the ConfigMap has been created by checking the status of the ConfigMaps in your Namespace. - -## Task 2: - -- Create a Secret for your Deployment -- Create a Secret for your Deployment using a file or the command line -- Update the deployment.yml file to include the Secret -- Apply the updated deployment using the command: `kubectl apply -f deployment.yml -n ` -- Verify that the Secret has been created by checking the status of the Secrets in your Namespace. - -Need help with ConfigMaps and Secrets? Check out this [video](https://youtu.be/FAnQTgr04mU) for assistance. - -Keep learning and expanding your knowledge of Kubernetes💥🙌 - -[← Previous Day](../day34/tasks.md) | [Next Day →](../day36/tasks.md) +# Day 35: Mastering ConfigMaps and Secrets in Kubernetes🔒🔑🛡️ + +### 👏🎉 Yay! Yesterday we conquered Namespaces and Services 💪💻🔗🚀 + +## What are ConfigMaps and Secrets in k8s + +In Kubernetes, ConfigMaps and Secrets are used to store configuration data and secrets, respectively. ConfigMaps store configuration data as key-value pairs, while Secrets store sensitive data in an encrypted form. + +- _Example :- Imagine you're in charge of a big spaceship (Kubernetes cluster) with lots of different parts (containers) that need information to function properly. + ConfigMaps are like a file cabinet where you store all the information each part needs in simple, labeled folders (key-value pairs). + Secrets, on the other hand, are like a safe where you keep the important, sensitive information that shouldn't be accessible to just anyone (encrypted data). + So, using ConfigMaps and Secrets, you can ensure each part of your spaceship (Kubernetes cluster) has the information it needs to work properly and keep sensitive information secure! 🚀_ +- Read more about [ConfigMap](https://kubernetes.io/docs/concepts/configuration/configmap/) & [Secret](https://kubernetes.io/docs/concepts/configuration/secret/). + +## Today's task: + +## Task 1: + +- Create a ConfigMap for your Deployment +- Create a ConfigMap for your Deployment using a file or the command line +- Update the deployment.yml file to include the ConfigMap +- Apply the updated deployment using the command: `kubectl apply -f deployment.yml -n ` +- Verify that the ConfigMap has been created by checking the status of the ConfigMaps in your Namespace. + +## Task 2: + +- Create a Secret for your Deployment +- Create a Secret for your Deployment using a file or the command line +- Update the deployment.yml file to include the Secret +- Apply the updated deployment using the command: `kubectl apply -f deployment.yml -n ` +- Verify that the Secret has been created by checking the status of the Secrets in your Namespace. + +Need help with ConfigMaps and Secrets? Check out this [video](https://youtu.be/FAnQTgr04mU) for assistance. + +Keep learning and expanding your knowledge of Kubernetes💥🙌 + +[← Previous Day](../day34/tasks.md) | [Next Day →](../day36/tasks.md) diff --git a/2023/day36/tasks.md b/2023/day36/README.md similarity index 98% rename from 2023/day36/tasks.md rename to 2023/day36/README.md index b1732deeae..5f69138d9e 100644 --- a/2023/day36/tasks.md +++ b/2023/day36/README.md @@ -1,51 +1,51 @@ -# Day 36 Task: Managing Persistent Volumes in Your Deployment 💥 - -🙌 Kudos to you for conquering ConfigMaps and Secrets in Kubernetes yesterday. - -🔥 You're on fire! 🔥 - -## What are Persistent Volumes in k8s - -In Kubernetes, a Persistent Volume (PV) is a piece of storage in the cluster that has been provisioned by an administrator. A Persistent Volume Claim (PVC) is a request for storage by a user. The PVC references the PV, and the PV is bound to a specific node. Read official documentation of [Persistent Volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/). - -⏰ Wait, wait, wait! 📣 Attention all #90daysofDevOps Challengers. 💪 - -Before diving into today's task, don't forget to share your thoughts on the #90daysofDevOps challenge 💪 Fill out our feedback form (https://lnkd.in/gcgvrq8b) to help us improve and provide the best experience 🌟 Your participation and support is greatly appreciated 🙏 Let's continue to grow together 🌱 - -## Today's tasks: - -### Task 1: - -Add a Persistent Volume to your Deployment todo app. - -- Create a Persistent Volume using a file on your node. [Template](https://github.com/LondheShubham153/90DaysOfDevOps/blob/94e3970819e097a5b8edea40fe565d583419f912/2023/day36/pv.yml) - -- Create a Persistent Volume Claim that references the Persistent Volume. [Template](https://github.com/LondheShubham153/90DaysOfDevOps/blob/94e3970819e097a5b8edea40fe565d583419f912/2023/day36/pvc.yml) - -- Update your deployment.yml file to include the Persistent Volume Claim. After Applying pv.yml pvc.yml your deployment file look like this [Template](https://github.com/LondheShubham153/90DaysOfDevOps/blob/94e3970819e097a5b8edea40fe565d583419f912/2023/day36/Deployment.yml) - -- Apply the updated deployment using the command: `kubectl apply -f deployment.yml` - -- Verify that the Persistent Volume has been added to your Deployment by checking the status of the Pods and Persistent Volumes in your cluster. Use this commands `kubectl get pods` , - -`kubectl get pv` - -⚠️ Don't forget: To apply changes or create files in your Kubernetes deployments, each file must be applied separately. ⚠️ - -### Task 2: - -Accessing data in the Persistent Volume, - -- Connect to a Pod in your Deployment using command : `kubectl exec -it -- /bin/bash - -` - -- Verify that you can access the data stored in the Persistent Volume from within the Pod - -Need help with Persistent Volumes? Check out this [video](https://youtu.be/U0_N3v7vJys) for assistance. - -Keep up the excellent work🙌💥 - -Happy Learning :) - -[← Previous Day](../day35/tasks.md) | [Next Day →](../day37/tasks.md) +# Day 36 Task: Managing Persistent Volumes in Your Deployment 💥 + +🙌 Kudos to you for conquering ConfigMaps and Secrets in Kubernetes yesterday. + +🔥 You're on fire! 🔥 + +## What are Persistent Volumes in k8s + +In Kubernetes, a Persistent Volume (PV) is a piece of storage in the cluster that has been provisioned by an administrator. A Persistent Volume Claim (PVC) is a request for storage by a user. The PVC references the PV, and the PV is bound to a specific node. Read official documentation of [Persistent Volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/). + +⏰ Wait, wait, wait! 📣 Attention all #90daysofDevOps Challengers. 💪 + +Before diving into today's task, don't forget to share your thoughts on the #90daysofDevOps challenge 💪 Fill out our feedback form (https://lnkd.in/gcgvrq8b) to help us improve and provide the best experience 🌟 Your participation and support is greatly appreciated 🙏 Let's continue to grow together 🌱 + +## Today's tasks: + +### Task 1: + +Add a Persistent Volume to your Deployment todo app. + +- Create a Persistent Volume using a file on your node. [Template](https://github.com/LondheShubham153/90DaysOfDevOps/blob/94e3970819e097a5b8edea40fe565d583419f912/2023/day36/pv.yml) + +- Create a Persistent Volume Claim that references the Persistent Volume. [Template](https://github.com/LondheShubham153/90DaysOfDevOps/blob/94e3970819e097a5b8edea40fe565d583419f912/2023/day36/pvc.yml) + +- Update your deployment.yml file to include the Persistent Volume Claim. After Applying pv.yml pvc.yml your deployment file look like this [Template](https://github.com/LondheShubham153/90DaysOfDevOps/blob/94e3970819e097a5b8edea40fe565d583419f912/2023/day36/Deployment.yml) + +- Apply the updated deployment using the command: `kubectl apply -f deployment.yml` + +- Verify that the Persistent Volume has been added to your Deployment by checking the status of the Pods and Persistent Volumes in your cluster. Use this commands `kubectl get pods` , + +`kubectl get pv` + +⚠️ Don't forget: To apply changes or create files in your Kubernetes deployments, each file must be applied separately. ⚠️ + +### Task 2: + +Accessing data in the Persistent Volume, + +- Connect to a Pod in your Deployment using command : `kubectl exec -it -- /bin/bash + +` + +- Verify that you can access the data stored in the Persistent Volume from within the Pod + +Need help with Persistent Volumes? Check out this [video](https://youtu.be/U0_N3v7vJys) for assistance. + +Keep up the excellent work🙌💥 + +Happy Learning :) + +[← Previous Day](../day35/tasks.md) | [Next Day →](../day37/tasks.md) diff --git a/2023/day37/tasks.md b/2023/day37/README.md similarity index 96% rename from 2023/day37/tasks.md rename to 2023/day37/README.md index d3bad9f7f4..cdc3cf10bd 100644 --- a/2023/day37/tasks.md +++ b/2023/day37/README.md @@ -1,43 +1,43 @@ -## Day 37 Task: Kubernetes Important interview Questions. - -## Questions - -1.What is Kubernetes and why it is important? - -2.What is difference between docker swarm and kubernetes? - -3.How does Kubernetes handle network communication between containers? - -4.How does Kubernetes handle scaling of applications? - -5.What is a Kubernetes Deployment and how does it differ from a ReplicaSet? - -6.Can you explain the concept of rolling updates in Kubernetes? - -7.How does Kubernetes handle network security and access control? - -8.Can you give an example of how Kubernetes can be used to deploy a highly available application? - -9.What is namespace is kubernetes? Which namespace any pod takes if we don't specify any namespace? - -10.How ingress helps in kubernetes? - -11.Explain different types of services in kubernetes? - -12.Can you explain the concept of self-healing in Kubernetes and give examples of how it works? - -13.How does Kubernetes handle storage management for containers? - -14.How does the NodePort service work? - -15.What is a multinode cluster and single-node cluster in Kubernetes? - -16.Difference between create and apply in kubernetes? - -## These questions will help you in your next DevOps Interview. - -_Write a Blog and share it on LinkedIn._ - -**_Happy Learning :)_** - -[← Previous Day](../day36/tasks.md) | [Next Day →](../day38/tasks.md) +## Day 37 Task: Kubernetes Important interview Questions. + +## Questions + +1.What is Kubernetes and why it is important? + +2.What is difference between docker swarm and kubernetes? + +3.How does Kubernetes handle network communication between containers? + +4.How does Kubernetes handle scaling of applications? + +5.What is a Kubernetes Deployment and how does it differ from a ReplicaSet? + +6.Can you explain the concept of rolling updates in Kubernetes? + +7.How does Kubernetes handle network security and access control? + +8.Can you give an example of how Kubernetes can be used to deploy a highly available application? + +9.What is namespace is kubernetes? Which namespace any pod takes if we don't specify any namespace? + +10.How ingress helps in kubernetes? + +11.Explain different types of services in kubernetes? + +12.Can you explain the concept of self-healing in Kubernetes and give examples of how it works? + +13.How does Kubernetes handle storage management for containers? + +14.How does the NodePort service work? + +15.What is a multinode cluster and single-node cluster in Kubernetes? + +16.Difference between create and apply in kubernetes? + +## These questions will help you in your next DevOps Interview. + +_Write a Blog and share it on LinkedIn._ + +**_Happy Learning :)_** + +[← Previous Day](../day36/tasks.md) | [Next Day →](../day38/tasks.md) diff --git a/2023/day38/tasks.md b/2023/day38/README.md similarity index 98% rename from 2023/day38/tasks.md rename to 2023/day38/README.md index 35ae94b1a2..0f87273d4a 100644 --- a/2023/day38/tasks.md +++ b/2023/day38/README.md @@ -1,30 +1,30 @@ -# Day 38 Getting Started with AWS Basics☁ - -![AWS](https://user-images.githubusercontent.com/115981550/217238286-6c6bc6e7-a1ac-4d12-98f3-f95ff5bf53fc.png) - -Congratulations!!!! you have come so far. Don't let your excuses break your consistency. Let's begin our new Journey with Cloud☁. By this time you have created multiple EC2 instances, if not let's begin the journey: - -## AWS: - -Amazon Web Services is one of the most popular Cloud Provider that has free tier too for students and Cloud enthutiasts for their Handson while learning (Create your free account today to explore more on it). - -Read from [here](https://aws.amazon.com/what-is-aws/) - -## IAM: - -AWS Identity and Access Management (IAM) is a web service that helps you securely control access to AWS resources. With IAM, you can centrally manage permissions that control which AWS resources users can access. You use IAM to control who is authenticated (signed in) and authorized (has permissions) to use resources. -Read from [here](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) - -Get to know IAM more deeply [Click Here!!](https://www.youtube.com/watch?v=ORB4eY8EydA) - -### Task1: - -Create an IAM user with username of your own wish and grant EC2 Access. Launch your Linux instance through the IAM user that you created now and install jenkins and docker on your machine via single Shell Script. - -### Task2: - -In this task you need to prepare a devops team of avengers. Create 3 IAM users of avengers and assign them in devops groups with IAM policy. - -Post your progress on Linkedin. Till then Happy Learning :) - -[← Previous Day](../day37/tasks.md) | [Next Day →](../day39/tasks.md) +# Day 38 Getting Started with AWS Basics☁ + +![AWS](https://user-images.githubusercontent.com/115981550/217238286-6c6bc6e7-a1ac-4d12-98f3-f95ff5bf53fc.png) + +Congratulations!!!! you have come so far. Don't let your excuses break your consistency. Let's begin our new Journey with Cloud☁. By this time you have created multiple EC2 instances, if not let's begin the journey: + +## AWS: + +Amazon Web Services is one of the most popular Cloud Provider that has free tier too for students and Cloud enthutiasts for their Handson while learning (Create your free account today to explore more on it). + +Read from [here](https://aws.amazon.com/what-is-aws/) + +## IAM: + +AWS Identity and Access Management (IAM) is a web service that helps you securely control access to AWS resources. With IAM, you can centrally manage permissions that control which AWS resources users can access. You use IAM to control who is authenticated (signed in) and authorized (has permissions) to use resources. +Read from [here](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) + +Get to know IAM more deeply [Click Here!!](https://www.youtube.com/watch?v=ORB4eY8EydA) + +### Task1: + +Create an IAM user with username of your own wish and grant EC2 Access. Launch your Linux instance through the IAM user that you created now and install jenkins and docker on your machine via single Shell Script. + +### Task2: + +In this task you need to prepare a devops team of avengers. Create 3 IAM users of avengers and assign them in devops groups with IAM policy. + +Post your progress on Linkedin. Till then Happy Learning :) + +[← Previous Day](../day37/tasks.md) | [Next Day →](../day39/tasks.md) diff --git a/2023/day39/tasks.md b/2023/day39/README.md similarity index 98% rename from 2023/day39/tasks.md rename to 2023/day39/README.md index e748b8b26a..fe65c33bd3 100644 --- a/2023/day39/tasks.md +++ b/2023/day39/README.md @@ -1,41 +1,41 @@ -# Day 39 AWS and IAM Basics☁ - -![AWS](https://miro.medium.com/max/1400/0*dIzXLQn6aBClm1TJ.png) - -By this time you have created multiple EC2 instances, and post installation manually installed applications like Jenkins, docker etc. -Now let's switch to little automation part. Sounds interesting??🤯 - -## AWS: - -Amazon Web Services is one of the most popular Cloud Provider that has free tier too for students and Cloud enthutiasts for their Handson while learning (Create your free account today to explore more on it). - -Read from [here](https://aws.amazon.com/what-is-aws/) - -## User Data in AWS: - -- When you launch an instance in Amazon EC2, you have the option of passing user data to the instance that can be used to perform common automated configuration tasks and even run scripts after the instance starts. You can pass two types of user data to Amazon EC2: shell scripts and cloud-init directives. -- You can also pass this data into the launch instance wizard as plain text, as a file (this is useful for launching instances using the command line tools), or as base64-encoded text (for API calls). -- This will save time and manual effort everytime you launch an instance and want to install any application on it like apache, docker, Jenkins etc - -Read more from [here](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html) - -## IAM: - -AWS Identity and Access Management (IAM) is a web service that helps you securely control access to AWS resources. With IAM, you can centrally manage permissions that control which AWS resources users can access. You use IAM to control who is authenticated (signed in) and authorized (has permissions) to use resources. -Read from [here](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) - -Get to know IAM more deeply🏊[Click Here!!](https://www.youtube.com/watch?v=ORB4eY8EydA) - -### Task1: - -- Launch EC2 instance with already installed Jenkins on it. Once server shows up in console, hit the IP address in browser and you Jenkins page should be visible. -- Take screenshot of Userdata and Jenkins page, this will verify the task completion. - -### Task2: - -- Read more on IAM Roles and explain the IAM Users, Groups and Roles in your own terms. -- Create three Roles named: DevOps-User, Test-User and Admin. - -Post your progress on Linkedin. Till then Happy Learning :) - -[← Previous Day](../day38/tasks.md) | [Next Day →](../day40/tasks.md) +# Day 39 AWS and IAM Basics☁ + +![AWS](https://miro.medium.com/max/1400/0*dIzXLQn6aBClm1TJ.png) + +By this time you have created multiple EC2 instances, and post installation manually installed applications like Jenkins, docker etc. +Now let's switch to little automation part. Sounds interesting??🤯 + +## AWS: + +Amazon Web Services is one of the most popular Cloud Provider that has free tier too for students and Cloud enthutiasts for their Handson while learning (Create your free account today to explore more on it). + +Read from [here](https://aws.amazon.com/what-is-aws/) + +## User Data in AWS: + +- When you launch an instance in Amazon EC2, you have the option of passing user data to the instance that can be used to perform common automated configuration tasks and even run scripts after the instance starts. You can pass two types of user data to Amazon EC2: shell scripts and cloud-init directives. +- You can also pass this data into the launch instance wizard as plain text, as a file (this is useful for launching instances using the command line tools), or as base64-encoded text (for API calls). +- This will save time and manual effort everytime you launch an instance and want to install any application on it like apache, docker, Jenkins etc + +Read more from [here](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html) + +## IAM: + +AWS Identity and Access Management (IAM) is a web service that helps you securely control access to AWS resources. With IAM, you can centrally manage permissions that control which AWS resources users can access. You use IAM to control who is authenticated (signed in) and authorized (has permissions) to use resources. +Read from [here](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) + +Get to know IAM more deeply🏊[Click Here!!](https://www.youtube.com/watch?v=ORB4eY8EydA) + +### Task1: + +- Launch EC2 instance with already installed Jenkins on it. Once server shows up in console, hit the IP address in browser and you Jenkins page should be visible. +- Take screenshot of Userdata and Jenkins page, this will verify the task completion. + +### Task2: + +- Read more on IAM Roles and explain the IAM Users, Groups and Roles in your own terms. +- Create three Roles named: DevOps-User, Test-User and Admin. + +Post your progress on Linkedin. Till then Happy Learning :) + +[← Previous Day](../day38/tasks.md) | [Next Day →](../day40/tasks.md) diff --git a/2023/day40/tasks.md b/2023/day40/README.md similarity index 100% rename from 2023/day40/tasks.md rename to 2023/day40/README.md diff --git a/2023/day41/tasks.md b/2023/day41/README.md similarity index 98% rename from 2023/day41/tasks.md rename to 2023/day41/README.md index 929480444a..d504668d72 100644 --- a/2023/day41/tasks.md +++ b/2023/day41/README.md @@ -1,53 +1,53 @@ -# Day 41: Setting up an Application Load Balancer with AWS EC2 🚀 ☁ - -![LB2](https://user-images.githubusercontent.com/115981550/218145297-d55fe812-32b7-4242-a4f8-eb66312caa2c.png) - -### Hi, I hope you had a great day yesterday learning about the launch template and instances in EC2. Today, we are going to dive into one of the most important concepts in EC2: Load Balancing. - -## What is Load Balancing? - -Load balancing is the distribution of workloads across multiple servers to ensure consistent and optimal resource utilization. It is an essential aspect of any large-scale and scalable computing system, as it helps you to improve the reliability and performance of your applications. - -## Elastic Load Balancing: - -**Elastic Load Balancing (ELB)** is a service provided by Amazon Web Services (AWS) that automatically distributes incoming traffic across multiple EC2 instances. ELB provides three types of load balancers: - -Read more from [here](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) - -1. **Application Load Balancer (ALB)** - _operates at layer 7 of the OSI model and is ideal for applications that require advanced routing and microservices._ - -- Read more from [here](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html) - -2. **Network Load Balancer (NLB)** - _operates at layer 4 of the OSI model and is ideal for applications that require high throughput and low latency._ - -- Read more from [here](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/introduction.html) - -3. **Classic Load Balancer (CLB)** - _operates at layer 4 of the OSI model and is ideal for applications that require basic load balancing features._ - -- Read more [here](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/introduction.html) - -## 🎯 Today's Tasks: - -### Task 1: - -- launch 2 EC2 instances with an Ubuntu AMI and use User Data to install the Apache Web Server. -- Modify the index.html file to include your name so that when your Apache server is hosted, it will display your name also do it for 2nd instance which include " TrainWithShubham Community is Super Aweasome :) ". -- Copy the public IP address of your EC2 instances. -- Open a web browser and paste the public IP address into the address bar. -- You should see a webpage displaying information about your PHP installation. - -### Task 2: - -- Create an Application Load Balancer (ALB) in EC2 using the AWS Management Console. -- Add EC2 instances which you launch in task-1 to the ALB as target groups. -- Verify that the ALB is working properly by checking the health status of the target instances and testing the load balancing capabilities. - -![LoadBalancer](https://user-images.githubusercontent.com/115981550/218143557-26ec33ce-99a7-4db6-a46f-1cf48ed77ae0.png) - -Need help with task? Check out this [Blog for assistance](https://rushikesh-mashidkar.hashnode.dev/create-an-application-load-balancer-elastic-load-balancing-using-aws-ec2-instance). - -Don't forget to share your progress on LinkedIn and have a great day🙌💥 - -Happy Learning! 😃 - -[← Previous Day](../day40/tasks.md) | [Next Day →](../day42/tasks.md) +# Day 41: Setting up an Application Load Balancer with AWS EC2 🚀 ☁ + +![LB2](https://user-images.githubusercontent.com/115981550/218145297-d55fe812-32b7-4242-a4f8-eb66312caa2c.png) + +### Hi, I hope you had a great day yesterday learning about the launch template and instances in EC2. Today, we are going to dive into one of the most important concepts in EC2: Load Balancing. + +## What is Load Balancing? + +Load balancing is the distribution of workloads across multiple servers to ensure consistent and optimal resource utilization. It is an essential aspect of any large-scale and scalable computing system, as it helps you to improve the reliability and performance of your applications. + +## Elastic Load Balancing: + +**Elastic Load Balancing (ELB)** is a service provided by Amazon Web Services (AWS) that automatically distributes incoming traffic across multiple EC2 instances. ELB provides three types of load balancers: + +Read more from [here](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) + +1. **Application Load Balancer (ALB)** - _operates at layer 7 of the OSI model and is ideal for applications that require advanced routing and microservices._ + +- Read more from [here](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html) + +2. **Network Load Balancer (NLB)** - _operates at layer 4 of the OSI model and is ideal for applications that require high throughput and low latency._ + +- Read more from [here](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/introduction.html) + +3. **Classic Load Balancer (CLB)** - _operates at layer 4 of the OSI model and is ideal for applications that require basic load balancing features._ + +- Read more [here](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/introduction.html) + +## 🎯 Today's Tasks: + +### Task 1: + +- launch 2 EC2 instances with an Ubuntu AMI and use User Data to install the Apache Web Server. +- Modify the index.html file to include your name so that when your Apache server is hosted, it will display your name also do it for 2nd instance which include " TrainWithShubham Community is Super Aweasome :) ". +- Copy the public IP address of your EC2 instances. +- Open a web browser and paste the public IP address into the address bar. +- You should see a webpage displaying information about your PHP installation. + +### Task 2: + +- Create an Application Load Balancer (ALB) in EC2 using the AWS Management Console. +- Add EC2 instances which you launch in task-1 to the ALB as target groups. +- Verify that the ALB is working properly by checking the health status of the target instances and testing the load balancing capabilities. + +![LoadBalancer](https://user-images.githubusercontent.com/115981550/218143557-26ec33ce-99a7-4db6-a46f-1cf48ed77ae0.png) + +Need help with task? Check out this [Blog for assistance](https://rushikesh-mashidkar.hashnode.dev/create-an-application-load-balancer-elastic-load-balancing-using-aws-ec2-instance). + +Don't forget to share your progress on LinkedIn and have a great day🙌💥 + +Happy Learning! 😃 + +[← Previous Day](../day40/tasks.md) | [Next Day →](../day42/tasks.md) diff --git a/2023/day42/tasks.md b/2023/day42/README.md similarity index 100% rename from 2023/day42/tasks.md rename to 2023/day42/README.md diff --git a/2023/day43/tasks.md b/2023/day43/README.md similarity index 98% rename from 2023/day43/tasks.md rename to 2023/day43/README.md index 146d65b5dd..96128f280e 100644 --- a/2023/day43/tasks.md +++ b/2023/day43/README.md @@ -1,32 +1,32 @@ -# Day 43: S3 Programmatic access with AWS-CLI 💻 📁 - -Hi, I hope you had a great day yesterday. Today as part of the #90DaysofDevOps Challenge we will be exploring most commonly used service in AWS i.e S3. - -![s3](https://user-images.githubusercontent.com/115981550/218308379-a2e841cf-6b77-4d02-bfbe-20d1bae09b20.png) - -# S3 - -Amazon Simple Storage Service (Amazon S3) is an object storage service that provides a secure and scalable way to store and access data on the cloud. It is designed for storing any kind of data, such as text files, images, videos, backups, and more. -Read more [here](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) - -## Task-01 - -- Launch an EC2 instance using the AWS Management Console and connect to it using Secure Shell (SSH). -- Create an S3 bucket and upload a file to it using the AWS Management Console. -- Access the file from the EC2 instance using the AWS Command Line Interface (AWS CLI). - -Read more about S3 using aws-cli [here](https://docs.aws.amazon.com/cli/latest/reference/s3/index.html) - -## Task-02 - -- Create a snapshot of the EC2 instance and use it to launch a new EC2 instance. -- Download a file from the S3 bucket using the AWS CLI. -- Verify that the contents of the file are the same on both EC2 instances. - -Added Some Useful commands to complete the task. [Click here for commands](https://github.com/LondheShubham153/90DaysOfDevOps/blob/833a67ac4ec17b992934cd6878875dccc4274f56/2023/day43/aws-cli.md) - -Let me know if you have any questions or face any issues while doing the tasks.🚀 - -Happy Learning :) - -[← Previous Day](../day42/tasks.md) | [Next Day →](../day44/tasks.md) +# Day 43: S3 Programmatic access with AWS-CLI 💻 📁 + +Hi, I hope you had a great day yesterday. Today as part of the #90DaysofDevOps Challenge we will be exploring most commonly used service in AWS i.e S3. + +![s3](https://user-images.githubusercontent.com/115981550/218308379-a2e841cf-6b77-4d02-bfbe-20d1bae09b20.png) + +# S3 + +Amazon Simple Storage Service (Amazon S3) is an object storage service that provides a secure and scalable way to store and access data on the cloud. It is designed for storing any kind of data, such as text files, images, videos, backups, and more. +Read more [here](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) + +## Task-01 + +- Launch an EC2 instance using the AWS Management Console and connect to it using Secure Shell (SSH). +- Create an S3 bucket and upload a file to it using the AWS Management Console. +- Access the file from the EC2 instance using the AWS Command Line Interface (AWS CLI). + +Read more about S3 using aws-cli [here](https://docs.aws.amazon.com/cli/latest/reference/s3/index.html) + +## Task-02 + +- Create a snapshot of the EC2 instance and use it to launch a new EC2 instance. +- Download a file from the S3 bucket using the AWS CLI. +- Verify that the contents of the file are the same on both EC2 instances. + +Added Some Useful commands to complete the task. [Click here for commands](https://github.com/LondheShubham153/90DaysOfDevOps/blob/833a67ac4ec17b992934cd6878875dccc4274f56/2023/day43/aws-cli.md) + +Let me know if you have any questions or face any issues while doing the tasks.🚀 + +Happy Learning :) + +[← Previous Day](../day42/tasks.md) | [Next Day →](../day44/tasks.md) diff --git a/2023/day44/tasks.md b/2023/day44/README.md similarity index 100% rename from 2023/day44/tasks.md rename to 2023/day44/README.md diff --git a/2023/day45/tasks.md b/2023/day45/README.md similarity index 100% rename from 2023/day45/tasks.md rename to 2023/day45/README.md diff --git a/2023/day46/tasks.md b/2023/day46/README.md similarity index 98% rename from 2023/day46/tasks.md rename to 2023/day46/README.md index 34ae6b53ce..54f3fcecfc 100644 --- a/2023/day46/tasks.md +++ b/2023/day46/README.md @@ -1,35 +1,35 @@ -# Day-46: Set up CloudWatch alarms and SNS topic in AWS - -Hey learners, you have been using aws services atleast for last 45 days. Have you ever wondered what happen if for any service is charging you bill continously and you don't know till you loose all your pocket money ? - -Hahahaha😁, Well! we, as a responsible community ,always try to make it under free tier , but it's good to know and setup something , which will inform you whenever bill touches a Threshold. - -## What is Amazon CloudWatch? - -Amazon CloudWatch monitors your Amazon Web Services (AWS) resources and the applications you run on AWS in real time. You can use CloudWatch to collect and track metrics, which are variables you can measure for your resources and applications. - -Read more about cloudwatch from the official documentation [here](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html) - -## What is Amazon SNS? - -Amazon Simple Notification Service is a notification service provided as part of Amazon Web Services since 2010. It provides a low-cost infrastructure for mass delivery of messages, predominantly to mobile users. - -Read more about it [here](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) - -## Task : - -- Create a CloudWatch alarm that monitors your billing and send an email to you when a it reaches $2. - -(You can keep it for your future use) - -- Delete your billing Alarm that you created now. - -(Now you also know how to delete as well. ) - -Need help with Cloudwatch? Check out this [official documentation](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html) for assistance. - -Keep growing your AWS knowledge💥🙌 - -Happy Learning! :) - -[← Previous Day](../day45/tasks.md) | [Next Day →](../day47/tasks.md) +# Day-46: Set up CloudWatch alarms and SNS topic in AWS + +Hey learners, you have been using aws services atleast for last 45 days. Have you ever wondered what happen if for any service is charging you bill continously and you don't know till you loose all your pocket money ? + +Hahahaha😁, Well! we, as a responsible community ,always try to make it under free tier , but it's good to know and setup something , which will inform you whenever bill touches a Threshold. + +## What is Amazon CloudWatch? + +Amazon CloudWatch monitors your Amazon Web Services (AWS) resources and the applications you run on AWS in real time. You can use CloudWatch to collect and track metrics, which are variables you can measure for your resources and applications. + +Read more about cloudwatch from the official documentation [here](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html) + +## What is Amazon SNS? + +Amazon Simple Notification Service is a notification service provided as part of Amazon Web Services since 2010. It provides a low-cost infrastructure for mass delivery of messages, predominantly to mobile users. + +Read more about it [here](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) + +## Task : + +- Create a CloudWatch alarm that monitors your billing and send an email to you when a it reaches $2. + +(You can keep it for your future use) + +- Delete your billing Alarm that you created now. + +(Now you also know how to delete as well. ) + +Need help with Cloudwatch? Check out this [official documentation](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html) for assistance. + +Keep growing your AWS knowledge💥🙌 + +Happy Learning! :) + +[← Previous Day](../day45/tasks.md) | [Next Day →](../day47/tasks.md) diff --git a/2023/day47/tasks.md b/2023/day47/README.md similarity index 98% rename from 2023/day47/tasks.md rename to 2023/day47/README.md index cbc4f4d2a8..1d6ede2027 100644 --- a/2023/day47/tasks.md +++ b/2023/day47/README.md @@ -1,21 +1,21 @@ -# Day 47: Test Knowledge on aws 💻 📈 - -Today, we will be test the aws knowledge on services in AWS, as part of the 90 Days of DevOps Challenge. - -## Task-01 - -- Launch an EC2 instance using the AWS Management Console and connect to it using SSH. -- Install a web server on the EC2 instance and deploy a simple web application. -- Monitor the EC2 instance using Amazon CloudWatch and troubleshoot any issues that arise. - -## Task-02 - -- Create an Auto Scaling group using the AWS Management Console and configure it to launch EC2 instances in response to changes in demand. -- Use Amazon CloudWatch to monitor the performance of the Auto Scaling group and the EC2 instances and troubleshoot any issues that arise. -- Use the AWS CLI to view the state of the Auto Scaling group and the EC2 instances and verify that the correct number of instances are running. - -We hope that these tasks will give you hands-on experience with aws services and help you understand how these services work together. If you have any questions or face any issues while doing the tasks, please let us know. - -Happy Learning :) - -[← Previous Day](../day46/tasks.md) | [Next Day →](../day48/tasks.md) +# Day 47: Test Knowledge on aws 💻 📈 + +Today, we will be test the aws knowledge on services in AWS, as part of the 90 Days of DevOps Challenge. + +## Task-01 + +- Launch an EC2 instance using the AWS Management Console and connect to it using SSH. +- Install a web server on the EC2 instance and deploy a simple web application. +- Monitor the EC2 instance using Amazon CloudWatch and troubleshoot any issues that arise. + +## Task-02 + +- Create an Auto Scaling group using the AWS Management Console and configure it to launch EC2 instances in response to changes in demand. +- Use Amazon CloudWatch to monitor the performance of the Auto Scaling group and the EC2 instances and troubleshoot any issues that arise. +- Use the AWS CLI to view the state of the Auto Scaling group and the EC2 instances and verify that the correct number of instances are running. + +We hope that these tasks will give you hands-on experience with aws services and help you understand how these services work together. If you have any questions or face any issues while doing the tasks, please let us know. + +Happy Learning :) + +[← Previous Day](../day46/tasks.md) | [Next Day →](../day48/tasks.md) diff --git a/2023/day48/tasks.md b/2023/day48/README.md similarity index 98% rename from 2023/day48/tasks.md rename to 2023/day48/README.md index 066883556d..9ae50159dd 100644 --- a/2023/day48/tasks.md +++ b/2023/day48/README.md @@ -1,40 +1,40 @@ -# Day-48 - ECS - -Today will be a great learning for sure. I know many of you may not know about the term "ECS". As you know, 90 Days Of DevOps Challange is mostly about 'learning new' , let's learn then ;) - -## What is ECS ? - -- ECS (Elastic Container Service) is a fully-managed container orchestration service provided by Amazon Web Services (AWS). It allows you to run and manage Docker containers on a cluster of virtual machines (EC2 instances) without having to manage the underlying infrastructure. - -With ECS, you can easily deploy, manage, and scale your containerized applications using the AWS Management Console, the AWS CLI, or the API. ECS supports both "Fargate" and "EC2 launch types", which means you can run your containers on AWS-managed infrastructure or your own EC2 instances. - -ECS also integrates with other AWS services, such as Elastic Load Balancing, Auto Scaling, and Amazon VPC, allowing you to build scalable and highly available applications. Additionally, ECS has support for Docker Compose and Kubernetes, making it easy to adopt existing container workflows. - -Overall, ECS is a powerful and flexible container orchestration service that can help simplify the deployment and management of containerized applications in AWS. - -## Difference between EKS and ECS ? - -- EKS (Elastic Kubernetes Service) and ECS (Elastic Container Service) are both container orchestration platforms provided by Amazon Web Services (AWS). While both platforms allow you to run containerized applications in the AWS cloud, there are some differences between the two. - -**Architecture**: -ECS is based on a centralized architecture, where there is a control plane that manages the scheduling of containers on EC2 instances. On the other hand, EKS is based on a distributed architecture, where the Kubernetes control plane is distributed across multiple EC2 instances. - -**Kubernetes Support**: -EKS is a fully managed Kubernetes service, meaning that it supports Kubernetes natively and allows you to run your Kubernetes workloads on AWS without having to manage the Kubernetes control plane. ECS, on the other hand, has its own orchestration engine and does not support Kubernetes natively. - -**Scaling**: -EKS is designed to automatically scale your Kubernetes cluster based on demand, whereas ECS requires you to configure scaling policies for your tasks and services. - -**Flexibility**: -EKS provides more flexibility than ECS in terms of container orchestration, as it allows you to customize and configure Kubernetes to meet your specific requirements. ECS is more restrictive in terms of the options available for container orchestration. - -**Community**: -Kubernetes has a large and active open-source community, which means that EKS benefits from a wide range of community-driven development and support. ECS, on the other hand, has a smaller community and is largely driven by AWS itself. - -In summary, EKS is a good choice if you want to use Kubernetes to manage your containerized workloads on AWS, while ECS is a good choice if you want a simpler, more managed platform for running your containerized applications. - -# Task : - -Set up ECS (Elastic Container Service) by setting up Nginx on ECS. - -[← Previous Day](../day47/tasks.md) | [Next Day →](../day49/tasks.md) +# Day-48 - ECS + +Today will be a great learning for sure. I know many of you may not know about the term "ECS". As you know, 90 Days Of DevOps Challange is mostly about 'learning new' , let's learn then ;) + +## What is ECS ? + +- ECS (Elastic Container Service) is a fully-managed container orchestration service provided by Amazon Web Services (AWS). It allows you to run and manage Docker containers on a cluster of virtual machines (EC2 instances) without having to manage the underlying infrastructure. + +With ECS, you can easily deploy, manage, and scale your containerized applications using the AWS Management Console, the AWS CLI, or the API. ECS supports both "Fargate" and "EC2 launch types", which means you can run your containers on AWS-managed infrastructure or your own EC2 instances. + +ECS also integrates with other AWS services, such as Elastic Load Balancing, Auto Scaling, and Amazon VPC, allowing you to build scalable and highly available applications. Additionally, ECS has support for Docker Compose and Kubernetes, making it easy to adopt existing container workflows. + +Overall, ECS is a powerful and flexible container orchestration service that can help simplify the deployment and management of containerized applications in AWS. + +## Difference between EKS and ECS ? + +- EKS (Elastic Kubernetes Service) and ECS (Elastic Container Service) are both container orchestration platforms provided by Amazon Web Services (AWS). While both platforms allow you to run containerized applications in the AWS cloud, there are some differences between the two. + +**Architecture**: +ECS is based on a centralized architecture, where there is a control plane that manages the scheduling of containers on EC2 instances. On the other hand, EKS is based on a distributed architecture, where the Kubernetes control plane is distributed across multiple EC2 instances. + +**Kubernetes Support**: +EKS is a fully managed Kubernetes service, meaning that it supports Kubernetes natively and allows you to run your Kubernetes workloads on AWS without having to manage the Kubernetes control plane. ECS, on the other hand, has its own orchestration engine and does not support Kubernetes natively. + +**Scaling**: +EKS is designed to automatically scale your Kubernetes cluster based on demand, whereas ECS requires you to configure scaling policies for your tasks and services. + +**Flexibility**: +EKS provides more flexibility than ECS in terms of container orchestration, as it allows you to customize and configure Kubernetes to meet your specific requirements. ECS is more restrictive in terms of the options available for container orchestration. + +**Community**: +Kubernetes has a large and active open-source community, which means that EKS benefits from a wide range of community-driven development and support. ECS, on the other hand, has a smaller community and is largely driven by AWS itself. + +In summary, EKS is a good choice if you want to use Kubernetes to manage your containerized workloads on AWS, while ECS is a good choice if you want a simpler, more managed platform for running your containerized applications. + +# Task : + +Set up ECS (Elastic Container Service) by setting up Nginx on ECS. + +[← Previous Day](../day47/tasks.md) | [Next Day →](../day49/tasks.md) diff --git a/2023/day49/tasks.md b/2023/day49/README.md similarity index 98% rename from 2023/day49/tasks.md rename to 2023/day49/README.md index 064743c54e..860d64c906 100644 --- a/2023/day49/tasks.md +++ b/2023/day49/README.md @@ -1,25 +1,25 @@ -# Day 49 - INTERVIEW QUESTIONS ON AWS - -Hey people, we have listened to your suggestions and we are looking forward to get more! -As you people have asked to put more interview based questions as part of Daily Task, So here it it :) - -## INTERVIEW QUESTIONS: - -- Name 5 aws services you have used and what's the use cases? -- What are the tools used to send logs to the cloud environment? -- What are IAM Roles? How do you create /manage them? -- How to upgrade or downgrade a system with zero downtime? -- What is infrastructure as code and how do you use it? -- What is a load balancer? Give scenarios of each kind of balancer based on your experience. -- What is CloudFormation and why is it used for? -- Difference between AWS CloudFormation and AWS Elastic Beanstalk? -- What are the kinds of security attacks that can occur on the cloud? And how can we minimize them? -- Can we recover the EC2 instance when we have lost the key? -- What is a gateway? -- What is the difference between the Amazon Rds, Dynamodb, and Redshift? -- Do you prefer to host a website on S3? What's the reason if your answer is either yes or no? - -Let's share your answer on LinkedIn in best possible way thinking you are in a interview table. -Happy Learning !! :) - -[← Previous Day](../day48/tasks.md) | [Next Day →](../day50/tasks.md) +# Day 49 - INTERVIEW QUESTIONS ON AWS + +Hey people, we have listened to your suggestions and we are looking forward to get more! +As you people have asked to put more interview based questions as part of Daily Task, So here it it :) + +## INTERVIEW QUESTIONS: + +- Name 5 aws services you have used and what's the use cases? +- What are the tools used to send logs to the cloud environment? +- What are IAM Roles? How do you create /manage them? +- How to upgrade or downgrade a system with zero downtime? +- What is infrastructure as code and how do you use it? +- What is a load balancer? Give scenarios of each kind of balancer based on your experience. +- What is CloudFormation and why is it used for? +- Difference between AWS CloudFormation and AWS Elastic Beanstalk? +- What are the kinds of security attacks that can occur on the cloud? And how can we minimize them? +- Can we recover the EC2 instance when we have lost the key? +- What is a gateway? +- What is the difference between the Amazon Rds, Dynamodb, and Redshift? +- Do you prefer to host a website on S3? What's the reason if your answer is either yes or no? + +Let's share your answer on LinkedIn in best possible way thinking you are in a interview table. +Happy Learning !! :) + +[← Previous Day](../day48/tasks.md) | [Next Day →](../day50/tasks.md) diff --git a/2023/day50/tasks.md b/2023/day50/README.md similarity index 100% rename from 2023/day50/tasks.md rename to 2023/day50/README.md diff --git a/2023/day51/tasks.md b/2023/day51/README.md similarity index 100% rename from 2023/day51/tasks.md rename to 2023/day51/README.md diff --git a/2023/day52/tasks.md b/2023/day52/README.md similarity index 100% rename from 2023/day52/tasks.md rename to 2023/day52/README.md diff --git a/2023/day53/tasks.md b/2023/day53/README.md similarity index 100% rename from 2023/day53/tasks.md rename to 2023/day53/README.md diff --git a/2023/day54/tasks.md b/2023/day54/README.md similarity index 100% rename from 2023/day54/tasks.md rename to 2023/day54/README.md diff --git a/2023/day55/tasks.md b/2023/day55/README.md similarity index 100% rename from 2023/day55/tasks.md rename to 2023/day55/README.md diff --git a/2023/day56/tasks.md b/2023/day56/README.md similarity index 100% rename from 2023/day56/tasks.md rename to 2023/day56/README.md diff --git a/2023/day57/tasks.md b/2023/day57/README.md similarity index 100% rename from 2023/day57/tasks.md rename to 2023/day57/README.md diff --git a/2023/day58/tasks.md b/2023/day58/README.md similarity index 100% rename from 2023/day58/tasks.md rename to 2023/day58/README.md diff --git a/2023/day59/tasks.md b/2023/day59/README.md similarity index 100% rename from 2023/day59/tasks.md rename to 2023/day59/README.md diff --git a/2023/day60/tasks.md b/2023/day60/README.md similarity index 97% rename from 2023/day60/tasks.md rename to 2023/day60/README.md index 1a9b3edcf6..c8301a16df 100644 --- a/2023/day60/tasks.md +++ b/2023/day60/README.md @@ -1,31 +1,31 @@ -# Day 60 - Terraform🔥 - -Hello Learners , you guys are doing every task by creating an ec2 instance (mostly). Today let’s automate this process . How to do it ? Well Terraform is the solution . - -## What is Terraform? - -Terraform is an infrastructure as code (IaC) tool that allows you to create, manage, and update infrastructure -resources such as virtual machines, networks, and storage in a repeatable, scalable, and automated way. - -## Task 1: - -Install Terraform on your system -Refer this [link](https://phoenixnap.com/kb/how-to-install-terraform) for installation - -## Task 2: Answer below questions - -- Why we use terraform? -- What is Infrastructure as Code (IaC)? -- What is Resource? -- What is Provider? -- Whats is State file in terraform? What’s the importance of it ? -- What is Desired and Current State? - -You can prepare for tomorrow's task from [here](https://www.youtube.com/live/965CaSveIEI?feature=share)🚀🚀 - -We Hope this tasks will help you understand how to write a basic Terraform configuration file and basic commands on Terraform. - -Don’t forget to post in on LinkedIn. -Happy Learning:) - -[← Previous Day](../day59/tasks.md) | [Next Day →](../day61/tasks.md) +# Day 60 - Terraform🔥 + +Hello Learners , you guys are doing every task by creating an ec2 instance (mostly). Today let’s automate this process . How to do it ? Well Terraform is the solution . + +## What is Terraform? + +Terraform is an infrastructure as code (IaC) tool that allows you to create, manage, and update infrastructure +resources such as virtual machines, networks, and storage in a repeatable, scalable, and automated way. + +## Task 1: + +Install Terraform on your system +Refer this [link](https://phoenixnap.com/kb/how-to-install-terraform) for installation + +## Task 2: Answer below questions + +- Why we use terraform? +- What is Infrastructure as Code (IaC)? +- What is Resource? +- What is Provider? +- Whats is State file in terraform? What’s the importance of it ? +- What is Desired and Current State? + +You can prepare for tomorrow's task from [here](https://www.youtube.com/live/965CaSveIEI?feature=share)🚀🚀 + +We Hope this tasks will help you understand how to write a basic Terraform configuration file and basic commands on Terraform. + +Don’t forget to post in on LinkedIn. +Happy Learning:) + +[← Previous Day](../day59/tasks.md) | [Next Day →](../day61/tasks.md) diff --git a/2023/day61/tasks.md b/2023/day61/README.md similarity index 95% rename from 2023/day61/tasks.md rename to 2023/day61/README.md index 982e3cb918..59dc49d4bf 100644 --- a/2023/day61/tasks.md +++ b/2023/day61/README.md @@ -1,37 +1,37 @@ -# Day 61- Terraform🔥 - -Hope you've already got the gist of What Working with Terraform would be like . Lets begin -with day 2 of Terraform ! - -## Task 1: - -find purpose of basic Terraform commands which you'll use often - -1. `terraform init` - -2. `terraform init -upgrade` - -3. `terraform plan` - -4. `terraform apply` - -5. `terraform validate` - -6. `terraform fmt` - -7. `terraform destroy` - -Also along with these tasks its important to know about Terraform in general- -Who are Terraform's main competitors? -The main competitors are: - -Ansible -Packer -Cloud Foundry -Kubernetes - -Want a Free video Course for terraform? Click [here](https://bit.ly/tws-terraform) - -Don't forget to share your learnings on Linkedin ! Happy Learning :) - -[← Previous Day](../day60/tasks.md) | [Next Day →](../day62/tasks.md) +# Day 61- Terraform🔥 + +Hope you've already got the gist of What Working with Terraform would be like . Lets begin +with day 2 of Terraform ! + +## Task 1: + +find purpose of basic Terraform commands which you'll use often + +1. `terraform init` + +2. `terraform init -upgrade` + +3. `terraform plan` + +4. `terraform apply` + +5. `terraform validate` + +6. `terraform fmt` + +7. `terraform destroy` + +Also along with these tasks its important to know about Terraform in general- +Who are Terraform's main competitors? +The main competitors are: + +Ansible +Packer +Cloud Foundry +Kubernetes + +Want a Free video Course for terraform? Click [here](https://bit.ly/tws-terraform) + +Don't forget to share your learnings on Linkedin ! Happy Learning :) + +[← Previous Day](../day60/tasks.md) | [Next Day →](../day62/tasks.md) diff --git a/2023/day62/tasks.md b/2023/day62/README.md similarity index 100% rename from 2023/day62/tasks.md rename to 2023/day62/README.md diff --git a/2023/day63/tasks.md b/2023/day63/README.md similarity index 100% rename from 2023/day63/tasks.md rename to 2023/day63/README.md diff --git a/2023/day64/tasks.md b/2023/day64/README.md similarity index 100% rename from 2023/day64/tasks.md rename to 2023/day64/README.md diff --git a/2023/day65/tasks.md b/2023/day65/README.md similarity index 97% rename from 2023/day65/tasks.md rename to 2023/day65/README.md index 7cd99ebc76..04da60caa8 100644 --- a/2023/day65/tasks.md +++ b/2023/day65/README.md @@ -1,67 +1,67 @@ -# Day 65 - Working with Terraform Resources 🚀 - -Yesterday, we saw how to create a Terraform script with Blocks and Resources. Today, we will dive deeper into Terraform resources. - -## Understanding Terraform Resources - -A resource in Terraform represents a component of your infrastructure, such as a physical server, a virtual machine, a DNS record, or an S3 bucket. Resources have attributes that define their properties and behaviors, such as the size and location of a virtual machine or the domain name of a DNS record. - -When you define a resource in Terraform, you specify the type of resource, a unique name for the resource, and the attributes that define the resource. Terraform uses the resource block to define resources in your Terraform configuration. - -## Task 1: Create a security group - -To allow traffic to the EC2 instance, you need to create a security group. Follow these steps: - -In your main.tf file, add the following code to create a security group: - -``` -resource "aws_security_group" "web_server" { - name_prefix = "web-server-sg" - - ingress { - from_port = 80 - to_port = 80 - protocol = "tcp" - cidr_blocks = ["0.0.0.0/0"] - } -} -``` - -- Run terraform init to initialize the Terraform project. - -- Run terraform apply to create the security group. - -## Task 2: Create an EC2 instance - -- Now you can create an EC2 instance with Terraform. Follow these steps: - -- In your main.tf file, add the following code to create an EC2 instance: - -``` -resource "aws_instance" "web_server" { - ami = "ami-0557a15b87f6559cf" - instance_type = "t2.micro" - key_name = "my-key-pair" - security_groups = [ - aws_security_group.web_server.name - ] - - user_data = <<-EOF - #!/bin/bash - echo "

Welcome to my website!

" > index.html - nohup python -m SimpleHTTPServer 80 & - EOF -} -``` - -Note: Replace the ami and key_name values with your own. You can find a list of available AMIs in the AWS documentation. - -Run terraform apply to create the EC2 instance. - -## Task 3: Access your website - -- Now that your EC2 instance is up and running, you can access the website you just hosted on it. Follow these steps: - -Happy Terraforming! - -[← Previous Day](../day64/tasks.md) | [Next Day →](../day66/tasks.md) +# Day 65 - Working with Terraform Resources 🚀 + +Yesterday, we saw how to create a Terraform script with Blocks and Resources. Today, we will dive deeper into Terraform resources. + +## Understanding Terraform Resources + +A resource in Terraform represents a component of your infrastructure, such as a physical server, a virtual machine, a DNS record, or an S3 bucket. Resources have attributes that define their properties and behaviors, such as the size and location of a virtual machine or the domain name of a DNS record. + +When you define a resource in Terraform, you specify the type of resource, a unique name for the resource, and the attributes that define the resource. Terraform uses the resource block to define resources in your Terraform configuration. + +## Task 1: Create a security group + +To allow traffic to the EC2 instance, you need to create a security group. Follow these steps: + +In your main.tf file, add the following code to create a security group: + +``` +resource "aws_security_group" "web_server" { + name_prefix = "web-server-sg" + + ingress { + from_port = 80 + to_port = 80 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + } +} +``` + +- Run terraform init to initialize the Terraform project. + +- Run terraform apply to create the security group. + +## Task 2: Create an EC2 instance + +- Now you can create an EC2 instance with Terraform. Follow these steps: + +- In your main.tf file, add the following code to create an EC2 instance: + +``` +resource "aws_instance" "web_server" { + ami = "ami-0557a15b87f6559cf" + instance_type = "t2.micro" + key_name = "my-key-pair" + security_groups = [ + aws_security_group.web_server.name + ] + + user_data = <<-EOF + #!/bin/bash + echo "

Welcome to my website!

" > index.html + nohup python -m SimpleHTTPServer 80 & + EOF +} +``` + +Note: Replace the ami and key_name values with your own. You can find a list of available AMIs in the AWS documentation. + +Run terraform apply to create the EC2 instance. + +## Task 3: Access your website + +- Now that your EC2 instance is up and running, you can access the website you just hosted on it. Follow these steps: + +Happy Terraforming! + +[← Previous Day](../day64/tasks.md) | [Next Day →](../day66/tasks.md) diff --git a/2023/day66/tasks.md b/2023/day66/README.md similarity index 98% rename from 2023/day66/tasks.md rename to 2023/day66/README.md index 795c3a4927..ed00f65bee 100644 --- a/2023/day66/tasks.md +++ b/2023/day66/README.md @@ -1,26 +1,26 @@ -# Day 66 - Terraform Hands-on Project - Build Your Own AWS Infrastructure with Ease using Infrastructure as Code (IaC) Techniques(Interview Questions) ☁️ - -Welcome back to your Terraform journey. - -In the previous tasks, you have learned about the basics of Terraform, its configuration file, and creating an EC2 instance using Terraform. Today, we will explore more about Terraform and create multiple resources. - -## Task: - -- Create a VPC (Virtual Private Cloud) with CIDR block 10.0.0.0/16 -- Create a public subnet with CIDR block 10.0.1.0/24 in the above VPC. -- Create a private subnet with CIDR block 10.0.2.0/24 in the above VPC. -- Create an Internet Gateway (IGW) and attach it to the VPC. -- Create a route table for the public subnet and associate it with the public subnet. This route table should have a route to the Internet Gateway. -- Launch an EC2 instance in the public subnet with the following details: -- AMI: ami-0557a15b87f6559cf -- Instance type: t2.micro -- Security group: Allow SSH access from anywhere -- User data: Use a shell script to install Apache and host a simple website -- Create an Elastic IP and associate it with the EC2 instance. -- Open the website URL in a browser to verify that the website is hosted successfully. - -#### This Terraform hands-on task is designed to test your proficiency in using Terraform for Infrastructure as Code (IaC) on AWS. You will be tasked with creating a VPC, subnets, an internet gateway, and launching an EC2 instance with a web server running on it. This task will showcase your skills in automating infrastructure deployment using Terraform. It's a popular interview question for companies looking for candidates with hands-on experience in Terraform. That's it for today. - -Happy Terraforming:) - -[← Previous Day](../day65/tasks.md) | [Next Day →](../day67/tasks.md) +# Day 66 - Terraform Hands-on Project - Build Your Own AWS Infrastructure with Ease using Infrastructure as Code (IaC) Techniques(Interview Questions) ☁️ + +Welcome back to your Terraform journey. + +In the previous tasks, you have learned about the basics of Terraform, its configuration file, and creating an EC2 instance using Terraform. Today, we will explore more about Terraform and create multiple resources. + +## Task: + +- Create a VPC (Virtual Private Cloud) with CIDR block 10.0.0.0/16 +- Create a public subnet with CIDR block 10.0.1.0/24 in the above VPC. +- Create a private subnet with CIDR block 10.0.2.0/24 in the above VPC. +- Create an Internet Gateway (IGW) and attach it to the VPC. +- Create a route table for the public subnet and associate it with the public subnet. This route table should have a route to the Internet Gateway. +- Launch an EC2 instance in the public subnet with the following details: +- AMI: ami-0557a15b87f6559cf +- Instance type: t2.micro +- Security group: Allow SSH access from anywhere +- User data: Use a shell script to install Apache and host a simple website +- Create an Elastic IP and associate it with the EC2 instance. +- Open the website URL in a browser to verify that the website is hosted successfully. + +#### This Terraform hands-on task is designed to test your proficiency in using Terraform for Infrastructure as Code (IaC) on AWS. You will be tasked with creating a VPC, subnets, an internet gateway, and launching an EC2 instance with a web server running on it. This task will showcase your skills in automating infrastructure deployment using Terraform. It's a popular interview question for companies looking for candidates with hands-on experience in Terraform. That's it for today. + +Happy Terraforming:) + +[← Previous Day](../day65/tasks.md) | [Next Day →](../day67/tasks.md) diff --git a/2023/day67/tasks.md b/2023/day67/README.md similarity index 97% rename from 2023/day67/tasks.md rename to 2023/day67/README.md index d5467b3b75..de629237ec 100644 --- a/2023/day67/tasks.md +++ b/2023/day67/README.md @@ -1,22 +1,22 @@ -# Day 67: AWS S3 Bucket Creation and Management - -## AWS S3 Bucket - -Amazon S3 (Simple Storage Service) is an object storage service that offers industry-leading scalability, data availability, security, and performance. It can be used for a variety of use cases, such as storing and retrieving data, hosting static websites, and more. - -In this task, you will learn how to create and manage S3 buckets in AWS. - -## Task - -- Create an S3 bucket using Terraform. -- Configure the bucket to allow public read access. -- Create an S3 bucket policy that allows read-only access to a specific IAM user or role. -- Enable versioning on the S3 bucket. - -## Resources - -[Terraform S3 bucket resource](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket) - -Good luck and happy learning! - -[← Previous Day](../day66/tasks.md) | [Next Day →](../day68/tasks.md) +# Day 67: AWS S3 Bucket Creation and Management + +## AWS S3 Bucket + +Amazon S3 (Simple Storage Service) is an object storage service that offers industry-leading scalability, data availability, security, and performance. It can be used for a variety of use cases, such as storing and retrieving data, hosting static websites, and more. + +In this task, you will learn how to create and manage S3 buckets in AWS. + +## Task + +- Create an S3 bucket using Terraform. +- Configure the bucket to allow public read access. +- Create an S3 bucket policy that allows read-only access to a specific IAM user or role. +- Enable versioning on the S3 bucket. + +## Resources + +[Terraform S3 bucket resource](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket) + +Good luck and happy learning! + +[← Previous Day](../day66/tasks.md) | [Next Day →](../day68/tasks.md) diff --git a/2023/day68/tasks.md b/2023/day68/README.md similarity index 97% rename from 2023/day68/tasks.md rename to 2023/day68/README.md index 26a335ca7a..713ef11256 100644 --- a/2023/day68/tasks.md +++ b/2023/day68/README.md @@ -1,66 +1,66 @@ -# Day 68 - Scaling with Terraform 🚀 - -Yesterday, we learned how to AWS S3 Bucket with Terraform. Today, we will see how to scale our infrastructure with Terraform. - -## Understanding Scaling - -Scaling is the process of adding or removing resources to match the changing demands of your application. As your application grows, you will need to add more resources to handle the increased load. And as the load decreases, you can remove the extra resources to save costs. - -Terraform makes it easy to scale your infrastructure by providing a declarative way to define your resources. You can define the number of resources you need and Terraform will automatically create or destroy the resources as needed. - -## Task 1: Create an Auto Scaling Group - -Auto Scaling Groups are used to automatically add or remove EC2 instances based on the current demand. Follow these steps to create an Auto Scaling Group: - -- In your main.tf file, add the following code to create an Auto Scaling Group: - -``` -resource "aws_launch_configuration" "web_server_as" { - image_id = "ami-005f9685cb30f234b" - instance_type = "t2.micro" - security_groups = [aws_security_group.web_server.name] - - user_data = <<-EOF - #!/bin/bash - echo "

You're doing really Great

" > index.html - nohup python -m SimpleHTTPServer 80 & - EOF -} - -resource "aws_autoscaling_group" "web_server_asg" { - name = "web-server-asg" - launch_configuration = aws_launch_configuration.web_server_lc.name - min_size = 1 - max_size = 3 - desired_capacity = 2 - health_check_type = "EC2" - load_balancers = [aws_elb.web_server_lb.name] - vpc_zone_identifier = [aws_subnet.public_subnet_1a.id, aws_subnet.public_subnet_1b.id] -} - - -``` - -- Run terraform apply to create the Auto Scaling Group. - -## Task 2: Test Scaling - -- Go to the AWS Management Console and select the Auto Scaling Groups service. - -- Select the Auto Scaling Group you just created and click on the "Edit" button. - -- Increase the "Desired Capacity" to 3 and click on the "Save" button. - -- Wait a few minutes for the new instances to be launched. - -- Go to the EC2 Instances service and verify that the new instances have been launched. - -- Decrease the "Desired Capacity" to 1 and wait a few minutes for the extra instances to be terminated. - -- Go to the EC2 Instances service and verify that the extra instances have been terminated. - -Congratulations🎊🎉 You have successfully scaled your infrastructure with Terraform. - -Happy Learning :) - -[← Previous Day](../day67/tasks.md) | [Next Day →](../day69/tasks.md) +# Day 68 - Scaling with Terraform 🚀 + +Yesterday, we learned how to AWS S3 Bucket with Terraform. Today, we will see how to scale our infrastructure with Terraform. + +## Understanding Scaling + +Scaling is the process of adding or removing resources to match the changing demands of your application. As your application grows, you will need to add more resources to handle the increased load. And as the load decreases, you can remove the extra resources to save costs. + +Terraform makes it easy to scale your infrastructure by providing a declarative way to define your resources. You can define the number of resources you need and Terraform will automatically create or destroy the resources as needed. + +## Task 1: Create an Auto Scaling Group + +Auto Scaling Groups are used to automatically add or remove EC2 instances based on the current demand. Follow these steps to create an Auto Scaling Group: + +- In your main.tf file, add the following code to create an Auto Scaling Group: + +``` +resource "aws_launch_configuration" "web_server_as" { + image_id = "ami-005f9685cb30f234b" + instance_type = "t2.micro" + security_groups = [aws_security_group.web_server.name] + + user_data = <<-EOF + #!/bin/bash + echo "

You're doing really Great

" > index.html + nohup python -m SimpleHTTPServer 80 & + EOF +} + +resource "aws_autoscaling_group" "web_server_asg" { + name = "web-server-asg" + launch_configuration = aws_launch_configuration.web_server_lc.name + min_size = 1 + max_size = 3 + desired_capacity = 2 + health_check_type = "EC2" + load_balancers = [aws_elb.web_server_lb.name] + vpc_zone_identifier = [aws_subnet.public_subnet_1a.id, aws_subnet.public_subnet_1b.id] +} + + +``` + +- Run terraform apply to create the Auto Scaling Group. + +## Task 2: Test Scaling + +- Go to the AWS Management Console and select the Auto Scaling Groups service. + +- Select the Auto Scaling Group you just created and click on the "Edit" button. + +- Increase the "Desired Capacity" to 3 and click on the "Save" button. + +- Wait a few minutes for the new instances to be launched. + +- Go to the EC2 Instances service and verify that the new instances have been launched. + +- Decrease the "Desired Capacity" to 1 and wait a few minutes for the extra instances to be terminated. + +- Go to the EC2 Instances service and verify that the extra instances have been terminated. + +Congratulations🎊🎉 You have successfully scaled your infrastructure with Terraform. + +Happy Learning :) + +[← Previous Day](../day67/tasks.md) | [Next Day →](../day69/tasks.md) diff --git a/2023/day69/tasks.md b/2023/day69/README.md similarity index 100% rename from 2023/day69/tasks.md rename to 2023/day69/README.md diff --git a/2023/day70/tasks.md b/2023/day70/README.md similarity index 96% rename from 2023/day70/tasks.md rename to 2023/day70/README.md index 8d93a46d7b..a208e10eb3 100644 --- a/2023/day70/tasks.md +++ b/2023/day70/README.md @@ -1,80 +1,80 @@ -# Day 70 - Terraform Modules - -- Modules are containers for multiple resources that are used together. A module consists of a collection of .tf and/or .tf.json files kept together in a directory -- A module can call other modules, which lets you include the child module's resources into the configuration in a concise way. -- Modules can also be called multiple times, either within the same configuration or in separate configurations, allowing resource configurations to be packaged and re-used. - -### Below is the format on how to use modules: - -``` -# Creating a AWS EC2 Instance -resource "aws_instance" "server-instance" { - # Define number of instance - instance_count = var.number_of_instances - - # Instance Configuration - ami = var.ami - instance_type = var.instance_type - subnet_id = var.subnet_id - vpc_security_group_ids = var.security_group - - # Instance Tagsid - tags = { - Name = "${var.instance_name}" - } -} -``` - -``` -# Server Module Variables -variable "number_of_instances" { - description = "Number of Instances to Create" - type = number - default = 1 -} - -variable "instance_name" { - description = "Instance Name" -} - -variable "ami" { - description = "AMI ID" - default = "ami-xxxx" -} - -variable "instance_type" { - description = "Instance Type" -} - -variable "subnet_id" { - description = "Subnet ID" -} - -variable "security_group" { - description = "Security Group" - type = list(any) -} -``` - -``` -# Server Module Output -output "server_id" { - description = "Server ID" - value = aws_instance.server-instance.id -} - -``` - -## Task-01 - -Explain the below in your own words and it shouldnt be copied from Internet 😉 - -- Write about different modules Terraform. -- Difference between Root Module and Child Module. -- Is modules and Namespaces are same? Justify your answer for both Yes/No - -You all are doing great, and you have come so far. Well Done Everyone🎉 - -Thode mehnat aur krni hai bas to lge rho tab tak.....Happy learning :) - -[← Previous Day](../day69/tasks.md) | [Next Day →](../day71/tasks.md) +# Day 70 - Terraform Modules + +- Modules are containers for multiple resources that are used together. A module consists of a collection of .tf and/or .tf.json files kept together in a directory +- A module can call other modules, which lets you include the child module's resources into the configuration in a concise way. +- Modules can also be called multiple times, either within the same configuration or in separate configurations, allowing resource configurations to be packaged and re-used. + +### Below is the format on how to use modules: + +``` +# Creating a AWS EC2 Instance +resource "aws_instance" "server-instance" { + # Define number of instance + instance_count = var.number_of_instances + + # Instance Configuration + ami = var.ami + instance_type = var.instance_type + subnet_id = var.subnet_id + vpc_security_group_ids = var.security_group + + # Instance Tagsid + tags = { + Name = "${var.instance_name}" + } +} +``` + +``` +# Server Module Variables +variable "number_of_instances" { + description = "Number of Instances to Create" + type = number + default = 1 +} + +variable "instance_name" { + description = "Instance Name" +} + +variable "ami" { + description = "AMI ID" + default = "ami-xxxx" +} + +variable "instance_type" { + description = "Instance Type" +} + +variable "subnet_id" { + description = "Subnet ID" +} + +variable "security_group" { + description = "Security Group" + type = list(any) +} +``` + +``` +# Server Module Output +output "server_id" { + description = "Server ID" + value = aws_instance.server-instance.id +} + +``` + +## Task-01 + +Explain the below in your own words and it shouldnt be copied from Internet 😉 + +- Write about different modules Terraform. +- Difference between Root Module and Child Module. +- Is modules and Namespaces are same? Justify your answer for both Yes/No + +You all are doing great, and you have come so far. Well Done Everyone🎉 + +Thode mehnat aur krni hai bas to lge rho tab tak.....Happy learning :) + +[← Previous Day](../day69/tasks.md) | [Next Day →](../day71/tasks.md) diff --git a/2023/day71/tasks.md b/2023/day71/README.md similarity index 97% rename from 2023/day71/tasks.md rename to 2023/day71/README.md index 0be7811229..ec966142ed 100644 --- a/2023/day71/tasks.md +++ b/2023/day71/README.md @@ -1,41 +1,41 @@ -# Day 71 - Let's prepare for some interview questions of Terraform 🔥 - -### 1. What is Terraform and how it is different from other IaaC tools? - -### 2. How do you call a main.tf module? - -### 3. What exactly is Sentinel? Can you provide few examples where we can use for Sentinel policies? - -### 4. You have a Terraform configuration file that defines an infrastructure deployment. However, there are multiple instances of the same resource that need to be created. How would you modify the configuration file to achieve this? - -### 5. You want to know from which paths Terraform is loading providers referenced in your Terraform configuration (\*.tf files). You need to enable debug messages to find this out. Which of the following would achieve this? - -A. Set the environment variable TF_LOG=TRACE - -B. Set verbose logging for each provider in your Terraform configuration - -C. Set the environment variable TF_VAR_log=TRACE - -D. Set the environment variable TF_LOG_PATH - -### 6. Below command will destroy everything that is being created in the infrastructure. Tell us how would you save any particular resource while destroying the complete infrastructure. - -``` -terraform destroy -``` - -### 7. Which module is used to store .tfstate file in S3? - -### 8. How do you manage sensitive data in Terraform, such as API keys or passwords? - -### 9. You are working on a Terraform project that needs to provision an S3 bucket, and a user with read and write access to the bucket. What resources would you use to accomplish this, and how would you configure them? - -### 10. Who maintains Terraform providers? - -### 11. How can we export data from one module to another? - -# - -Waiting for your responses😉.....Till then Happy learning :) - -[← Previous Day](../day70/tasks.md) | [Next Day →](../day72/tasks.md) +# Day 71 - Let's prepare for some interview questions of Terraform 🔥 + +### 1. What is Terraform and how it is different from other IaaC tools? + +### 2. How do you call a main.tf module? + +### 3. What exactly is Sentinel? Can you provide few examples where we can use for Sentinel policies? + +### 4. You have a Terraform configuration file that defines an infrastructure deployment. However, there are multiple instances of the same resource that need to be created. How would you modify the configuration file to achieve this? + +### 5. You want to know from which paths Terraform is loading providers referenced in your Terraform configuration (\*.tf files). You need to enable debug messages to find this out. Which of the following would achieve this? + +A. Set the environment variable TF_LOG=TRACE + +B. Set verbose logging for each provider in your Terraform configuration + +C. Set the environment variable TF_VAR_log=TRACE + +D. Set the environment variable TF_LOG_PATH + +### 6. Below command will destroy everything that is being created in the infrastructure. Tell us how would you save any particular resource while destroying the complete infrastructure. + +``` +terraform destroy +``` + +### 7. Which module is used to store .tfstate file in S3? + +### 8. How do you manage sensitive data in Terraform, such as API keys or passwords? + +### 9. You are working on a Terraform project that needs to provision an S3 bucket, and a user with read and write access to the bucket. What resources would you use to accomplish this, and how would you configure them? + +### 10. Who maintains Terraform providers? + +### 11. How can we export data from one module to another? + +# + +Waiting for your responses😉.....Till then Happy learning :) + +[← Previous Day](../day70/tasks.md) | [Next Day →](../day72/tasks.md) diff --git a/2023/day72/tasks.md b/2023/day72/README.md similarity index 97% rename from 2023/day72/tasks.md rename to 2023/day72/README.md index e947278d34..0a71472473 100644 --- a/2023/day72/tasks.md +++ b/2023/day72/README.md @@ -1,16 +1,16 @@ -Day 72 - Grafana🔥 - -Hello Learners , you guys are doing really a good job. You will not be there 24\*7 to monitor your resources. So, Today let’s monitor the resources in a smart way with - Grafana 🎉 - -## Task 1: - -> What is Grafana? What are the features of Grafana? -> Why Grafana? -> What type of monitoring can be done via Grafana? -> What databases work with Grafana? -> What are metrics and visualizations in Grafana? -> What is the difference between Grafana vs Prometheus? - ---- - -[← Previous Day](../day71/tasks.md) | [Next Day →](../day73/tasks.md) +Day 72 - Grafana🔥 + +Hello Learners , you guys are doing really a good job. You will not be there 24\*7 to monitor your resources. So, Today let’s monitor the resources in a smart way with - Grafana 🎉 + +## Task 1: + +> What is Grafana? What are the features of Grafana? +> Why Grafana? +> What type of monitoring can be done via Grafana? +> What databases work with Grafana? +> What are metrics and visualizations in Grafana? +> What is the difference between Grafana vs Prometheus? + +--- + +[← Previous Day](../day71/tasks.md) | [Next Day →](../day73/tasks.md) diff --git a/2023/day73/tasks.md b/2023/day73/README.md similarity index 96% rename from 2023/day73/tasks.md rename to 2023/day73/README.md index 95877a876a..a1278cb1da 100644 --- a/2023/day73/tasks.md +++ b/2023/day73/README.md @@ -1,16 +1,16 @@ -Day 73 - Grafana 🔥 -Hope you are now clear with the basics of grafana, like why we use, where we use, what can we do with this and so on. - -Now, let's do some practical stuff. - ---- - -Task: - -> Setup grafana in your local environment on AWS EC2. - ---- - -Ref: https://www.linkedin.com/posts/chetanrakhra_devops-project-share-activity-7042518379030556672-ZZA-?utm_source=share&utm_medium=member_desktop - -[← Previous Day](../day72/tasks.md) | [Next Day →](../day74/tasks.md) +Day 73 - Grafana 🔥 +Hope you are now clear with the basics of grafana, like why we use, where we use, what can we do with this and so on. + +Now, let's do some practical stuff. + +--- + +Task: + +> Setup grafana in your local environment on AWS EC2. + +--- + +Ref: https://www.linkedin.com/posts/chetanrakhra_devops-project-share-activity-7042518379030556672-ZZA-?utm_source=share&utm_medium=member_desktop + +[← Previous Day](../day72/tasks.md) | [Next Day →](../day74/tasks.md) diff --git a/2023/day74/tasks.md b/2023/day74/README.md similarity index 95% rename from 2023/day74/tasks.md rename to 2023/day74/README.md index 7b50f083bc..aad4f459fd 100644 --- a/2023/day74/tasks.md +++ b/2023/day74/README.md @@ -1,19 +1,19 @@ -# Day 74 - Connecting EC2 with Grafana . - -You guys did amazing job last day setting up Grafana on Local 🔥. - -Now, let's do one step ahead. - ---- - -Task: - -Connect an Linux and one Windows EC2 instance with Grafana and monitor the different components of the server. - ---- - -Don't forget to share this amazing work over LinkedIn and Tag us. - -## Happy Learning :) - -[← Previous Day](../day73/tasks.md) | [Next Day →](../day75/tasks.md) +# Day 74 - Connecting EC2 with Grafana . + +You guys did amazing job last day setting up Grafana on Local 🔥. + +Now, let's do one step ahead. + +--- + +Task: + +Connect an Linux and one Windows EC2 instance with Grafana and monitor the different components of the server. + +--- + +Don't forget to share this amazing work over LinkedIn and Tag us. + +## Happy Learning :) + +[← Previous Day](../day73/tasks.md) | [Next Day →](../day75/tasks.md) diff --git a/2023/day75/tasks.md b/2023/day75/README.md similarity index 97% rename from 2023/day75/tasks.md rename to 2023/day75/README.md index 030d37cbfa..b3cb4f2bb2 100644 --- a/2023/day75/tasks.md +++ b/2023/day75/README.md @@ -1,30 +1,30 @@ -# Day 75 - Sending Docker Log to Grafana - -We have monitored ,😉 that you guys are understanding and doing amazing with monitoring tool. 👌 - -Today, make it little bit more complex but interesting 😍 and let's add one more **Project** 🔥 to your resume. - ---- - -## Task: - -- Install _Docker_ and start docker service on a Linux EC2 through [USER DATA](https://github.com/LondheShubham153/90DaysOfDevOps/blob/0999394e87192863b5c190a90896249c31ce31af/2023/day39/tasks.md) . -- Create 2 Docker containers and run any basic application on those containers (A simple todo app will work). -- Now intregrate the docker containers and share the real time logs with Grafana (Your Instance should be connected to Grafana and Docker plugin should be enabled on grafana). -- Check the logs or docker container name on Grafana UI. - ---- - -You can use [this video](https://youtu.be/y3SGHbixmJw) for your refernce. But it's always better to find your own way of doing. 😊 - -## Bonus : - -- As you have done this amazing task, here is one bonus link.❤️ - -## You can use this [refernce video](https://youtu.be/CCi957AnSfc) to intregrate _Prometheus_ with _Grafana_ and monitor Docker containers. Seems interesting ? - -Don't forget to share this amazing work over LinkedIn and Tag us. - -## Happy Learning :) - -[← Previous Day](../day74/tasks.md) | [Next Day →](../day76/tasks.md) +# Day 75 - Sending Docker Log to Grafana + +We have monitored ,😉 that you guys are understanding and doing amazing with monitoring tool. 👌 + +Today, make it little bit more complex but interesting 😍 and let's add one more **Project** 🔥 to your resume. + +--- + +## Task: + +- Install _Docker_ and start docker service on a Linux EC2 through [USER DATA](https://github.com/LondheShubham153/90DaysOfDevOps/blob/0999394e87192863b5c190a90896249c31ce31af/2023/day39/tasks.md) . +- Create 2 Docker containers and run any basic application on those containers (A simple todo app will work). +- Now intregrate the docker containers and share the real time logs with Grafana (Your Instance should be connected to Grafana and Docker plugin should be enabled on grafana). +- Check the logs or docker container name on Grafana UI. + +--- + +You can use [this video](https://youtu.be/y3SGHbixmJw) for your refernce. But it's always better to find your own way of doing. 😊 + +## Bonus : + +- As you have done this amazing task, here is one bonus link.❤️ + +## You can use this [refernce video](https://youtu.be/CCi957AnSfc) to intregrate _Prometheus_ with _Grafana_ and monitor Docker containers. Seems interesting ? + +Don't forget to share this amazing work over LinkedIn and Tag us. + +## Happy Learning :) + +[← Previous Day](../day74/tasks.md) | [Next Day →](../day76/tasks.md) diff --git a/2023/day76/tasks.md b/2023/day76/README.md similarity index 100% rename from 2023/day76/tasks.md rename to 2023/day76/README.md diff --git a/2023/day77/tasks.md b/2023/day77/README.md similarity index 100% rename from 2023/day77/tasks.md rename to 2023/day77/README.md diff --git a/2023/day78/tasks.md b/2023/day78/README.md similarity index 96% rename from 2023/day78/tasks.md rename to 2023/day78/README.md index 9fb615d12b..4e6cd91b04 100644 --- a/2023/day78/tasks.md +++ b/2023/day78/README.md @@ -1,14 +1,14 @@ -Day - 78 (Grafana Cloud) - ---- - -Task - 01 - -1. Setup alerts for EC2 instance. -2. Setup alerts for AWS Billing Alerts. - ---- - -For Reference: https://www.linkedin.com/posts/chetanrakhra_devops-project-share-activity-7044695663913148416-LfvD?utm_source=share&utm_medium=member_desktop - -[← Previous Day](../day77/tasks.md) | [Next Day →](../day79/tasks.md) +Day - 78 (Grafana Cloud) + +--- + +Task - 01 + +1. Setup alerts for EC2 instance. +2. Setup alerts for AWS Billing Alerts. + +--- + +For Reference: https://www.linkedin.com/posts/chetanrakhra_devops-project-share-activity-7044695663913148416-LfvD?utm_source=share&utm_medium=member_desktop + +[← Previous Day](../day77/tasks.md) | [Next Day →](../day79/tasks.md) diff --git a/2023/day79/tasks.md b/2023/day79/README.md similarity index 97% rename from 2023/day79/tasks.md rename to 2023/day79/README.md index 7df8bd1a78..ffd702b655 100644 --- a/2023/day79/tasks.md +++ b/2023/day79/README.md @@ -1,20 +1,20 @@ -Day 79 - Prometheus 🔥 - -Now, the next step is to learn about the Prometheus. -It's an open-source system for monitoring services and alerts based on a time series data model. Prometheus collects data and metrics from different services and stores them according to a unique identifier—the metric name—and a time stamp. - -Tasks: - ---- - -1. What is the Architecture of Prometheus Monitoring? -2. What are the Features of Prometheus? -3. What are the Components of Prometheus? -4. What database is used by Prometheus? -5. What is the default data retention period in Prometheus? - ---- - -Ref: https://www.devopsschool.com/blog/top-50-prometheus-interview-questions-and-answers/ - -[← Previous Day](../day78/tasks.md) | [Next Day →](../day80/tasks.md) +Day 79 - Prometheus 🔥 + +Now, the next step is to learn about the Prometheus. +It's an open-source system for monitoring services and alerts based on a time series data model. Prometheus collects data and metrics from different services and stores them according to a unique identifier—the metric name—and a time stamp. + +Tasks: + +--- + +1. What is the Architecture of Prometheus Monitoring? +2. What are the Features of Prometheus? +3. What are the Components of Prometheus? +4. What database is used by Prometheus? +5. What is the default data retention period in Prometheus? + +--- + +Ref: https://www.devopsschool.com/blog/top-50-prometheus-interview-questions-and-answers/ + +[← Previous Day](../day78/tasks.md) | [Next Day →](../day80/tasks.md) diff --git a/2023/day80/tasks.md b/2023/day80/README.md similarity index 100% rename from 2023/day80/tasks.md rename to 2023/day80/README.md diff --git a/2023/day81/tasks.md b/2023/day81/README.md similarity index 100% rename from 2023/day81/tasks.md rename to 2023/day81/README.md diff --git a/2023/day82/tasks.md b/2023/day82/README.md similarity index 100% rename from 2023/day82/tasks.md rename to 2023/day82/README.md diff --git a/2023/day83/tasks.md b/2023/day83/README.md similarity index 100% rename from 2023/day83/tasks.md rename to 2023/day83/README.md diff --git a/2023/day84/tasks.md b/2023/day84/README.md similarity index 100% rename from 2023/day84/tasks.md rename to 2023/day84/README.md diff --git a/2023/day85/tasks.md b/2023/day85/README.md similarity index 100% rename from 2023/day85/tasks.md rename to 2023/day85/README.md diff --git a/2023/day86/tasks.md b/2023/day86/README.md similarity index 100% rename from 2023/day86/tasks.md rename to 2023/day86/README.md diff --git a/2023/day87/tasks.md b/2023/day87/README.md similarity index 96% rename from 2023/day87/tasks.md rename to 2023/day87/README.md index ebe61f4f09..04db8dd932 100644 --- a/2023/day87/tasks.md +++ b/2023/day87/README.md @@ -1,24 +1,24 @@ -# Project-8 - -========= - -# Project Description - -The project involves deploying a react application on AWS Elastic BeanStalk using GitHub Actions. -Git Hub actions allows you to perform CICD with GitHub Repository integrated. - -## Task-01 - -- Get source code from [GitHub](https://github.com/sitchatt/AWS_Elastic_BeanStalk_On_EC2.git). - -- Setup AWS Elastic BeanStalk - -- Build the GitHub Actions Workflow - -- Follow this [blog](https://www.linkedin.com/posts/sitabja-chatterjee_effortless-deployment-of-react-app-to-aws-activity-7053579065487687680-wZI8?utm_source=share&utm_medium=member_desktop) to understand it better - -- Run the Project and share it on LinkedIn :) - -Happy Learning :) - -[← Previous Day](../day86/tasks.md) | [Next Day →](../day88/tasks.md) +# Project-8 + +========= + +# Project Description + +The project involves deploying a react application on AWS Elastic BeanStalk using GitHub Actions. +Git Hub actions allows you to perform CICD with GitHub Repository integrated. + +## Task-01 + +- Get source code from [GitHub](https://github.com/sitchatt/AWS_Elastic_BeanStalk_On_EC2.git). + +- Setup AWS Elastic BeanStalk + +- Build the GitHub Actions Workflow + +- Follow this [blog](https://www.linkedin.com/posts/sitabja-chatterjee_effortless-deployment-of-react-app-to-aws-activity-7053579065487687680-wZI8?utm_source=share&utm_medium=member_desktop) to understand it better + +- Run the Project and share it on LinkedIn :) + +Happy Learning :) + +[← Previous Day](../day86/tasks.md) | [Next Day →](../day88/tasks.md) diff --git a/2023/day88/tasks.md b/2023/day88/README.md similarity index 100% rename from 2023/day88/tasks.md rename to 2023/day88/README.md diff --git a/2023/day89/tasks.md b/2023/day89/README.md similarity index 96% rename from 2023/day89/tasks.md rename to 2023/day89/README.md index b05ea14a87..4ae3b711c1 100644 --- a/2023/day89/tasks.md +++ b/2023/day89/README.md @@ -1,19 +1,19 @@ -# Project-10 - -========= - -# Project Description - -The project involves Mounting of AWS S3 Bucket On Amazon EC2 Linux Using S3FS. - -This is a AWS Mini Project that will teach you AWS, S3, EC2, S3FS. - -## Task-01 - -- Create IAM user and set policies for the project resources using this [blog](https://medium.com/@chetxn/project-8-devops-implementation-8300b9ed1f2). -- Utilize and make the best use of aws-cli -- Run the Project and share it on LinkedIn :) - -Happy Learning :) - -[← Previous Day](../day88/tasks.md) | [Next Day →](../day90/tasks.md) +# Project-10 + +========= + +# Project Description + +The project involves Mounting of AWS S3 Bucket On Amazon EC2 Linux Using S3FS. + +This is a AWS Mini Project that will teach you AWS, S3, EC2, S3FS. + +## Task-01 + +- Create IAM user and set policies for the project resources using this [blog](https://medium.com/@chetxn/project-8-devops-implementation-8300b9ed1f2). +- Utilize and make the best use of aws-cli +- Run the Project and share it on LinkedIn :) + +Happy Learning :) + +[← Previous Day](../day88/tasks.md) | [Next Day →](../day90/tasks.md) diff --git a/2023/day90/tasks.md b/2023/day90/README.md similarity index 100% rename from 2023/day90/tasks.md rename to 2023/day90/README.md From d31bf74d9a695b720300b12be9d5b954367bf551 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Sat, 26 Aug 2023 20:46:31 +0530 Subject: [PATCH 168/394] remove submission folder --- submission/day01/tasks.md | 13 - submission/day02/tasks.md | 24 - submission/day03/tasks.md | 126 ------ submission/day04/compare.sh | 11 - submission/day04/first.sh | 11 - submission/day04/if_else.sh | 10 - submission/day04/tasks.md | 10 - submission/day05/backup.txt | 11 - submission/day05/createDir.sh | 15 - submission/day05/createFiles.sh | 15 - submission/day05/tasks.md | 22 - submission/day05/timestamp.sh | 7 - submission/day06/tasks.md | 19 - submission/day07/tasks.md | 66 --- submission/day08/tasks.md | 54 --- submission/day09/tasks.md | 41 -- submission/day10/newfeature | 15 - submission/day10/tasks.md | 54 --- submission/day11/cpfile.txt | 1 - submission/day11/newfeature | 15 - submission/day11/tasks.md | 39 -- submission/day12/tasks.md | 122 ----- submission/day13/tasks.md | 11 - submission/day14/cloudlist.py | 5 - submission/day14/dict.py | 18 - submission/day14/tasks.md | 46 -- submission/day15/data.json | 1 - submission/day15/dict2json.py | 18 - submission/day15/parser.py | 19 - submission/day15/readjson.py | 14 - submission/day15/readyaml.py | 14 - submission/day15/services.json | 23 - submission/day15/services.yaml | 18 - submission/day15/tasks.md | 96 ---- submission/day16/.gitignore | 1 - submission/day16/README.md | 117 ----- submission/day17/README.md | 5 - submission/day18/README.md | 135 ------ submission/day18/flask_app/Dockerfile | 11 - .../flask_app/__pycache__/app.cpython-37.pyc | Bin 796 -> 0 bytes submission/day18/flask_app/app.py | 23 - submission/day18/flask_app/compose.yaml | 11 - submission/day18/flask_app/requirements.txt | 2 - submission/day19/README.md | 0 submission/day19/flask_app/Dockerfile | 11 - .../flask_app/__pycache__/app.cpython-37.pyc | Bin 796 -> 0 bytes submission/day19/flask_app/app.py | 23 - submission/day19/flask_app/compose.yaml | 11 - submission/day19/flask_app/requirements.txt | 2 - submission/day20/README.md | 3 - submission/day21/README.md | 419 ------------------ submission/day22/README.md | 5 - submission/day23/README.md | 0 submission/day24/README.md | 0 submission/day25/README.md | 0 submission/day26/README.md | 0 submission/day27/README.md | 0 submission/day28/README.md | 0 58 files changed, 1763 deletions(-) delete mode 100644 submission/day01/tasks.md delete mode 100644 submission/day02/tasks.md delete mode 100644 submission/day03/tasks.md delete mode 100644 submission/day04/compare.sh delete mode 100644 submission/day04/first.sh delete mode 100644 submission/day04/if_else.sh delete mode 100644 submission/day04/tasks.md delete mode 100644 submission/day05/backup.txt delete mode 100644 submission/day05/createDir.sh delete mode 100644 submission/day05/createFiles.sh delete mode 100644 submission/day05/tasks.md delete mode 100644 submission/day05/timestamp.sh delete mode 100644 submission/day06/tasks.md delete mode 100644 submission/day07/tasks.md delete mode 100644 submission/day08/tasks.md delete mode 100644 submission/day09/tasks.md delete mode 100644 submission/day10/newfeature delete mode 100644 submission/day10/tasks.md delete mode 100644 submission/day11/cpfile.txt delete mode 100644 submission/day11/newfeature delete mode 100644 submission/day11/tasks.md delete mode 100644 submission/day12/tasks.md delete mode 100644 submission/day13/tasks.md delete mode 100644 submission/day14/cloudlist.py delete mode 100644 submission/day14/dict.py delete mode 100644 submission/day14/tasks.md delete mode 100644 submission/day15/data.json delete mode 100644 submission/day15/dict2json.py delete mode 100644 submission/day15/parser.py delete mode 100644 submission/day15/readjson.py delete mode 100644 submission/day15/readyaml.py delete mode 100644 submission/day15/services.json delete mode 100644 submission/day15/services.yaml delete mode 100644 submission/day15/tasks.md delete mode 100644 submission/day16/.gitignore delete mode 100644 submission/day16/README.md delete mode 100644 submission/day17/README.md delete mode 100644 submission/day18/README.md delete mode 100644 submission/day18/flask_app/Dockerfile delete mode 100644 submission/day18/flask_app/__pycache__/app.cpython-37.pyc delete mode 100644 submission/day18/flask_app/app.py delete mode 100644 submission/day18/flask_app/compose.yaml delete mode 100644 submission/day18/flask_app/requirements.txt delete mode 100644 submission/day19/README.md delete mode 100644 submission/day19/flask_app/Dockerfile delete mode 100644 submission/day19/flask_app/__pycache__/app.cpython-37.pyc delete mode 100644 submission/day19/flask_app/app.py delete mode 100644 submission/day19/flask_app/compose.yaml delete mode 100644 submission/day19/flask_app/requirements.txt delete mode 100644 submission/day20/README.md delete mode 100644 submission/day21/README.md delete mode 100644 submission/day22/README.md delete mode 100644 submission/day23/README.md delete mode 100644 submission/day24/README.md delete mode 100644 submission/day25/README.md delete mode 100644 submission/day26/README.md delete mode 100644 submission/day27/README.md delete mode 100644 submission/day28/README.md diff --git a/submission/day01/tasks.md b/submission/day01/tasks.md deleted file mode 100644 index 64575ae41e..0000000000 --- a/submission/day01/tasks.md +++ /dev/null @@ -1,13 +0,0 @@ -## Introduction - Day 1 - -This is the day you have to Take this challenge and start your #90DaysOfDevOps with the #TrainWithShubham Community - -- Fork this Repo. Done -- Start with a DevOps Roadmap[https://youtu.be/iOE9NTAG35g] - Done -- Write a LinkedIn post or a small article about your understanding of DevOps - - What is DevOps - - What is Automation, Scaling, Infrastructure - - Why DevOps is Important, etc - -Submitted blog: [Introduction to DevOps](https://paragpallavsingh.hashnode.dev/introduction-to-devops-90daysofdevops) - \ No newline at end of file diff --git a/submission/day02/tasks.md b/submission/day02/tasks.md deleted file mode 100644 index 69d4f46ce4..0000000000 --- a/submission/day02/tasks.md +++ /dev/null @@ -1,24 +0,0 @@ -Day 2 Task: Basics linux command - -Task: What is the linux command to -1. Check your present working directory. - - pwd -image - -2. List all the files or directories including hidden files. - - ls -la -image - -3. Create a nested directory A/B/C/D/E - - mkdir -p A/B/C/D/ - - mkdir -p folder/B/D -image - -Here is a detailed [blog over Introduction to Linux](https://paragpallavsingh.com/2023/07/16/linux-fundamentals/) -Note: [Check this file for reference](basic_linux_commands.md) - -Check the basic_linux_commands.md file on the same directory day2 - - -Just ignore this image -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/395419a7-b11c-4fbf-9a5e-edc682149a86) diff --git a/submission/day03/tasks.md b/submission/day03/tasks.md deleted file mode 100644 index c2d4976c65..0000000000 --- a/submission/day03/tasks.md +++ /dev/null @@ -1,126 +0,0 @@ -Day 3 Task: Basic Linux Commands - -Task: What is the linux command to - -Prerequisite commands to replicate below - -# make 5 folders - -``` -mkdir folder-{1..5} -``` - -#go to folder 1 - -``` -cd folder-1 -``` - -#make fileA.txt to fileM.txt - -``` -touch file{A..M}.txt -``` - -#start editing fileA - -``` -vi fileA.txt -``` - -#make a student list of Bilogy marks - -#copy paste below data -``` -James Walker    Biology 05/06/2016      31 -Velma Clemons   Biology 05/06/2016      43 -Kibo Underwood  Biology 05/06/2016      81 -Louis Mcgee     Biology 05/06/2016      11 -Phyllis Paul    Biology 05/06/2016      18 -Zenaida Decker  Biology 05/06/2016      55 -Gillian Tillman Biology 05/06/2016      38 -Constance Boone Biology 05/06/2016      16 -``` -#rename it to students.txt - -``` -mv fileA.txt students.txt -``` - -### Now begin below commands - -### 1. To view what's written in a file. - -``` -cat students.txt -``` - -image - -### 2. To change the access permissions of files. -``` -chmod 700 students.txt -ls -l students.txt -chmod 707 students.txt -ls -l students.txt -chmod 070 students.txt -ls -l students.txt -ls -l students.txt fileM.txt -ls -cat students.txt -``` -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/9d5d4ef7-846b-4f6d-8d8a-9555fbbaf1d9) - -## 3. To check which commands you have run till now -``` -history -``` - -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/d37caef4-2e65-4ea2-9e60-d2b09d2c9f95) - -### 4. To remove a directory/ Folder. -``` -rm -r file{F..I}.txt -cd .. -rm -r folder-{3..5} -``` -image - -5. To create a fruits.txt file and to view the content. -6. Add content in devops.txt (One in each line) - Apple, Mango, Banana, Cherry, Kiwi, Orange, Guava. -7. To Show only top three fruits from the file. -8. To Show only bottom three fruits from the file. -``` -vi fruits.txt -Apple -Mango -Banana -Cherry -Kiwi -Orange -Guava -cat fruits.txt -head fruits.txt -head -3 fruits.txt -tail -3 fruits.txt -``` -image - -9. To create another file Colors.txt and to view the content. -10. Add content in Colors.txt (One in each line) - Red, Pink, White, Black, Blue, Orange, Purple, Grey. -11. To find the difference between fruits.txt and Colors.txt file. -``` -vi colors.txt -Red -Pink -White -Black -Blue -Orange -Purple -Green -Grey -diff colors.txt fruits.txt -diff fruits.txt colors.txt -``` -image diff --git a/submission/day04/compare.sh b/submission/day04/compare.sh deleted file mode 100644 index a7fbb06d1f..0000000000 --- a/submission/day04/compare.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -printf "Script to compare two numbers\nEnter number 1: " -read num1 -printf "Enter number 2: " -read num2 -if [ "$num1" -gt "$num2" ] -then - echo "$num1 is greater" -else - echo "$num2 is greater" -fi \ No newline at end of file diff --git a/submission/day04/first.sh b/submission/day04/first.sh deleted file mode 100644 index 5e399d251f..0000000000 --- a/submission/day04/first.sh +++ /dev/null @@ -1,11 +0,0 @@ -printf "Let's print line as first Linux user\nto become a succesful devpos engineer\n\n" -sleep 1 -printf "Using variable to store\nmy_name=PARAG PALLAV SINGH\n" -sleep 1 -my_name="PARAG PALLAV SINGH" -sleep 1 -printf "Hello learners, I am ${my_name}\n\n" -sleep 1 -printf "Taking user input\nEnter your name:" -read your_name -printf "Hi ${your_name}\n" \ No newline at end of file diff --git a/submission/day04/if_else.sh b/submission/day04/if_else.sh deleted file mode 100644 index 87d7d2ff2a..0000000000 --- a/submission/day04/if_else.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -printf "\nLearn if else in Linux\nTake user input for a number and find if it is 3\nEnter a number:- " -read number -if [ "${number}" = 3 ] -then - echo "Number is 3\n" -else - echo "Instead Number is ${number}" -fi \ No newline at end of file diff --git a/submission/day04/tasks.md b/submission/day04/tasks.md deleted file mode 100644 index a3a6e870e2..0000000000 --- a/submission/day04/tasks.md +++ /dev/null @@ -1,10 +0,0 @@ -This contains the output files of below three scripts - -## output compare.sh -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/73495135-74e7-4a72-9ac2-c1e925704e86) - -## output if_else.sh -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/b50ee3e0-a02a-444c-884e-60379c411b9a) - -## output first.sh -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/7a6f3b47-eb75-4a39-884a-7aaca38849c6) diff --git a/submission/day05/backup.txt b/submission/day05/backup.txt deleted file mode 100644 index b03fa07f1d..0000000000 --- a/submission/day05/backup.txt +++ /dev/null @@ -1,11 +0,0 @@ -[2023-07-20 04:34:01] Learned crontab -[2023-07-20 04:36:01] Learned crontab -[2023-07-20 04:38:01] Learned crontab -[2023-07-20 04:40:01] Learned crontab -[2023-07-20 04:42:01] Learned crontab -[2023-07-20 04:44:01] Learned crontab -[2023-07-20 04:46:01] Learned crontab -[2023-07-20 04:48:01] Learned crontab -[2023-07-20 04:50:01] Learned crontab -[2023-07-20 04:52:01] Learned crontab -[2023-07-20 04:54:01] Learned crontab \ No newline at end of file diff --git a/submission/day05/createDir.sh b/submission/day05/createDir.sh deleted file mode 100644 index e1d59f7a2b..0000000000 --- a/submission/day05/createDir.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -printf "Create multiple files in a folder\nEnter starting file name:" -read name -printf "Enter starting count:" -read start -printf "Enter ending count:" -read end -for ((i=$start; i<=$end; i++)) -do - touch $name-$i -done -#show files in folder -printf "\nLong List of newly made files\n" -ls -l | grep $name \ No newline at end of file diff --git a/submission/day05/createFiles.sh b/submission/day05/createFiles.sh deleted file mode 100644 index 7f15d3d809..0000000000 --- a/submission/day05/createFiles.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -printf "Create multiple Directories\nEnter starting file name:" -read name -printf "Enter starting count:" -read start -printf "Enter ending count:" -read end -for ((i=$start; i<=$end; i++)) -do - touch $name-$i -done -#show files in folder -printf "\nLong List of newly made directories\n" -ls -l | grep $name \ No newline at end of file diff --git a/submission/day05/tasks.md b/submission/day05/tasks.md deleted file mode 100644 index 27de3df254..0000000000 --- a/submission/day05/tasks.md +++ /dev/null @@ -1,22 +0,0 @@ -image - -# Task 1 Create multiple files script -image - -# Task 2 Create multiple directories script -image - -# Task 3 Create backup script -image - -# Task 4 Make cronjob -image -
-image - -# Task 5 User management -image -
-image - - diff --git a/submission/day05/timestamp.sh b/submission/day05/timestamp.sh deleted file mode 100644 index 7435cf6eb5..0000000000 --- a/submission/day05/timestamp.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -# Define backup file -backup_file="/home/ubuntu/backup.txt" -# Get current timestamp -timestamp=$(date +"%Y-%m-%d %H:%M:%S") -# Execute the command and append output with timestamp to the backup file -echo "[$timestamp] $(echo "Learned crontab")" >> "$backup_file" \ No newline at end of file diff --git a/submission/day06/tasks.md b/submission/day06/tasks.md deleted file mode 100644 index f2c6b5b8cf..0000000000 --- a/submission/day06/tasks.md +++ /dev/null @@ -1,19 +0,0 @@ -touch test test1 test2 -# Task 1: Change the Permission of file/directories -``` -ls -lrt test -chmod g+s test -``` -# Task 2: Change the ownership of a file/directory -``` -ls -lrt test -sudo chown paragp test -``` -# Task 3: Change the group permission of a file/directory -``` -ls -lrt test -sudo chgrp dev test -``` -# Access Control Lists (ACL) commands getfacl and setfacl -sudo apt install acl -getfact ParagFolder-9 \ No newline at end of file diff --git a/submission/day07/tasks.md b/submission/day07/tasks.md deleted file mode 100644 index 93b6145dda..0000000000 --- a/submission/day07/tasks.md +++ /dev/null @@ -1,66 +0,0 @@ -# Understanding package manager and systemctl - -# Task 1 update the package index files on the system -``` -sudo apt-get update -``` -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/26505115-8bab-49df-9010-0eb750c13e5a) - -# Task 2 Install Docker -``` -sudo apt install docker.io -y -sudo systemctl start docker -sudo systemctl status docker -sudo systemctl stop docker.socket -sudo systemctl status docker -``` -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/ed4bd9ef-2315-4c26-a716-342bdc7187fa) - -Once it is started use systemd systemctl commands to check docker status - -Docker Running - -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/a8c0d0ca-f516-482a-9952-af24c867daf9) - -Docker socket stopped -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/0b67f215-98f2-4e94-bc18-7a410797360c) - - -check this link for differences between - -sudo systemctl stop docker and sudo systemctl stop docker.socket -https://stackoverflow.com/questions/47489631/warning-stopping-docker-service-but-it-can-still-be-activated-by-docker-socke - - -# Task 3 Install Jenkins -Install Java JDK in order to get jenkins working -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/50f44541-874c-4986-b2f7-a57fbeb78bfd) - -``` -java -version -sudo apt install openjdk-17-jre-headless -sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo -curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null -echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null -sudo apt-get update -sudo apt-get install jenkins -y -sudo systemctl status jenkins -``` -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/ce9447e9-5a1a-412f-ab8e-6f3b92430eb0) - -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/9420cee8-166c-4a4f-90ec-806a067002a2) - -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/779d029b-4047-4af0-bb90-b8b331fbd9e4) - -# Task 4 Install Apache -``` -sudo apt install apache2 -sudo systemctl status apache2 -``` -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/892e02b3-55b8-427b-a1cb-d006686e8903) - -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/9d97d743-4c74-472f-bdfe-de4781ab5901) - -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/fda362ba-4515-4b18-868a-23dbefc53d77) - - diff --git a/submission/day08/tasks.md b/submission/day08/tasks.md deleted file mode 100644 index 5ec3a98faa..0000000000 --- a/submission/day08/tasks.md +++ /dev/null @@ -1,54 +0,0 @@ -# Day 8 Basic Git & GitHub - -# Task Install Git on your computer - -https://git-scm.com/book/en/v2/Getting-Started-Installing-Git - -windows - -Just go to https://git-scm.com/download/win and the download will start automatically. - -Linux -``` -sudo apt install git-all -``` -# Task 2 Create a free account on GitHub - -You can sign up at https://github.com/ - -Also, update basic profile -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/af8fa834-b1d2-4d8b-88f7-7dd2856a8b2b) - - -# Task 3 Create a new repository on GitHub and clone it to your local machine -I have created https://github.com/paragpallavsingh/git_test -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/3d1a8ccf-eb73-47cd-87ed-bf9cfaf61313) - - -I am going to clone the repository in the below path on my local system. You can change folder as per your choice -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/8e9d4979-168a-48c3-b956-21c2a5dbdff7) - -Windows path: F:\Workspace\github -Git bash path: /f/Workspace/GitHub - -We'll open the installed git bash and go to the above path. Make sure you use the path as described above. -``` -cd /f/Workspace/github -git clone https://github.com/paragpallavsingh/git_test.git -cd git_test/ -``` -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/686aebaf-7c9b-4566-bef6-076d5e7d533f) - -# Task 4 Make some changes to a file in the repository and commit them to the repository using Git -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/fe4e4800-248a-4d18-9808-0da784d59de1) - -# Task 5 Push the changes back to the repository on GitHub -``` -ls -vi fileA.txt -git status -git add . -git commit -m "update fileA and push to remote" -git push origin master -``` -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/5bc468f5-98fc-4118-ad55-887e4e3e8dbf) diff --git a/submission/day09/tasks.md b/submission/day09/tasks.md deleted file mode 100644 index 0d7055d9e4..0000000000 --- a/submission/day09/tasks.md +++ /dev/null @@ -1,41 +0,0 @@ -# Deep Dive in Git & GitHub - -## task-1: Set your user name and email address, which will be associated with your commit -``` -git config --global user.name "Parag Pallav Singh" -git config --global user.email "thxxxxparag@gmail.com" -``` -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/c4826de5-0060-41c1-b5a1-c10b2540070b) - -## task-2: -* Create a repository named "90DaysOfDevOps" on GitHub - -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/360d6d91-20a0-4e5b-9432-ca225a2da7e2) - -* Connect your local repository to the repository on GitHub. -``` -cd /f/Workspace/github -git clone https://github.com/paragpallavsingh/90DaysOfDevOps.git -``` -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/792d3314-0713-48f6-82d6-df29c10ab246) - - -* Create a new file 90DaysOfDevOps\submission\tasks.md & add some content to it. -``` -cd 90DaysOfDevOps\submission - -#in linux terminal -vi tasks.md -#in windows - make a new file tasks.md in respective folder and update -``` - -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/ac7392ec-d8ec-4902-93b8-a10ceb2f3c80) - -* Push your local commits to the repository on GitHub -``` -git status -git add . -git commit -m "update tasks.md" -git push origin master -``` -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/f0a12d8b-968f-448f-aca8-ec22c4ff6fce) diff --git a/submission/day10/newfeature b/submission/day10/newfeature deleted file mode 100644 index 9593765b7f..0000000000 --- a/submission/day10/newfeature +++ /dev/null @@ -1,15 +0,0 @@ -This is a new feature A line - -This is feature A line 2 - -This is feature A line 3 - -This is feature B line 1 - -This is feature B line 2 - -This is feature C line 1 - -This is feature C line 2 - -This is feature C line 3 diff --git a/submission/day10/tasks.md b/submission/day10/tasks.md deleted file mode 100644 index 0260ae74cb..0000000000 --- a/submission/day10/tasks.md +++ /dev/null @@ -1,54 +0,0 @@ -# Day 10 Task: Advance Git & GitHub - -# Task 1: Git Branch -``` -git checkout master -git checkout -b day10 -``` -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/5fc9ba30-4159-41fb-96c8-4f17f1aebf71) - - -# Task2: Update some files and push the branch to the remote -``` -git status -git add . -git commit -m "Add feature 1" -git push origin day10 -``` -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/ddca6e76-2dd7-44f2-9541-7c26abc06402) - -# Task 3: Git Revert - -Assume you are adding a new feature B. and updating small tasks in small commits. -You accidentally modified the content of feature A. Now you need to revert that change -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/848ee298-3dd8-4f01-b364-5bf5fcb87c36) - -``` -# Try to revert the wrong code using the commit id -git log -n 5 -git revert 0254bc3099d39a9c6b2d2d0c0427c3b7a282d3eb -#if there's a conflict, remove that using mergetool=> p4merge -``` -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/cc6cf745-1376-4dae-8c96-7d4e0d3df941) -# Task 4: Git Merge -Now you are done with newfeature and you try to merge to main branch -``` -git checkout master #target branch -git merge day10 #branch to be merged -``` -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/23f471fa-efe6-40f5-a1ff-9afb7aecbdad) - -# Task 4: Git rebase -Rebasing is the process of moving or combining a sequence of commits to a new base commit -``` -git rebase day10 -``` -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/27974a81-39e5-42aa-83e3-d18bed621244) - -After rebase, the out looks like -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/c82da8b0-e591-458f-92e0-78b75c515696) - -## Addon -When you are done with merging your changes to main/master, you can safely remove branches. -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/fa3fdc02-7b52-4bb8-9230-b9a5b09412ec) - diff --git a/submission/day11/cpfile.txt b/submission/day11/cpfile.txt deleted file mode 100644 index 99850befde..0000000000 --- a/submission/day11/cpfile.txt +++ /dev/null @@ -1 +0,0 @@ -this is a new file added in branch \ No newline at end of file diff --git a/submission/day11/newfeature b/submission/day11/newfeature deleted file mode 100644 index 9593765b7f..0000000000 --- a/submission/day11/newfeature +++ /dev/null @@ -1,15 +0,0 @@ -This is a new feature A line - -This is feature A line 2 - -This is feature A line 3 - -This is feature B line 1 - -This is feature B line 2 - -This is feature C line 1 - -This is feature C line 2 - -This is feature C line 3 diff --git a/submission/day11/tasks.md b/submission/day11/tasks.md deleted file mode 100644 index ddcde9cee8..0000000000 --- a/submission/day11/tasks.md +++ /dev/null @@ -1,39 +0,0 @@ -# Day 11 Task: Advance Git & GitHub Part 2 - -## Task 1: Cherry-pick -Git cherry-pick is a command that allows you to select specific commits from one branch and apply them to another. -``` -git checkout master -git checkout -b cherrypick/day11 -#add a cpfile.txt. We will cherry-pick the changes in the following commit to the master branch -git status -git add . -git commit -m "add cpfile" -git log -n 3 #to find the commit id that needs to be cherry-picked -``` -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/056f1466-05a9-46f3-8583-1a76ada3f710) - -``` -#actual cherry-picking a commit -git checkout master -git cherry-pick 140275676a03cb9e53416f39d38c0e8ff68d50dc -``` -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/fc8da22c-cd96-4e8b-8e94-9939788ff962) - -## Task 2: Git Stash -``` -git status -git add . -git stash - -``` -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/cf90ae49-df17-4fa8-b706-09670c92481d) - -``` -git stash pop -git add . -git push origin day11 -``` -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/7d7234a0-4fb1-4a6b-877d-8caaedb5056a) - - diff --git a/submission/day12/tasks.md b/submission/day12/tasks.md deleted file mode 100644 index f4d952274f..0000000000 --- a/submission/day12/tasks.md +++ /dev/null @@ -1,122 +0,0 @@ -# Sumup of Linux & Git-GitHub handson - -## We did covered a lot of commands - -### 1. Basic Commands - -| **Command** | **Description** | -| ----------- | --------------- | -|ls|Lists all files and directories in the present working directory| -| ls -R | Lists files in sub-directories as well | -| ls -a | Lists hidden files as well | -| ls -al | Lists files and directories with detailed information like permissions,size, owner, etc. | -| cd or cd ~ | Navigate to HOME directory | -| cd .. | Move one level up | -| cd | To change to a particular directory | -| cd / | Move to the root directory | -| cat > filename | Creates a new file | -| cat filename | Displays the file content | -| cat file1 file2 > file3 | Joins two files (file1, file2) and stores the output in a new file (file3) | -| mv file "new file path" | Moves the files to the new location | -| mv filename new_file_name | Renames the file to a new filename | -| sudo | Allows regular users to run programs with the security privileges of the superuser or root | -| rm filename | Deletes a file | -| man | Gives help information on a command | -| history | Gives a list of all past commands typed in the current terminal session | -| clear | Clears the terminal | -| mkdir directoryname | Creates a new directory in the present working directory or a at the specified path | -| rmdir | Deletes a directory | -| mv | Renames a directory | -| pr -x | Divides the file into x columns | -| pr -h | Assigns a header to the file | -| pr -n | Denotes the file with Line Numbers | -| lp -nc , lpr c | Prints “c” copies of the File | -| lp-d lp-P | Specifies name of the printer | -| apt-get | Command used to install and update packages | -| mail -s 'subject' -c 'cc-address' -b 'bcc-address' 'to-address' | Command to send email | -| mail -s "Subject" to-address < Filename | Command to send email with attachment | - -### 2. File Permission commands - -| **Command** | **Description** | -|---------------------------|----------------------------------------------------------| -| ls -l | to show file type and access permission | -| r | read permission | -| w | write permission | -| x | execute permission | -| -= | no permission | -| Chown user | For changing the ownership of a file/directory | -| Chown user:group filename | change the user as well as group for a file or directory | - -### 3. Environment Variables command - -| **Command** | **Description** | -|-------------------------------|-----------------------------------------| -| echo $VARIABLE | To display value of a variable | -| env | Displays all environment variables | -| VARIABLE_NAME= variable_value | Create a new variable | -| Unset | Remove a variable | -| export Variable=value | To set value of an environment variable | - -### 4. User management commands of linux - -| **Command** | **Description** | -|---------------------------------------|----------------------------------| -| sudo adduser username | To add a new user | -| sudo passwd -l 'username' | To change the password of a user | -| sudo userdel -r 'username' | To remove a newly created user | -| sudo usermod -a -G GROUPNAME USERNAME | To add a user to a group | -| sudo deluser USER GROUPNAME | To remove a user from a group | - -### 5. Networking command - -| **Command** | **Description** | -|-------------------------------------|-------------------------------------------------------------| -| SSH username@ip-address or hostname | login into a remote Linux machine using SSH | -| Ping hostname="" or ="" | To ping and Analyzing network and host connections | -| dir | Display files in the current directory of a remote computer | -| cd "dirname" | change directory to “dirname” on a remote computer | -| put file | upload ‘file’ from local to remote computer | -| get file | Download ‘file’ from remote to local computer | -| quit | Logout | - -### 6. Process command - -| **Command** | **Description** | -|-------------|-------------------------------------------------| -| bg | To send a process to the background | -| fg | To run a stopped process in the foreground | -| top | Details on all Active Processes | -| ps | Give the status of processes running for a user | -| ps PID | Gives the status of a particular process | -| pidof | Gives the Process ID (PID) of a process | -| kill PID | Kills a process | -| nice | Starts a process with a given priority | -| renice | Changes priority of an already running process | -| df | Gives free hard disk space on your system | -| free | Gives free RAM on your system | - -### 7. VI Editing Commands - -| **Command** | **Description** | -|-------------|-------------------------------------------------------------------------------------------------| -| i | Insert at cursor (goes into insert mode) | -| a | Write after cursor (goes into insert mode) | -| A | Write at the end of line (goes into insert mode) | -| ESC | Terminate insert mode | -| u | Undo last change | -| U | Undo all changes to the entire line | -| o | Open a new line (goes into insert mode) | -| dd | Delete line | -| 3dd | Delete 3 lines | -| D | Delete contents of line after the cursor | -| C | Delete contents of a line after the cursor and insert new text. Press ESC key to end insertion. | -| dw | Delete word | -| 4dw | Delete 4 words | -| cw | Change word | -| x | Delete character at the cursor | -| r | Replace character | -| R | Overwrite characters from cursor onward | -| s | Substitute one character under cursor continue to insert | -| S | Substitute entire line and begin to insert at the beginning of the line | -| ~ | Change case of individual character | diff --git a/submission/day13/tasks.md b/submission/day13/tasks.md deleted file mode 100644 index f56c94d0fa..0000000000 --- a/submission/day13/tasks.md +++ /dev/null @@ -1,11 +0,0 @@ -# Basics of Python - -## Install Python - -For windows https://www.python.org/downloads/ - -For linux distro apt-get install python 3.9 -``` -python --version -``` -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/91e953b3-28c3-4e54-8864-ae43e23e49f0) diff --git a/submission/day14/cloudlist.py b/submission/day14/cloudlist.py deleted file mode 100644 index 1bc728cdd3..0000000000 --- a/submission/day14/cloudlist.py +++ /dev/null @@ -1,5 +0,0 @@ -cloud_providers = ["AWS", "GCP", "Azure"] -print('before: ',cloud_providers) -cloud_providers.append("Digital Ocean") -cloud_providers.sort() -print('after: ',cloud_providers) diff --git a/submission/day14/dict.py b/submission/day14/dict.py deleted file mode 100644 index d12791b106..0000000000 --- a/submission/day14/dict.py +++ /dev/null @@ -1,18 +0,0 @@ -fav_tools = { - 1:"Linux", - 2:"Git", - 3:"Docker", - 4:"Kubernetes", - 5:"Terraform", - 6:"Ansible", - 7:"Chef" -} - -try: - user_input = int(input("Enter the key for tool: ")) - if user_input in fav_tools: - print("Your favorite tool :", fav_tools[user_input]) - else: - print("Not in dict") -except ValueError: - print("Invalid input. Please enter a valid integer key.") diff --git a/submission/day14/tasks.md b/submission/day14/tasks.md deleted file mode 100644 index c31b98b7ad..0000000000 --- a/submission/day14/tasks.md +++ /dev/null @@ -1,46 +0,0 @@ -# Day 14 python tasks - -**1. Create below Dictionary and use Dictionary methods to print your favourite tool just by using the keys of the Dictionary.** - -add-on: if the key is not in the list, it will show "Not in dict" - -image - -Refer: [dict.py](https://github.com/paragpallavsingh/90DaysOfDevOps/blob/master/submission/day14/dict.py) - -``` -fav_tools = { - 1:"Linux", - 2:"Git", - 3:"Docker", - 4:"Kubernetes", - 5:"Terraform", - 6:"Ansible", - 7:"Chef" -} - -try: - user_input = int(input("Enter the key for tool: ")) - if user_input in fav_tools: - print("Your favorite tool :", fav_tools[user_input]) - else: - print("Not in dict") -except ValueError: - print("Invalid input. Please enter a valid integer key.") -```` - -**2. Create a List of cloud service providers. Write a program to add Digital Ocean to the list of cloud_providers and sort the list in alphabetical order.** - -add-on: print an original list named before, and print updated list, named after - -image - -Refer: [cloudlist.py](https://github.com/paragpallavsingh/90DaysOfDevOps/blob/master/submission/day14/cloudlist.py) - -``` -cloud_providers = ["AWS", "GCP", "Azure"] -print('before: ',cloud_providers) -cloud_providers.append("Digital Ocean") -cloud_providers.sort() -print('after: ',cloud_providers) -``` diff --git a/submission/day15/data.json b/submission/day15/data.json deleted file mode 100644 index fe45870999..0000000000 --- a/submission/day15/data.json +++ /dev/null @@ -1 +0,0 @@ -{"name": "Parag Pallav Singh", "age": 25, "course": "90 Days of Devops", "Task Day": 15} \ No newline at end of file diff --git a/submission/day15/dict2json.py b/submission/day15/dict2json.py deleted file mode 100644 index c304af85bc..0000000000 --- a/submission/day15/dict2json.py +++ /dev/null @@ -1,18 +0,0 @@ -import json - -# Create a dictionary -data = { - "name": "Parag Pallav Singh", - "age": 25, - "course": "90 Days of Devops", - "Task Day": 15, -} - -# Specify the file path where you want to save the JSON data -file_path = "data.json" - -# Write the dictionary to a JSON file -with open(file_path, "w") as json_file: - json.dump(data, json_file) - -print("Data has been written to 'data.json'.") diff --git a/submission/day15/parser.py b/submission/day15/parser.py deleted file mode 100644 index 93d41bbb4a..0000000000 --- a/submission/day15/parser.py +++ /dev/null @@ -1,19 +0,0 @@ -import json -import yaml - -json_file = "services.json" -yaml_file = "services.yaml" - -with open(json_file, 'r', encoding='utf-8') as f: - json_data = json.loads(f.read()) - -print("JSON:\n",json_data) - -with open(yaml_file, "r") as stream: - try: - yaml_data = yaml.safe_load(stream) - except yaml.YAMLError as exc: - print(exc) - - -print("YAML:\n",yaml_data) \ No newline at end of file diff --git a/submission/day15/readjson.py b/submission/day15/readjson.py deleted file mode 100644 index 6be5b0675f..0000000000 --- a/submission/day15/readjson.py +++ /dev/null @@ -1,14 +0,0 @@ -import json - -# Read the contents of the "services.json" file -with open("services.json", "r") as json_file: - data = json.load(json_file) - -# Get the "services" dictionary from the loaded JSON data -services = data["services"] - -# Print the service names of each cloud service provider -for provider, service_data in services.items(): - if provider != "debug": - service_name = service_data["name"] - print(f"Service name for {provider}: {service_name}") \ No newline at end of file diff --git a/submission/day15/readyaml.py b/submission/day15/readyaml.py deleted file mode 100644 index 90997d4e9a..0000000000 --- a/submission/day15/readyaml.py +++ /dev/null @@ -1,14 +0,0 @@ -import yaml - -# Read the contents of the "services.yaml" file -with open("services.yaml", "r") as yaml_file: - data = yaml.safe_load(yaml_file) - -# Get the "services" dictionary from the loaded YAML data -services = data["services"] - -# Print the service names of each cloud service provider -for provider, service_data in services.items(): - if provider != "debug": - service_name = service_data["name"] - print(f"Service name for {provider}: {service_name}") \ No newline at end of file diff --git a/submission/day15/services.json b/submission/day15/services.json deleted file mode 100644 index 1bc8a04f89..0000000000 --- a/submission/day15/services.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "services": { - "debug": "on", - "aws": { - "name": "EC2", - "type": "pay per hour", - "instances": 500, - "count": 500 - }, - "azure": { - "name": "VM", - "type": "pay per hour", - "instances": 500, - "count": 500 - }, - "gcp": { - "name": "Compute Engine", - "type": "pay per hour", - "instances": 500, - "count": 500 - } - } - } \ No newline at end of file diff --git a/submission/day15/services.yaml b/submission/day15/services.yaml deleted file mode 100644 index 0b367bc23e..0000000000 --- a/submission/day15/services.yaml +++ /dev/null @@ -1,18 +0,0 @@ ---- -services: - debug: 'on' - aws: - name: EC2 - type: pay per hour - instances: 500 - count: 500 - azure: - name: VM - type: pay per hour - instances: 500 - count: 500 - gcp: - name: Compute Engine - type: pay per hour - instances: 500 - count: 500 diff --git a/submission/day15/tasks.md b/submission/day15/tasks.md deleted file mode 100644 index ec09161272..0000000000 --- a/submission/day15/tasks.md +++ /dev/null @@ -1,96 +0,0 @@ -# Day 15 Python Tasks: Python Libraries - -**1. Create a Dictionary in Python and write it to a json File.** - -On running the code, it will create a new file data.json on the given file path ie. current directory in our case - -image - -``` -import json - -# Create a dictionary -data = { - "name": "Parag Pallav Singh", - "age": 25, - "course": "90 Days of Devops", - "Task Day": 15, -} - -# Specify the file path where you want to save the JSON data -file_path = "data.json" - -# Write the dictionary to a JSON file -with open(file_path, "w") as json_file: - json.dump(data, json_file) - -print("Data has been written to 'data.json'.") -``` -Refer script: [dict2json.py](https://github.com/paragpallavsingh/90DaysOfDevOps/blob/master/submission/day15/dict2json.py) - -file generated: [data.json](https://github.com/paragpallavsingh/90DaysOfDevOps/blob/master/submission/day15/data.json) - -**2. Read a json file services.json kept in this folder and print the service names of every cloud service provider.** - -image - -``` -import json - -# Read the contents of the "services.json" file -with open("services.json", "r") as json_file: - data = json.load(json_file) - -# Get the "services" dictionary from the loaded JSON data -services = data["services"] - -# Print the service names of each cloud service provider -for provider, service_data in services.items(): - if provider != "debug": - service_name = service_data["name"] - print(f"Service name for {provider}: {service_name}") -``` -Refer Script: [readjson.py](https://github.com/paragpallavsingh/90DaysOfDevOps/blob/master/submission/day15/readjson.py) - -File: [services.json](https://github.com/paragpallavsingh/90DaysOfDevOps/blob/master/submission/day15/services.json) - -**3. Read YAML file using python, file services.yaml and read the contents to convert yaml to json** - -image - -``` -#pip install pyyaml -import yaml - -# Read the contents of the "services.yaml" file -with open("services.yaml", "r") as yaml_file: - data = yaml.safe_load(yaml_file) - -# Get the "services" dictionary from the loaded YAML data -services = data["services"] - -# Print the service names of each cloud service provider -for provider, service_data in services.items(): - if provider != "debug": - service_name = service_data["name"] - print(f"Service name for {provider}: {service_name}") -``` - -Refer Script : [readyaml.py](https://github.com/paragpallavsingh/90DaysOfDevOps/blob/master/submission/day15/readyaml.py) - -File: [services.yaml](https://github.com/paragpallavsingh/90DaysOfDevOps/blob/master/submission/day15/services.yaml) - -## Error resolution - -if you face this error: **No module named 'yaml'** - -just install **pyyaml** - -``` -pip install pyyaml -``` -image - -you will be able to read yaml successfully as shown above in task 3⬆️ - -image diff --git a/submission/day16/.gitignore b/submission/day16/.gitignore deleted file mode 100644 index 28aa4f6cc7..0000000000 --- a/submission/day16/.gitignore +++ /dev/null @@ -1 +0,0 @@ -getting-started-app diff --git a/submission/day16/README.md b/submission/day16/README.md deleted file mode 100644 index 7eac18a10e..0000000000 --- a/submission/day16/README.md +++ /dev/null @@ -1,117 +0,0 @@ -# Day 16 Task: Docker Beginning - -## Prerequisites. - -1. **Check that docker is installed. If not, you need to install it first** - -Refer this for easy and proper installation: [Install Docker on Ubuntu](https://docs.docker.com/engine/install/ubuntu/) - -If it is properly installed, your docker run will be green - -image - - -2. **Other important thing is to give proper [permissions to docker in Linux](https://docs.docker.com/engine/install/linux-postinstall/)** - -``` -#check if you are getting permission denied error. if yes follo below steps to setup right permissions -docker run hello-world -sudo groupadd docker -echo $USER -# check which user you are giving permission to -sudo usermod -aG docker $USER -# after this you need to restart your machine for the changes to take effect -``` -image

- -## Task 1 *docker run hello-world* -``` -docker run hello-world -``` -image - - -3. To get the container related commands, [**Containerise an application**](https://docs.docker.com/get-started/02_our_app/) - -``` -git clone https://github.com/docker/getting-started-app.git -cd /path/to/getting-started-app -touch Dockerfile -``` -Paste below into the Dockerfile -``` -# syntax=docker/dockerfile:1 - -FROM node:18-alpine -WORKDIR /app -COPY . . -RUN yarn install --production -CMD ["node", "src/index.js"] -EXPOSE 3000 -``` -After that follow below steps -``` -cd /path/to/getting-started-app -docker build -t getting-started . -docker run -dp 127.0.0.1:3000:3000 getting-started -``` -image - -After a few seconds, open your web browser to http://localhost:3000. You should see your app. - -Alternatively you can curl in your terminal to confirm -``` -curl localhost:3000 -``` -image - -# Now all your remaining task commands can be executed with charm!😀 -## Task 2 *docker inspect hello-world:latest* -``` -docker inspect hello-world:latest -``` -image - -``` -docker image ls -``` -image - - -## Task 3 *dokcer ps, port, stat* -``` -docker ps -``` -image - -``` -docker port 15bf70b409f9 -``` -image - -``` -docker stats 15bf70b409f9 -``` -image - -``` -docker top 15bf70b409f9 -``` -image - -## Task 4 docker save and load -``` -docker save getting-started > getting-started.tar -ls -sh getting-started.tar -docker save --output getting-started.tar getting-started -docker load < getting-started.tar -docker images -``` -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/fcf94a97-d307-4637-aa45-b7ed2d6088c5) - - - - - - - diff --git a/submission/day17/README.md b/submission/day17/README.md deleted file mode 100644 index 620ab997b6..0000000000 --- a/submission/day17/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Dockerfile use in Docker - -Here's My DockerFile Submission - -[Dockerfile Deepdive](https://www.linkedin.com/posts/paragpallavsingh_dockerfile-deepdive-complete-dockerfile-activity-7095642983236083714-aVae?utm_source=share&utm_medium=member_desktop) diff --git a/submission/day18/README.md b/submission/day18/README.md deleted file mode 100644 index 6dc4cc1c17..0000000000 --- a/submission/day18/README.md +++ /dev/null @@ -1,135 +0,0 @@ -# Day 18 Dockerfile and Docker-Compose - -## **Making a Flask app using Redis through Docker compose** - -1. **Adding Flask App and define dependencies** -Adding project files as - -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/1e739373-dee5-4c82-a158-a440a2250d7a) - -2. **Writing the Dockerfile** -``` -#syntax=docker/dockerfile:1 -FROM python:3.7-alpine -WORKDIR /code -ENV FLASK_APP=app.py -ENV FLASK_RUN_HOST=0.0.0.0 -RUN apk add --no-cache gcc musl-dev linux-headers -COPY requirements.txt requirements.txt -RUN pip install -r requirements.txt -EXPOSE 5000 -COPY . . -CMD ["flask", "run"] -``` - - -4. **Writing services in docker compose (yaml file)** -``` -services: - web: - build: . - ports: - - "8000:5000" - redis: - image: "redis:alpine" -``` -4. **Build and Run using docker-compose up** -``` -docker-compose up -``` -image -

-image -

-image -

- -## Here is the running app - -image - -On pressing **Ctrl+C** - -image -

- -## **Some other commands** - -***1. to stop the application*** -``` -docker-compose down -``` - -image - - -***2. to run the container in detached mode*** -``` -docker-compose up -d -``` - -image - - -***3. to stop the detached container*** -``` -docker-compose stop -``` -image - - -## SOME Suggestions if you are working in AWS Free Tier Account - -1. ***Use these commands to find your instance slowness*** - -> To check the available memory -``` -df -h -``` -image - - -> To check all the container whether running or stopped ones. -``` -docker ps -a -``` -image - - -> To remove unused container -``` -docker rm -#refer above image -``` - -> To check all the volumes created -``` -docker volume ls -``` -image - -> To prune unused volumes -``` -docker volume prune -``` -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/17c2195d-c2e9-4439-8f70-6df3639a3410) - - -> To check all the images -``` -docker images -a -``` -image - - -> To delelte an image -``` -docker rmi -``` -image - -image - -*Please note: you can delete only untagged images. If the above command does not work, first remove the container attched then try this* - -Side note: https://docs.docker.com/compose/gettingstarted/ --> This is a good reference point for learners. Just understand each component step by step instead of copy paste and you will be having pretty decent understanding. diff --git a/submission/day18/flask_app/Dockerfile b/submission/day18/flask_app/Dockerfile deleted file mode 100644 index 9344bd18a0..0000000000 --- a/submission/day18/flask_app/Dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -#syntax=docker/dockerfile:1 -FROM python:3.7-alpine -WORKDIR /code -ENV FLASK_APP=app.py -ENV FLASK_RUN_HOST=0.0.0.0 -RUN apk add --no-cache gcc musl-dev linux-headers -COPY requirements.txt requirements.txt -RUN pip install -r requirements.txt -EXPOSE 5000 -COPY . . -CMD ["flask", "run"] diff --git a/submission/day18/flask_app/__pycache__/app.cpython-37.pyc b/submission/day18/flask_app/__pycache__/app.cpython-37.pyc deleted file mode 100644 index 53666892260efab3a0cd5f40a321882e14ca2f82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 796 zcmYjPK~L2{5T4m~ODP~~F!8v0>je@|9t;?X#uFh*0`%ZZ=`OtT`nq*@p8@1~5U&1* z$I-vxuP}Qu@kIOwo}BHA#%X7Eb~~N<=G%F(vXTMG^xJp2#Q=VW&0mShc}{9~$w-jc zKrvsjK-#m0jiVw$P?3tSu;2<$6B)@^@-M7dkcnKlh9XsbwkXpZl#4RE28zohzJ+}0 zma@W5j-J12N;~r0C|TS3*F%7u`FN=NoGP8#;MTCpTmms4NGfyt@Gm;-ag()~bOC-Oc@B5)8iu{BJa0u^{1JZCt z5R;u-PE`m??W{p^Z-Y4@CHb+HFL+*+)le02-B!j#bm}v8R;kX_y0w0FTeq#M!sewh z+W6SjW97MRld~&SKxOCyh`)2xf=O)1Od>F8-k!!=~0ZY(4pfz7I%e2ht<;P)IOc({9 z4hC&GR)c|$sD8oUgaI;vqj^DY^u(z?$A7f~$)+!uJ{xN}Y1C$*%7z*#OL3X>4ojE* E0CiKj(EtDd diff --git a/submission/day18/flask_app/app.py b/submission/day18/flask_app/app.py deleted file mode 100644 index 5cd1a5a34c..0000000000 --- a/submission/day18/flask_app/app.py +++ /dev/null @@ -1,23 +0,0 @@ -import time - -import redis -from flask import Flask - -app = Flask(__name__) -cache = redis.Redis(host='redis', port=6379) - -def get_hit_count(): - retries = 5 - while True: - try: - return cache.incr('hits') - except redis.exceptions.ConnectionError as exc: - if retries == 0: - raise exc - retries -= 1 - time.sleep(0.5) - -@app.route('/') -def hello(): - count = get_hit_count() - return 'Hello World! You have been seen {} times.\n\n\n

This is a sample docker app by Parag based on redis '.format(count) diff --git a/submission/day18/flask_app/compose.yaml b/submission/day18/flask_app/compose.yaml deleted file mode 100644 index da11822f7b..0000000000 --- a/submission/day18/flask_app/compose.yaml +++ /dev/null @@ -1,11 +0,0 @@ -services: - web: - build: . - ports: - - "8000:5000" - volumes: - - .:/code - environment: - FLASK_DEBUG: "true" - redis: - image: "redis:alpine" diff --git a/submission/day18/flask_app/requirements.txt b/submission/day18/flask_app/requirements.txt deleted file mode 100644 index 1a5dc97b12..0000000000 --- a/submission/day18/flask_app/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -flask -redis diff --git a/submission/day19/README.md b/submission/day19/README.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/submission/day19/flask_app/Dockerfile b/submission/day19/flask_app/Dockerfile deleted file mode 100644 index 9344bd18a0..0000000000 --- a/submission/day19/flask_app/Dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -#syntax=docker/dockerfile:1 -FROM python:3.7-alpine -WORKDIR /code -ENV FLASK_APP=app.py -ENV FLASK_RUN_HOST=0.0.0.0 -RUN apk add --no-cache gcc musl-dev linux-headers -COPY requirements.txt requirements.txt -RUN pip install -r requirements.txt -EXPOSE 5000 -COPY . . -CMD ["flask", "run"] diff --git a/submission/day19/flask_app/__pycache__/app.cpython-37.pyc b/submission/day19/flask_app/__pycache__/app.cpython-37.pyc deleted file mode 100644 index 44a38ed662b6b4d525c4bb1cafc557205a7afac7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 796 zcmYjPF>lo{5WaKb*Sxf)fQrOu*s`<|6GPP^DiBjuL8Z1CcuHfpFMWA&u>DY5`WR?e z{=@6YuVF==keDhaRwmAQ0&&Tm&(7uUyU+K0c{v4=Uthn;Ee7x-Z2n42&NEWGOGbjk z8uIyyIntihY#ikgf{Ijpg*jJv+LMutCI8Iw1=*7e*N`WQ&-yaCLD`q-HBekC@eO2) zx0DrjGW7gqUD%Q5M#;)nKOX{Q%*R7*osU~>Tp0p`5I_iUw@K|=G7_h7ws)R7n4x4h zlr{#(PNUO!l$t$+DI#1vz62SKn0a!EpOF0cDNMofSx@pC`o14pqR5YU0Eh6dcR(7> z2x4#NmQxkNQaNjo+}mJINJ+kLWec8{MLAS?Ts5UJ5uN%}ot3I}m2RwG+15>?%CLE1 zj5a=Y)mV9MYo*$ZI5NtaN?9M#PhY^SP=en}>!p@zy=dFD_S`R@C^w+`gHlf#*QWq` zpA2A(jGh!%F(E%eb1(di>;KpaPy?clt-ItnxT4M_&WMG;RmOHM%2%qcwb<9DmXE}t zo`_-bUWp^68exO^Fckr_T}#t+qutyaR#wnk2wRNXS_!GkkurkNilcL}TbSZR92Hhc zp&QZNsK{7{&G(MA85b_xc-KtV?%V`;o(}_-RdQ_@JzzaF4`|I6%@Qqhdiik}786Fn zCxby#jMZS^BdVYC*I|H6;Amcu8$EHV%kf{WK(gryCL3cdC$-uPRM}7?VF@mg-eJk& E9|Cx~QUCw| diff --git a/submission/day19/flask_app/app.py b/submission/day19/flask_app/app.py deleted file mode 100644 index 5cd1a5a34c..0000000000 --- a/submission/day19/flask_app/app.py +++ /dev/null @@ -1,23 +0,0 @@ -import time - -import redis -from flask import Flask - -app = Flask(__name__) -cache = redis.Redis(host='redis', port=6379) - -def get_hit_count(): - retries = 5 - while True: - try: - return cache.incr('hits') - except redis.exceptions.ConnectionError as exc: - if retries == 0: - raise exc - retries -= 1 - time.sleep(0.5) - -@app.route('/') -def hello(): - count = get_hit_count() - return 'Hello World! You have been seen {} times.\n\n\n

This is a sample docker app by Parag based on redis '.format(count) diff --git a/submission/day19/flask_app/compose.yaml b/submission/day19/flask_app/compose.yaml deleted file mode 100644 index da11822f7b..0000000000 --- a/submission/day19/flask_app/compose.yaml +++ /dev/null @@ -1,11 +0,0 @@ -services: - web: - build: . - ports: - - "8000:5000" - volumes: - - .:/code - environment: - FLASK_DEBUG: "true" - redis: - image: "redis:alpine" diff --git a/submission/day19/flask_app/requirements.txt b/submission/day19/flask_app/requirements.txt deleted file mode 100644 index 1a5dc97b12..0000000000 --- a/submission/day19/flask_app/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -flask -redis diff --git a/submission/day20/README.md b/submission/day20/README.md deleted file mode 100644 index 71bebd2737..0000000000 --- a/submission/day20/README.md +++ /dev/null @@ -1,3 +0,0 @@ -Docker Cheatsheet - -![image](https://github.com/paragpallavsingh/90DaysOfDevOps/assets/40052830/445c857a-8dee-434b-b8d7-c3e20e01356b) diff --git a/submission/day21/README.md b/submission/day21/README.md deleted file mode 100644 index 9a39643b14..0000000000 --- a/submission/day21/README.md +++ /dev/null @@ -1,419 +0,0 @@ -## Day 21 Task: Docker Essential Concepts - - - - - -## Docker Interview - Docker is a good topic to ask in DevOps Engineer Interviews, mostly for freshers. - One must surely try these questions in order to be better in Docker - -## Questions - - -### 1. What is the Difference between an Image, Container and Engine? - -| Aspect | Image | Container | Engine | -|--------------------|----------------------------------------|-----------------------------------------|-----------------------------------------| -| Definition | Static snapshot of an application | Running instance of an image | Software that manages and runs containers | -| Contents | Includes code, runtime, libraries, etc. | Includes the image and runtime context | Provides tools and services for containers | -| Portability | Highly portable | Portable | Enables portability and orchestration | -| Isolation | Not executable on its own | Isolated runtime environment | Manages isolation and resource allocation | -| Lifecycle | Created, stored, and shared | Created, started, stopped, and removed | Installed, configured, and operated | -| Purpose | Basis for creating containers | Runnable instance of an application | Manages containerization and deployment | -| Interaction | Used to create containers | Created from images, runs applications | Used to build, manage, and run containers| -| Persistence | Can be stored in a registry | Exists only while running | Persistent management of containers | -| Networking | No network configuration | Can have network settings | Manages networking for containers | -| Storage | No state storage | Can have state stored inside | Coordinates storage resources | -| Example Technologies | Docker images, OCI images | Docker containers, Kubernetes pods | Docker Engine, containerd, Kubernetes | - -### 2. What is the Difference between the Docker command COPY vs ADD? - -| Aspect | COPY | ADD | -|----------------------|---------------------------------|----------------------------------| -| Purpose | Copies files and directories | Copies files and directories | -| Source | Can copy from the build context | Can copy from the build context | -| Destination | Only works with the container's file system | Can also extract archives and handle URLs | -| Extraction | Does not automatically extract archives | Can automatically extract common archives (e.g., `.tar`, `.gzip`) | -| URL Handling | Cannot handle URLs | Can download from URLs | -| Ownership & Permissions | Preserves ownership and permissions | Copies with default permissions | -| Cache Busting | Only invalidates cache if source file changes | Invalidates cache if source URL or contents change | -| Use Cases | Best for simple file copying | Offers additional features like URL handling and archive extraction | - -### 3. What is the Difference between the Docker command CMD vs RUN? - -| Aspect | CMD | RUN | -|----------------------|--------------------------------------------------|--------------------------------------------------| -| Purpose | Specifies the default command for the container | Executes commands during image build | -| Usage | Typically used once at the end of a Dockerfile | Can be used multiple times in a Dockerfile | -| Command Execution | Executes only when the container starts | Executes during image build | -| Overriding | Can be overridden by a command during container run | Commands are fixed in the image | -| Default | Provides the default behavior for the container | Does not change the container behavior | -| Parameters | Executable command and optional arguments | Shell command(s) and arguments to execute | -| Example | `CMD ["nginx", "-g", "daemon off;"]` | `RUN apt-get update && apt-get install -y curl`| - - -### 4. How Will you reduce the size of the Docker image? - -Reducing the size of a Docker image is important for optimizing storage, transfer times, and resource consumption. Here are several strategies you can employ to achieve a smaller Docker image size: -1. **Use Minimal Base Images:** - Choose lightweight base images like Alpine Linux or BusyBox instead of full-fledged operating systems. These minimal images contain only essential components, leading to smaller image sizes. - -2. **Multi-Stage Builds:** - Utilize multi-stage builds to separate build-time dependencies from runtime artifacts. This involves creating multiple build stages in the Dockerfile, where the final stage only includes the necessary runtime components. This can significantly reduce the image size. - -3. **Minimize Layers:** - Each instruction in a Dockerfile creates a new layer in the image. Minimize the number of instructions to reduce the number of layers. Combine multiple commands into a single RUN instruction when possible. - -4. **Use COPY Instead of ADD:** - Use the `COPY` command instead of `ADD` to copy files into the image. `COPY` is simpler and doesn't perform any automatic extraction, reducing the chances of unintended increase in image size. - -5. **Cleanup Unnecessary Files:** - Remove temporary files, caches, and any files that are not required in the final image. Use the `RUN` instruction to delete files immediately after they've been used to avoid unnecessary layers. - -6. **Avoid Installing Unnecessary Packages:** - When installing software packages, only include the dependencies required for your application to run. Minimize the number of extra packages that get installed. - -7. **Use Specific Version Tags:** - When installing software, specify exact version numbers for packages and dependencies. Avoid using generic or latest tags as they might result in larger images when dependencies change. - -8. **Compress Files Before Adding:** - If you need to include large files, compress them before adding them to the image. Then, you can decompress them during runtime. - -9. **Use .dockerignore:** - Create a `.dockerignore` file in your project directory to exclude unnecessary files and directories from being added to the image during the build process. - -10. **Alpine Package Optimization:** - When using Alpine Linux, you can optimize package installation by specifying the `--no-cache` flag in the `RUN` command to prevent the creation of cache files. - -11. **Optimize Dockerfile Instructions:** - Optimize the order of Dockerfile instructions. Place instructions that change infrequently (e.g., installing dependencies) before instructions that change frequently (e.g., copying source code). - -12. **Clean Up Apt and Yum Cache:** - If using Debian-based (`apt`) or Red Hat-based (`yum`) package managers, clean up the package cache in the same `RUN` command after installing packages. - -### 5. Why and when to use Docker? - -1. **Isolation and Consistency:** Docker provides containerization, isolating applications and their dependencies from the underlying system. This ensures consistent behavior across various environments, from development to production, reducing the "it works on my machine" problem. - -2. **Portability:** Docker containers encapsulate the application and its dependencies into a single package. This makes it easy to move applications between different hosts, cloud platforms, and on-premises environments, fostering a "write once, run anywhere" approach. - -3. **Resource Efficiency:** Docker containers share the host OS kernel, consuming fewer resources compared to traditional virtualization. This allows you to run more applications on the same infrastructure, optimizing resource utilization. - -4. **Rapid Deployment and Scaling:** Docker's lightweight nature enables fast application deployment and scaling. You can easily spin up new containers or replicate existing ones to handle varying levels of load, improving application responsiveness. - -5. **Microservices and DevOps:** Docker is well-suited for microservices architectures and DevOps practices. It allows teams to develop, test, and deploy small, independent services in parallel, enabling quicker iterations, continuous integration, and continuous deployment. - -### 6. Explain the Docker components and how they interact with each other. - -Docker consists of several key components that work together to enable containerization, deployment, and management of applications. Here's a brief overview of these components and how they interact: - -1. **Docker Daemon:** - The Docker daemon (dockerd) is a background process running on the host system. It's responsible for building, running, and managing containers. It listens for Docker API requests and communicates with the container runtime to manage containers' execution. - -2. **Docker Client:** - The Docker client (docker) is the command-line interface used by users to interact with the Docker daemon. It allows users to issue commands to build, run, stop, and manage containers. The client communicates with the Docker daemon via the Docker API. - -3. **Docker Images:** - Docker images are the building blocks of containers. An image is a lightweight, standalone, executable software package that includes the application code, runtime, libraries, and dependencies. Images are created from a set of instructions defined in a Dockerfile and can be stored in registries for distribution. - -4. **Docker Containers:** - Containers are instances of Docker images. They encapsulate the application, its dependencies, and runtime settings in an isolated environment. Containers share the host OS kernel but have their own isolated file system, networking, and process space. - -5. **Docker Compose:** - Docker Compose is a tool for defining and running multi-container Docker applications. It uses a YAML file to define services, networks, and volumes for different containers in a single application stack. Compose simplifies managing complex applications with multiple interconnected services. - -6. **Docker Registry:** - Docker registries are repositories for storing and distributing Docker images. The most common public registry is Docker Hub, but private registries can also be set up for secure image storage and distribution within an organization. - -7. **Docker Network:** - Docker networks allow containers to communicate with each other and with the outside world. They provide isolation and manage networking resources for containers, enabling seamless communication between containers on the same or different hosts. - -8. **Docker Volumes:** - Docker volumes are a way to manage persistent data for containers. Volumes can be mounted into containers, allowing data to be stored separately from the container's file system and persist even after a container is removed. - -### 7. Explain the terminology: Docker Compose, Docker File, Docker Image, Docker Container? - -1. **Docker Compose:** - Docker Compose is a tool for defining and managing multi-container Docker applications. It uses a YAML file to define the services, networks, and volumes that make up an application stack. Compose simplifies the process of orchestrating and running interconnected containers by allowing you to define and manage the entire application environment in a single configuration file. - -2. **Dockerfile:** - A Dockerfile is a text file that contains a set of instructions for building a Docker image. It defines the base image, sets up the environment, installs dependencies, copies files, and configures settings needed for your application. Dockerfiles are used to automate the creation of consistent and reproducible Docker images. - -3. **Docker Image:** - A Docker image is a standalone, executable software package that includes everything needed to run an application, such as the code, runtime, libraries, and dependencies. Images are created from Dockerfiles and can be shared, stored in registries, and used to create containers. Images serve as templates for containers and ensure consistent application behavior across different environments. - -4. **Docker Container:** - A Docker container is a runnable instance of a Docker image. Containers are isolated environments that encapsulate an application and its dependencies. They share the host OS kernel but have their own isolated file system, networking, and process space. Containers are lightweight, portable, and can be started, stopped, and replicated quickly. - -Together, these components enable efficient application development, deployment, and management through containerization. - -### 8. In what real scenarios have you used Docker? - -Here are some of the common scenarios where Docker is commonly used in the software development and deployment world: - -1. **Microservices Architecture:** Docker is often used to containerize individual microservices within a larger application. This approach allows each microservice to be developed, tested, and deployed independently, improving scalability and maintainability. - -2. **DevOps Practices:** Docker is a key tool in implementing DevOps practices. It helps in creating consistent development, testing, and production environments, reducing discrepancies between different stages of the software development lifecycle. - -3. **Continuous Integration and Continuous Deployment (CI/CD):** Docker images can be easily integrated into CI/CD pipelines, ensuring that the same image used during development is also used for testing and deployment. This helps catch issues earlier in the development process. - -4. **Local Development:** Developers often use Docker to replicate the production environment on their local machines. This ensures that what they build and test locally closely matches the production environment. - -5. **Portability and Cloud Deployment:** Docker's portability is particularly useful when deploying applications to the cloud. It allows you to package an application and its dependencies into a single container, making it easy to move and run across different cloud providers. - -6. **Isolation for Testing:** Docker containers provide isolation, making it easier to test software in a controlled environment without affecting the host system. This is especially valuable for testing different software configurations. - -7. **Legacy Application Modernization:** Docker can help modernize legacy applications by packaging them in containers. This allows older applications to run on modern infrastructure and take advantage of containerization benefits. - -8. **Resource Optimization:** By using Docker's lightweight containers, you can optimize resource utilization on servers, running multiple containers on a single host while maintaining isolation. - -9. **Big Data and Analytics:** Docker is used in big data environments to create isolated containers for various analytics tools, databases, and frameworks, ensuring consistent environments for data processing and analysis. - -10. **Edge Computing:** Docker's lightweight and consistent runtime makes it suitable for deploying applications at the edge of the network, where resource constraints and diverse hardware environments exist. - -### 9. Docker vs Hypervisor? - -| Aspect | Docker (Containerization) | Hypervisor (Virtualization) | -|----------------------|--------------------------------------------|--------------------------------------------| -| **Isolation Level** | Operating system-level virtualization | Full hardware-level virtualization | -| **Overhead** | Minimal resource overhead | Higher resource overhead | -| **Performance** | Near-native performance | Slightly lower performance due to overhead | -| **Resource Usage** | Shares host OS kernel, efficient resource usage | Emulates complete hardware, resource-intensive | -| **Portability** | Highly portable across environments | Less portable, requires more configuration | -| **Start Time** | Near-instant startup and shutdown | Longer startup and shutdown times | -| **Density** | Higher container density on a host | Lower VM density due to resource needs | -| **Networking** | Shared network stack with host and other containers | Separate virtual network stack for each VM | -| **Storage** | Shared file system with host and other containers | Virtual disk images for each VM | -| **Orchestration** | Integrated with tools like Docker Compose and Kubernetes | Requires separate management tools | -| **Use Cases** | Microservices, DevOps, lightweight apps | Legacy applications, complex environments | - -### 10. What are the advantages and disadvantages of using docker? - -| **Advantages** | **Disadvantages** | -|-----------------------------------------------|------------------------------------------------| -| **Isolation**: Containers provide application isolation without the overhead of full virtualization. | **Learning Curve**: New concepts and tools to master. | -| **Portability**: Consistent environments across development, testing, and production. | **Resource Overhead**: Slight performance overhead due to shared kernel. | -| **Resource Efficiency**: Containers share the host OS kernel, leading to efficient resource utilization. | **Limited OS Support**: Works best on Linux; Windows and macOS support has limitations. | -| **Rapid Deployment**: Containers start quickly and can be scaled up or down easily. | **Security Concerns**: Misconfiguration can lead to vulnerabilities. | -| **Version Control**: Images provide versioned snapshots of applications and dependencies. | **Complex Networking**: Networking between containers can be complex. | -| **Microservices**: Ideal for microservices architecture and modular application design. | **Persistence**: Containers are typically stateless, requiring separate solutions for data storage. | -| **Ecosystem**: Rich ecosystem with tools like Docker Compose and Kubernetes for orchestration. | **Image Size**: Images can be large, especially with full environments. | -| **DevOps Integration**: Facilitates CI/CD pipelines and DevOps practices. | **Incompatibility**: Some legacy applications might not work well in containers. | -| **Isolation and Compatibility**: Containers can run side by side with different dependencies. | **Continuous Maintenance**: Images and containers need regular updates and management. | -| **Development Consistency**: Replicate production environment on local machine for development. | **Lack of GUI**: Docker is primarily command-line driven; graphical interfaces are limited. | - -### 11. What is a Docker namespace? - -In Docker, namespaces are a key component of containerization that provide process isolation and resource separation between containers and the host system. They create a virtualized environment for each container, isolating processes, filesystems, networks, and other resources. This allows multiple containers to run on the same host without interfering with each other or the host system. - -Here's a brief overview of namespaces along with an example: - -**Namespace Types in Docker:** - -1. **PID Namespace (pid):** Provides process isolation. Each container sees only its own set of processes, with process IDs (PIDs) unique within the namespace. - -2. **Network Namespace (net):** Isolates networking resources, including network interfaces, IP addresses, routing tables, and firewall rules. - -3. **Mount Namespace (mnt):** Provides filesystem isolation. Containers have their own filesystem hierarchy, separate from the host and other containers. - -4. **UTS Namespace (uts):** Isolates hostname and domain name, allowing each container to have its own identity for these attributes. - -5. **IPC Namespace (ipc):** Isolates inter-process communication (IPC) resources such as shared memory segments and semaphores. - -6. **User Namespace (user):** Isolates user and group IDs, allowing containers to have their own user and group mappings. - -**Example:** - -Let's consider a scenario where two Docker containers are running on the same host, both serving web applications. Each container needs to run its own web server on port 80. - -In this case, the network namespace ensures that both containers can use port 80 without conflict. Each container's network namespace is isolated, allowing them to have their own IP addresses, network interfaces, and routing tables. - -Container 1: -- Network Namespace: Isolated -- IP Address: 172.17.0.2 -- Port 80: Mapped to 8080 - -Container 2: -- Network Namespace: Isolated -- IP Address: 172.17.0.3 -- Port 80: Mapped to 8081 - -### 12. What is a Docker registry? - -A Docker registry is a centralized repository that stores Docker images. It allows you to manage, distribute, and share Docker images across different environments and teams. Docker Hub is one of the most popular public Docker registries, but you can also set up private registries to control image distribution within your organization. - -Here's a brief overview of a Docker registry along with an example: - -**Public Docker Registry (Docker Hub):** -Docker Hub is a public registry where you can find and share Docker images. It's commonly used for open-source projects and public applications. You can pull images from Docker Hub to your local machine or directly to your server for deployment. - -**Private Docker Registry:** -A private Docker registry is used to store images that are not meant to be shared publicly. You can set up your own private registry to maintain control over image distribution, security, and access within your organization. - -**Example: Using Docker Hub** - -1. **Pulling an Image:** - Let's say you want to use the official `nginx` web server image from Docker Hub. - - ``` - docker pull nginx - ``` - -2. **Pushing an Image (Private Registry):** - If you have your own private registry, you can push an image to it. Here, we'll use a hypothetical private registry at `registry.example.com`. - - ``` - docker tag nginx registry.example.com/my-nginx - docker push registry.example.com/my-nginx - ``` - -3. **Pulling an Image from Private Registry:** - To pull an image from your private registry, you need to log in first. - - ``` - docker login registry.example.com - docker pull registry.example.com/my-nginx - ``` - -### 13. What is an entry point? - -In Docker, the `ENTRYPOINT` instruction is used in a Dockerfile to specify the command that will be executed when a container is started from an image. It essentially sets the default command that will run as the primary process inside the container. This command can be overridden when the container is run by providing additional arguments. - -Here's a brief explanation of the `ENTRYPOINT` instruction: - -**Usage:** -The `ENTRYPOINT` instruction is used in a Dockerfile to define the primary command to run when the container starts. - -**Example:** -Consider a Dockerfile for a Python application that runs a script named `app.py`. You can use the `ENTRYPOINT` instruction to set the default command for the container: - -```Dockerfile -FROM python:3.9 - -WORKDIR /app - -COPY app.py . - -ENTRYPOINT ["python", "app.py"] -``` - -In this example, the `ENTRYPOINT` is set to `["python", "app.py"]`. When you run a container from this image, the `app.py` script will be executed as the primary process. - -### 14. How to implement CI/CD in Docker? - -Refer Blog : [How to build a CI/CD pipeline with Docker](https://circleci.com/blog/build-cicd-piplines-using-docker/) - -### 15. Will data on the container be lost when the docker container exits? - -Yes, by default, any data stored within a Docker container will be lost when the container exits. Docker containers are designed to be ephemeral, meaning they are created and destroyed as needed. When a container is stopped or removed, the data within it, such as files, databases, and changes made during its runtime, will not persist unless you take specific steps to ensure data persistence. - -To retain data across container restarts or removals, you can use the following approaches: - -1. **Docker Volumes:** - Docker volumes are a way to store data outside the container's filesystem, ensuring that the data persists even if the container is removed. Volumes can be used to store application data, configuration files, and databases. You can attach volumes to containers using the `-v` or `--volume` flag when running the `docker run` command. - - Example: - ```sh - docker run -v /path/on/host:/path/in/container my-app - ``` - -2. **Docker Bind Mounts:** - Similar to volumes, bind mounts allow you to map a host system directory into a container. Changes made to files in the bind mount on the host are reflected immediately in the container, and vice versa. This provides more flexibility compared to volumes. - - Example: - ```sh - docker run -v /host/directory:/container/directory my-app - ``` - -3. **Named Volumes:** - Docker also supports creating named volumes, which are managed by Docker and can be shared between multiple containers. Named volumes make it easier to manage and reuse data across containers. - - Example: - ```sh - docker run -v my-volume:/data my-app - ``` - -4. **Docker Compose:** - When using Docker Compose, you can define volumes in your `docker-compose.yml` file to ensure data persistence across services defined in the compose file. - - Example: - ```yaml - version: "3" - services: - web: - image: nginx - volumes: - - my-volume:/usr/share/nginx/html - volumes: - my-volume: - ``` - -By using these methods, you can ensure that important data and changes made within a Docker container are preserved even after the container exits, restarts, or is removed. - -### 16. What is a Docker swarm? - -Docker Swarm, also known as Docker Swarm Mode, is a native clustering and orchestration solution for Docker. It allows you to create and manage a cluster of Docker nodes (machines) that work together as a single virtual Docker host. Docker Swarm provides a simple and integrated way to deploy and manage containerized applications at scale. - -Here's a brief overview of Docker Swarm: - -**Key Concepts:** - -1. **Manager Nodes:** These are the control plane nodes that manage the cluster and orchestrate the deployment of services and tasks. - -2. **Worker Nodes:** These are the worker machines that run containers based on the instructions provided by the manager nodes. - -3. **Services:** Services are the declarative definitions of tasks to be run on the swarm. They define how many replicas of a container should run, which image to use, ports to expose, and more. - -4. **Tasks:** Tasks are individual units of work that run containers as part of a service. Each replica of a service is a task. - -5. **Load Balancing:** Docker Swarm provides built-in load balancing for services across the worker nodes. - -6. **Overlay Networking:** Swarm supports overlay networking, allowing containers to communicate with each other across nodes as if they were on the same network. - -7. **Rolling Updates and Rollbacks:** Swarm enables rolling updates and rollbacks for services, ensuring minimal downtime during updates. - -8. **High Availability:** Swarm supports high availability by allowing you to create manager node replicas, preventing a single point of failure. - -### 17. What are the docker commands for the following: - -- **View Running Containers:** - ``` - docker ps - ``` - -- **Run Container with a Specific Name:** - ``` - docker run --name my-container my-image - ``` - -- **Export a Docker Container:** - ``` - docker export my-container > container-export.tar - ``` - -- **Import an Existing Docker Image:** - ```sh - docker import container-export.tar my-imported-image - ``` - -- **Delete a Container:** - ``` - docker rm my-container - ``` - -- **Remove Stopped Containers, Unused Networks, Build Caches, and Dangling Images:** - ``` - docker system prune - ``` - - You can also use the `-a` flag to remove all unused images, not just dangling ones. - - ``` - docker system prune -a - ``` -

-Parag Pallav Singh LinkedIn -Parag Pallav Singh Facebook -Parag Pallav Singh Twitter -Parag Pallav Singh Blog diff --git a/submission/day22/README.md b/submission/day22/README.md deleted file mode 100644 index 0d67dc38c2..0000000000 --- a/submission/day22/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Day 22 Task Make a Jenkins job - -image - -image diff --git a/submission/day23/README.md b/submission/day23/README.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/submission/day24/README.md b/submission/day24/README.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/submission/day25/README.md b/submission/day25/README.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/submission/day26/README.md b/submission/day26/README.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/submission/day27/README.md b/submission/day27/README.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/submission/day28/README.md b/submission/day28/README.md deleted file mode 100644 index e69de29bb2..0000000000 From aecc405fa4fc185c5eb2a62b9886f910becd21e4 Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Sat, 26 Aug 2023 21:56:51 +0530 Subject: [PATCH 169/394] udapte navigation links --- 2023/day01/README.md | 2 +- 2023/day02/README.md | 2 +- 2023/day03/README.md | 2 +- 2023/day04/README.md | 2 +- 2023/day05/README.md | 2 +- 2023/day06/README.md | 2 +- 2023/day07/README.md | 2 +- 2023/day08/README.md | 2 +- 2023/day09/README.md | 4 ++-- 2023/day10/README.md | 2 +- 2023/day11/README.md | 2 +- 2023/day12/README.md | 2 +- 2023/day13/README.md | 2 +- 2023/day14/README.md | 2 +- 2023/day15/README.md | 2 +- 2023/day16/README.md | 2 +- 2023/day17/README.md | 2 +- 2023/day18/README.md | 2 +- 2023/day19/README.md | 2 +- 2023/day20/README.md | 2 +- 2023/day21/README.md | 2 +- 2023/day22/README.md | 2 +- 2023/day23/README.md | 2 +- 2023/day24/README.md | 2 +- 2023/day25/README.md | 2 +- 2023/day26/README.md | 2 +- 2023/day27/README.md | 2 +- 2023/day28/README.md | 2 +- 2023/day29/README.md | 2 +- 2023/day30/README.md | 2 +- 2023/day31/README.md | 2 +- 2023/day32/README.md | 2 +- 2023/day33/README.md | 2 +- 2023/day34/README.md | 2 +- 2023/day35/README.md | 2 +- 2023/day36/README.md | 2 +- 2023/day37/README.md | 2 +- 2023/day38/README.md | 2 +- 2023/day39/README.md | 2 +- 2023/day40/README.md | 2 +- 2023/day41/README.md | 2 +- 2023/day42/README.md | 2 +- 2023/day43/README.md | 2 +- 2023/day44/README.md | 2 +- 2023/day45/README.md | 2 +- 2023/day46/README.md | 2 +- 2023/day47/README.md | 2 +- 2023/day48/README.md | 2 +- 2023/day49/README.md | 2 +- 2023/day50/README.md | 2 +- 2023/day51/README.md | 2 +- 2023/day52/README.md | 2 +- 2023/day53/README.md | 2 +- 2023/day54/README.md | 2 +- 2023/day55/README.md | 2 +- 2023/day56/README.md | 2 +- 2023/day57/README.md | 2 +- 2023/day58/README.md | 2 +- 2023/day59/README.md | 2 +- 2023/day60/README.md | 2 +- 2023/day61/README.md | 2 +- 2023/day62/README.md | 2 +- 2023/day63/README.md | 2 +- 2023/day64/README.md | 2 +- 2023/day65/README.md | 2 +- 2023/day66/README.md | 2 +- 2023/day67/README.md | 2 +- 2023/day68/README.md | 2 +- 2023/day69/README.md | 2 +- 2023/day70/README.md | 2 +- 2023/day71/README.md | 2 +- 2023/day72/README.md | 2 +- 2023/day73/README.md | 2 +- 2023/day74/README.md | 2 +- 2023/day75/README.md | 4 ++-- 2023/day76/README.md | 2 +- 2023/day77/README.md | 2 +- 2023/day78/README.md | 2 +- 2023/day79/README.md | 2 +- 2023/day80/README.md | 2 +- 2023/day81/README.md | 2 +- 2023/day82/README.md | 2 +- 2023/day83/README.md | 2 +- 2023/day84/README.md | 2 +- 2023/day85/README.md | 2 +- 2023/day86/README.md | 2 +- 2023/day87/README.md | 2 +- 2023/day88/README.md | 2 +- 2023/day89/README.md | 2 +- 2023/day90/README.md | 2 +- 90 files changed, 92 insertions(+), 92 deletions(-) diff --git a/2023/day01/README.md b/2023/day01/README.md index dcd95237d3..362e4be12e 100644 --- a/2023/day01/README.md +++ b/2023/day01/README.md @@ -9,4 +9,4 @@ This is the day you have to Take this challenge and start your #90DaysOfDevOps w - What is Automation, Scaling, Infrastructure - Why DevOps is Important, etc -[Next Day →](../day02/tasks.md) +[Next Day →](../day02/README.md) diff --git a/2023/day02/README.md b/2023/day02/README.md index e17dbec24c..342ac39c32 100644 --- a/2023/day02/README.md +++ b/2023/day02/README.md @@ -10,4 +10,4 @@ Note: [Check this file for reference](basic_linux_commands.md) Check the basic_linux_commands.md file on the same directory day2 -[← Previous Day](../day01/tasks.md) | [Next Day →](../day03/tasks.md) +[← Previous Day](../day01/README.md) | [Next Day →](../day03/README.md) diff --git a/2023/day03/README.md b/2023/day03/README.md index d413ee213c..c3d1d17563 100644 --- a/2023/day03/README.md +++ b/2023/day03/README.md @@ -16,4 +16,4 @@ Task: What is the linux command to Reference: https://www.linkedin.com/pulse/linux-commands-devops-used-day-to-day-activit-chetan-/ -[← Previous Day](../day02/tasks.md) | [Next Day →](../day04/tasks.md) +[← Previous Day](../day02/README.md) | [Next Day →](../day04/README.md) diff --git a/2023/day04/README.md b/2023/day04/README.md index 1ea09abac5..1f280fd068 100644 --- a/2023/day04/README.md +++ b/2023/day04/README.md @@ -28,4 +28,4 @@ Article Reference: [Click here to read basic Linux Shell Scripting](https://devo YouTube Vedio: [EASIEST Shell Scripting Tutorial for DevOps Engineers](https://www.youtube.com/watch?v=_-D6gkRj7xc&list=PLlfy9GnSVerQr-Se9JRE_tZJk3OUoHCkh&index=3) -[← Previous Day](../day03/tasks.md) | [Next Day →](../day05/tasks.md) +[← Previous Day](../day03/README.md) | [Next Day →](../day05/README.md) diff --git a/2023/day05/README.md b/2023/day05/README.md index 94aa3deb75..d894468fd3 100644 --- a/2023/day05/README.md +++ b/2023/day05/README.md @@ -50,4 +50,4 @@ A user is an entity, in a Linux operating system, that can manipulate files and Post your daily work on Linkedin and let [me](https://www.linkedin.com/in/shubhamlondhe1996/) know , writing an article is the best :) -[← Previous Day](../day04/tasks.md) | [Next Day →](../day06/tasks.md) +[← Previous Day](../day04/README.md) | [Next Day →](../day06/README.md) diff --git a/2023/day06/README.md b/2023/day06/README.md index 3af9420806..e102718a0a 100644 --- a/2023/day06/README.md +++ b/2023/day06/README.md @@ -28,4 +28,4 @@ In case of any doubts, post it on [Discord Community](https://discord.gg/hs3Pmc5 Happy Learning -[← Previous Day](../day05/tasks.md) | [Next Day →](../day07/tasks.md) +[← Previous Day](../day05/README.md) | [Next Day →](../day07/README.md) diff --git a/2023/day07/README.md b/2023/day07/README.md index b516c9d956..d942492d95 100644 --- a/2023/day07/README.md +++ b/2023/day07/README.md @@ -40,4 +40,4 @@ For Reference, read [this](https://www.howtogeek.com/devops/how-to-check-if-the- #### Post about this and bring your friends to this #90DaysOfDevOps challenge. -[← Previous Day](../day06/tasks.md) | [Next Day →](../day08/tasks.md) +[← Previous Day](../day06/README.md) | [Next Day →](../day08/README.md) diff --git a/2023/day08/README.md b/2023/day08/README.md index f695de7680..cbaed0f8b3 100644 --- a/2023/day08/README.md +++ b/2023/day08/README.md @@ -48,4 +48,4 @@ Reff :- https://youtu.be/AT1uxOLsCdk Post your daily work on Linkedin and le me know , writing an article is the best :) -[← Previous Day](../day07/tasks.md) | [Next Day →](../day09/tasks.md) +[← Previous Day](../day07/README.md) | [Next Day →](../day09/README.md) diff --git a/2023/day09/README.md b/2023/day09/README.md index 25c3197aa8..fd9e178d58 100644 --- a/2023/day09/README.md +++ b/2023/day09/README.md @@ -23,6 +23,6 @@ task-2: reff :- https://youtu.be/AT1uxOLsCdk -Note: These steps assume that you have already installed Git on your computer and have created a GitHub account. If you need help with these prerequisites, you can refer to the [day-08](https://github.com/LondheShubham153/90DaysOfDevOps/blob/ee7c53f276edb02a85a97282027028295be17c04/2023/day08/tasks.md) +Note: These steps assume that you have already installed Git on your computer and have created a GitHub account. If you need help with these prerequisites, you can refer to the [day-08](https://github.com/LondheShubham153/90DaysOfDevOps/blob/ee7c53f276edb02a85a97282027028295be17c04/2023/day08/README.md) -[← Previous Day](../day08/tasks.md) | [Next Day →](../day10/tasks.md) +[← Previous Day](../day08/README.md) | [Next Day →](../day10/README.md) diff --git a/2023/day10/README.md b/2023/day10/README.md index 7624fd9bfc..8081a6b5c5 100644 --- a/2023/day10/README.md +++ b/2023/day10/README.md @@ -66,4 +66,4 @@ Advance Reference on branching : [video](https://youtu.be/7xhkEQS3dXw) You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. Happy Learning :) -[← Previous Day](../day09/tasks.md) | [Next Day →](../day11/tasks.md) +[← Previous Day](../day09/README.md) | [Next Day →](../day11/README.md) diff --git a/2023/day11/README.md b/2023/day11/README.md index 018810b3e5..d52d8c0d54 100644 --- a/2023/day11/README.md +++ b/2023/day11/README.md @@ -54,4 +54,4 @@ git status command shows the files that have conflicts, git diff command shows t You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. Happy Learning :) -[← Previous Day](../day10/tasks.md) | [Next Day →](../day12/tasks.md) +[← Previous Day](../day10/README.md) | [Next Day →](../day12/README.md) diff --git a/2023/day12/README.md b/2023/day12/README.md index e5ec5a8f1c..c5a9237c00 100644 --- a/2023/day12/README.md +++ b/2023/day12/README.md @@ -14,4 +14,4 @@ Post it on Linkedin and Spread the knowledge.😃 **Happy Learning :)** -[← Previous Day](../day11/tasks.md) | [Next Day →](../day13/tasks.md) +[← Previous Day](../day11/README.md) | [Next Day →](../day13/README.md) diff --git a/2023/day13/README.md b/2023/day13/README.md index 78613a6903..f366710009 100644 --- a/2023/day13/README.md +++ b/2023/day13/README.md @@ -26,4 +26,4 @@ Don't forget to share your Journey over linkedin. Let the community know that yo Happy Learning, Ruko Mat Phod do😃 -[← Previous Day](../day12/tasks.md) | [Next Day →](../day14/tasks.md) +[← Previous Day](../day12/README.md) | [Next Day →](../day14/README.md) diff --git a/2023/day14/README.md b/2023/day14/README.md index 7c72a3748f..88dbb3a46c 100644 --- a/2023/day14/README.md +++ b/2023/day14/README.md @@ -58,4 +58,4 @@ If you want to deep dive further, Watch [Python](https://youtu.be/abPgj_3hzVY) You can share the learning with everyone over linkedin and tag us along 😃 -[← Previous Day](../day13/tasks.md) | [Next Day →](../day15/tasks.md) +[← Previous Day](../day13/README.md) | [Next Day →](../day15/README.md) diff --git a/2023/day15/README.md b/2023/day15/README.md index 88db558cee..decf2b5ed9 100644 --- a/2023/day15/README.md +++ b/2023/day15/README.md @@ -26,4 +26,4 @@ gcp : compute engine Python Project for your practice: https://youtube.com/playlist?list=PLlfy9GnSVerSzFmQ8JqP9v0XHHOAeWbjo -[← Previous Day](../day14/tasks.md) | [Next Day →](../day16/tasks.md) +[← Previous Day](../day14/README.md) | [Next Day →](../day16/README.md) diff --git a/2023/day16/README.md b/2023/day16/README.md index b6ee0fbcbe..57bcc7decf 100644 --- a/2023/day16/README.md +++ b/2023/day16/README.md @@ -29,4 +29,4 @@ https://youtu.be/Tevxhn6Odc8 You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. Happy Learning :) -[← Previous Day](../day15/tasks.md) | [Next Day →](../day17/tasks.md) +[← Previous Day](../day15/README.md) | [Next Day →](../day17/README.md) diff --git a/2023/day17/README.md b/2023/day17/README.md index 02aba5d132..430ddb1154 100644 --- a/2023/day17/README.md +++ b/2023/day17/README.md @@ -28,4 +28,4 @@ You can share the learning with everyone over linkedin and tag us along 😃 Happy Learning:) -[← Previous Day](../day16/tasks.md) | [Next Day →](../day18/tasks.md) +[← Previous Day](../day16/README.md) | [Next Day →](../day18/README.md) diff --git a/2023/day18/README.md b/2023/day18/README.md index 388b095f23..f101e56e38 100644 --- a/2023/day18/README.md +++ b/2023/day18/README.md @@ -40,4 +40,4 @@ For reference you can watch this [video](https://youtu.be/Tevxhn6Odc8) You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. Happy Learning :) -[← Previous Day](../day17/tasks.md) | [Next Day →](../day19/tasks.md) +[← Previous Day](../day17/README.md) | [Next Day →](../day19/README.md) diff --git a/2023/day19/README.md b/2023/day19/README.md index 9936bb70c7..cd034fe06c 100644 --- a/2023/day19/README.md +++ b/2023/day19/README.md @@ -36,4 +36,4 @@ _hints:_ You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. Happy Learning :) -[← Previous Day](../day18/tasks.md) | [Next Day →](../day20/tasks.md) +[← Previous Day](../day18/README.md) | [Next Day →](../day20/README.md) diff --git a/2023/day20/README.md b/2023/day20/README.md index f25709ca0d..e9c4b59ba9 100644 --- a/2023/day20/README.md +++ b/2023/day20/README.md @@ -13,4 +13,4 @@ Post it on Linkedin and Spread the knowledge.😃 **Happy Learning :)** -[← Previous Day](../day19/tasks.md) | [Next Day →](../day21/tasks.md) +[← Previous Day](../day19/README.md) | [Next Day →](../day21/README.md) diff --git a/2023/day21/README.md b/2023/day21/README.md index 6381a5ea00..efb2cfc646 100644 --- a/2023/day21/README.md +++ b/2023/day21/README.md @@ -37,4 +37,4 @@ _Write a Blog and share it on LinkedIn._ **Happy Learning :)** -[← Previous Day](../day20/tasks.md) | [Next Day →](../day22/tasks.md) +[← Previous Day](../day20/README.md) | [Next Day →](../day22/README.md) diff --git a/2023/day22/README.md b/2023/day22/README.md index dceba195ca..5117b18ce1 100644 --- a/2023/day22/README.md +++ b/2023/day22/README.md @@ -27,4 +27,4 @@ Hint: Use link for [Article](https://www.geeksforgeeks.org/what-is-jenkins) Don't forget to post your progress on Linkedin. Till then Happy learning :) -[← Previous Day](../day21/tasks.md) | [Next Day →](../day23/tasks.md) +[← Previous Day](../day21/README.md) | [Next Day →](../day23/README.md) diff --git a/2023/day23/README.md b/2023/day23/README.md index 974eb63d24..1bef06c7ce 100644 --- a/2023/day23/README.md +++ b/2023/day23/README.md @@ -37,4 +37,4 @@ You can Post on LinkedIn and let us know what you have learned from this task by Happy Learning:) -[← Previous Day](../day22/tasks.md) | [Next Day →](../day24/tasks.md) +[← Previous Day](../day22/README.md) | [Next Day →](../day24/README.md) diff --git a/2023/day24/README.md b/2023/day24/README.md index ba88455e7a..9b638e61dd 100644 --- a/2023/day24/README.md +++ b/2023/day24/README.md @@ -26,4 +26,4 @@ You can Post on LinkedIn and let us know what you have learned from this task by Happy Learning:) -[← Previous Day](../day23/tasks.md) | [Next Day →](../day25/tasks.md) +[← Previous Day](../day23/README.md) | [Next Day →](../day25/README.md) diff --git a/2023/day25/README.md b/2023/day25/README.md index 00222881cb..289f7e0dad 100644 --- a/2023/day25/README.md +++ b/2023/day25/README.md @@ -28,4 +28,4 @@ You can Post on LinkedIn and let us know what you have learned from this task by Happy Learning:) -[← Previous Day](../day24/tasks.md) | [Next Day →](../day26/tasks.md) +[← Previous Day](../day24/README.md) | [Next Day →](../day26/README.md) diff --git a/2023/day26/README.md b/2023/day26/README.md index 6ca86a92eb..b0d65accb6 100644 --- a/2023/day26/README.md +++ b/2023/day26/README.md @@ -56,4 +56,4 @@ You can post your progress on LinkedIn and let us know what you have learned fro Happy Learning:) -[← Previous Day](../day25/tasks.md) | [Next Day →](../day27/tasks.md) +[← Previous Day](../day25/README.md) | [Next Day →](../day27/README.md) diff --git a/2023/day27/README.md b/2023/day27/README.md index 9fa425c8e0..277a2db069 100644 --- a/2023/day27/README.md +++ b/2023/day27/README.md @@ -40,4 +40,4 @@ Let me know how are feeling after 4 weeks of DevOps Learnings, Happy Learning:) -[← Previous Day](../day26/tasks.md) | [Next Day →](../day28/tasks.md) +[← Previous Day](../day26/README.md) | [Next Day →](../day28/README.md) diff --git a/2023/day28/README.md b/2023/day28/README.md index 4abb2a795d..1c388c0d38 100644 --- a/2023/day28/README.md +++ b/2023/day28/README.md @@ -46,4 +46,4 @@ Let me know how are feeling after 4 weeks of DevOps Learning. Happy Learning:) -[← Previous Day](../day27/tasks.md) | [Next Day →](../day29/tasks.md) +[← Previous Day](../day27/README.md) | [Next Day →](../day29/README.md) diff --git a/2023/day29/README.md b/2023/day29/README.md index 189e301847..6563b7637e 100644 --- a/2023/day29/README.md +++ b/2023/day29/README.md @@ -30,4 +30,4 @@ Write a Blog and share it on LinkedIn. _Happy Learning :)_ -[← Previous Day](../day28/tasks.md) | [Next Day →](../day30/tasks.md) +[← Previous Day](../day28/README.md) | [Next Day →](../day30/README.md) diff --git a/2023/day30/README.md b/2023/day30/README.md index 39141b0b4d..af4d37aa2f 100644 --- a/2023/day30/README.md +++ b/2023/day30/README.md @@ -26,4 +26,4 @@ Kubernetes architecture is important, so make sure you spend a day understanding _Happy Learning :)_ -[← Previous Day](../day29/tasks.md) | [Next Day →](../day31/tasks.md) +[← Previous Day](../day29/README.md) | [Next Day →](../day31/README.md) diff --git a/2023/day31/README.md b/2023/day31/README.md index f538bc319f..5b2a6b79e5 100644 --- a/2023/day31/README.md +++ b/2023/day31/README.md @@ -62,4 +62,4 @@ We are suggesting you make an nginx pod, but you can always show your creativity _Happy Learning :)_ -[← Previous Day](../day30/tasks.md) | [Next Day →](../day32/tasks.md) +[← Previous Day](../day30/README.md) | [Next Day →](../day32/README.md) diff --git a/2023/day32/README.md b/2023/day32/README.md index 9067b11713..eb2ee9c304 100644 --- a/2023/day32/README.md +++ b/2023/day32/README.md @@ -24,4 +24,4 @@ Let's make your resume shine with one more project ;) Happy Learning :) -[← Previous Day](../day31/tasks.md) | [Next Day →](../day33/tasks.md) +[← Previous Day](../day31/README.md) | [Next Day →](../day33/README.md) diff --git a/2023/day33/README.md b/2023/day33/README.md index 7e27ffc367..984842c527 100644 --- a/2023/day33/README.md +++ b/2023/day33/README.md @@ -31,4 +31,4 @@ Keep growing your Kubernetes knowledge💥🙌 Happy Learning! :) -[← Previous Day](../day32/tasks.md) | [Next Day →](../day34/tasks.md) +[← Previous Day](../day32/README.md) | [Next Day →](../day34/README.md) diff --git a/2023/day34/README.md b/2023/day34/README.md index 0fec921099..9753f7ff1f 100644 --- a/2023/day34/README.md +++ b/2023/day34/README.md @@ -33,4 +33,4 @@ Need help with Services in Kubernetes? Check out the Kubernetes [documentation]( Happy Learning :) -[← Previous Day](../day33/tasks.md) | [Next Day →](../day35/tasks.md) +[← Previous Day](../day33/README.md) | [Next Day →](../day35/README.md) diff --git a/2023/day35/README.md b/2023/day35/README.md index 5ea4436eb3..160e0030b2 100644 --- a/2023/day35/README.md +++ b/2023/day35/README.md @@ -34,4 +34,4 @@ Need help with ConfigMaps and Secrets? Check out this [video](https://youtu.be/F Keep learning and expanding your knowledge of Kubernetes💥🙌 -[← Previous Day](../day34/tasks.md) | [Next Day →](../day36/tasks.md) +[← Previous Day](../day34/README.md) | [Next Day →](../day36/README.md) diff --git a/2023/day36/README.md b/2023/day36/README.md index 5f69138d9e..2079e66d65 100644 --- a/2023/day36/README.md +++ b/2023/day36/README.md @@ -48,4 +48,4 @@ Keep up the excellent work🙌💥 Happy Learning :) -[← Previous Day](../day35/tasks.md) | [Next Day →](../day37/tasks.md) +[← Previous Day](../day35/README.md) | [Next Day →](../day37/README.md) diff --git a/2023/day37/README.md b/2023/day37/README.md index cdc3cf10bd..1300e335ae 100644 --- a/2023/day37/README.md +++ b/2023/day37/README.md @@ -40,4 +40,4 @@ _Write a Blog and share it on LinkedIn._ **_Happy Learning :)_** -[← Previous Day](../day36/tasks.md) | [Next Day →](../day38/tasks.md) +[← Previous Day](../day36/README.md) | [Next Day →](../day38/README.md) diff --git a/2023/day38/README.md b/2023/day38/README.md index 0f87273d4a..8f51187e87 100644 --- a/2023/day38/README.md +++ b/2023/day38/README.md @@ -27,4 +27,4 @@ In this task you need to prepare a devops team of avengers. Create 3 IAM users o Post your progress on Linkedin. Till then Happy Learning :) -[← Previous Day](../day37/tasks.md) | [Next Day →](../day39/tasks.md) +[← Previous Day](../day37/README.md) | [Next Day →](../day39/README.md) diff --git a/2023/day39/README.md b/2023/day39/README.md index fe65c33bd3..9a7e3e934f 100644 --- a/2023/day39/README.md +++ b/2023/day39/README.md @@ -38,4 +38,4 @@ Get to know IAM more deeply🏊[Click Here!!](https://www.youtube.com/watch?v=OR Post your progress on Linkedin. Till then Happy Learning :) -[← Previous Day](../day38/tasks.md) | [Next Day →](../day40/tasks.md) +[← Previous Day](../day38/README.md) | [Next Day →](../day40/README.md) diff --git a/2023/day40/README.md b/2023/day40/README.md index d9ed7ad768..ce2dbcfda3 100644 --- a/2023/day40/README.md +++ b/2023/day40/README.md @@ -46,4 +46,4 @@ Post your progress on Linkedin. Happy Learning :) -[← Previous Day](../day39/tasks.md) | [Next Day →](../day41/tasks.md) +[← Previous Day](../day39/README.md) | [Next Day →](../day41/README.md) diff --git a/2023/day41/README.md b/2023/day41/README.md index d504668d72..0a1488f068 100644 --- a/2023/day41/README.md +++ b/2023/day41/README.md @@ -50,4 +50,4 @@ Don't forget to share your progress on LinkedIn and have a great day🙌💥 Happy Learning! 😃 -[← Previous Day](../day40/tasks.md) | [Next Day →](../day42/tasks.md) +[← Previous Day](../day40/README.md) | [Next Day →](../day42/README.md) diff --git a/2023/day42/README.md b/2023/day42/README.md index 5baa958002..5f8a37ff09 100644 --- a/2023/day42/README.md +++ b/2023/day42/README.md @@ -25,4 +25,4 @@ Let me know if you have any issues while doing the task. Happy Learning :) -[← Previous Day](../day41/tasks.md) | [Next Day →](../day43/tasks.md) +[← Previous Day](../day41/README.md) | [Next Day →](../day43/README.md) diff --git a/2023/day43/README.md b/2023/day43/README.md index 96128f280e..b838d01544 100644 --- a/2023/day43/README.md +++ b/2023/day43/README.md @@ -29,4 +29,4 @@ Let me know if you have any questions or face any issues while doing the tasks. Happy Learning :) -[← Previous Day](../day42/tasks.md) | [Next Day →](../day44/tasks.md) +[← Previous Day](../day42/README.md) | [Next Day →](../day44/README.md) diff --git a/2023/day44/README.md b/2023/day44/README.md index f46feef3fb..c836c86b29 100644 --- a/2023/day44/README.md +++ b/2023/day44/README.md @@ -20,4 +20,4 @@ Watch [this video](https://youtu.be/MrA6Rk1Y82E) for reference. Happy Learning -[← Previous Day](../day43/tasks.md) | [Next Day →](../day45/tasks.md) +[← Previous Day](../day43/README.md) | [Next Day →](../day45/README.md) diff --git a/2023/day45/README.md b/2023/day45/README.md index b26150506d..c2c11a93b2 100644 --- a/2023/day45/README.md +++ b/2023/day45/README.md @@ -15,4 +15,4 @@ To configure this WordPress site, you will create the following resources in AWS Read [this](https://aws.amazon.com/getting-started/hands-on/deploy-wordpress-with-amazon-rds/) for a detailed explanation Happy Learning :) -[← Previous Day](../day44/tasks.md) | [Next Day →](../day46/tasks.md) +[← Previous Day](../day44/README.md) | [Next Day →](../day46/README.md) diff --git a/2023/day46/README.md b/2023/day46/README.md index 54f3fcecfc..a44ae2f101 100644 --- a/2023/day46/README.md +++ b/2023/day46/README.md @@ -32,4 +32,4 @@ Keep growing your AWS knowledge💥🙌 Happy Learning! :) -[← Previous Day](../day45/tasks.md) | [Next Day →](../day47/tasks.md) +[← Previous Day](../day45/README.md) | [Next Day →](../day47/README.md) diff --git a/2023/day47/README.md b/2023/day47/README.md index 1d6ede2027..c565848367 100644 --- a/2023/day47/README.md +++ b/2023/day47/README.md @@ -18,4 +18,4 @@ We hope that these tasks will give you hands-on experience with aws services and Happy Learning :) -[← Previous Day](../day46/tasks.md) | [Next Day →](../day48/tasks.md) +[← Previous Day](../day46/README.md) | [Next Day →](../day48/README.md) diff --git a/2023/day48/README.md b/2023/day48/README.md index 9ae50159dd..26a953e8fc 100644 --- a/2023/day48/README.md +++ b/2023/day48/README.md @@ -37,4 +37,4 @@ In summary, EKS is a good choice if you want to use Kubernetes to manage your co Set up ECS (Elastic Container Service) by setting up Nginx on ECS. -[← Previous Day](../day47/tasks.md) | [Next Day →](../day49/tasks.md) +[← Previous Day](../day47/README.md) | [Next Day →](../day49/README.md) diff --git a/2023/day49/README.md b/2023/day49/README.md index 860d64c906..ecc603177a 100644 --- a/2023/day49/README.md +++ b/2023/day49/README.md @@ -22,4 +22,4 @@ As you people have asked to put more interview based questions as part of Daily Let's share your answer on LinkedIn in best possible way thinking you are in a interview table. Happy Learning !! :) -[← Previous Day](../day48/tasks.md) | [Next Day →](../day50/tasks.md) +[← Previous Day](../day48/README.md) | [Next Day →](../day50/README.md) diff --git a/2023/day50/README.md b/2023/day50/README.md index 38996774a6..0340a36b09 100644 --- a/2023/day50/README.md +++ b/2023/day50/README.md @@ -27,4 +27,4 @@ For more details watch [this](https://youtu.be/p5i3cMCQ760) video. Happy Learning :) -[← Previous Day](../day49/tasks.md) | [Next Day →](../day51/tasks.md) +[← Previous Day](../day49/README.md) | [Next Day →](../day51/README.md) diff --git a/2023/day51/README.md b/2023/day51/README.md index aebdcdf5a4..01f0b70262 100644 --- a/2023/day51/README.md +++ b/2023/day51/README.md @@ -27,4 +27,4 @@ For more details watch [this](https://youtu.be/p5i3cMCQ760) video. Happy Learning :) -[← Previous Day](../day50/tasks.md) | [Next Day →](../day52/tasks.md) +[← Previous Day](../day50/README.md) | [Next Day →](../day52/README.md) diff --git a/2023/day52/README.md b/2023/day52/README.md index 718295f816..52dffd62ae 100644 --- a/2023/day52/README.md +++ b/2023/day52/README.md @@ -28,4 +28,4 @@ For more details watch [this](https://youtu.be/IUF-pfbYGvg) video. Happy Learning :) -[← Previous Day](../day51/tasks.md) | [Next Day →](../day53/tasks.md) +[← Previous Day](../day51/README.md) | [Next Day →](../day53/README.md) diff --git a/2023/day53/README.md b/2023/day53/README.md index d280debec7..2139f0cb5d 100644 --- a/2023/day53/README.md +++ b/2023/day53/README.md @@ -18,4 +18,4 @@ For more details watch [this](https://youtu.be/IUF-pfbYGvg) video. Happy Learning :) -[← Previous Day](../day52/tasks.md) | [Next Day →](../day54/tasks.md) +[← Previous Day](../day52/README.md) | [Next Day →](../day54/README.md) diff --git a/2023/day54/README.md b/2023/day54/README.md index 2e11602666..f134a32bf1 100644 --- a/2023/day54/README.md +++ b/2023/day54/README.md @@ -16,4 +16,4 @@ Write a blog on this topic in the most creative way and post it on linkedIn :) happy learning... -[← Previous Day](../day53/tasks.md) | [Next Day →](../day55/tasks.md) +[← Previous Day](../day53/README.md) | [Next Day →](../day55/README.md) diff --git a/2023/day55/README.md b/2023/day55/README.md index ae5c1bd7c9..5df87b107a 100644 --- a/2023/day55/README.md +++ b/2023/day55/README.md @@ -25,4 +25,4 @@ Write a blog on this topic with screenshots in the most creative way and post it happy learning... -[← Previous Day](../day54/tasks.md) | [Next Day →](../day56/tasks.md) +[← Previous Day](../day54/README.md) | [Next Day →](../day56/README.md) diff --git a/2023/day56/README.md b/2023/day56/README.md index 6c3396f0b8..853372bae2 100644 --- a/2023/day56/README.md +++ b/2023/day56/README.md @@ -15,4 +15,4 @@ Ansible ad hoc commands come handy when you want to perform a quick task. happy Learning :) -[← Previous Day](../day55/tasks.md) | [Next Day →](../day57/tasks.md) +[← Previous Day](../day55/README.md) | [Next Day →](../day57/README.md) diff --git a/2023/day57/README.md b/2023/day57/README.md index 1264d75ef3..4866eecf58 100644 --- a/2023/day57/README.md +++ b/2023/day57/README.md @@ -10,4 +10,4 @@ Let's make it fun now, by using a video explanation for Ansible. happy Learning :) -[← Previous Day](../day56/tasks.md) | [Next Day →](../day58/tasks.md) +[← Previous Day](../day56/README.md) | [Next Day →](../day58/README.md) diff --git a/2023/day58/README.md b/2023/day58/README.md index d0f04dc665..f8facae4b7 100644 --- a/2023/day58/README.md +++ b/2023/day58/README.md @@ -20,4 +20,4 @@ Let me or anyone in the community know if you face any challenges happy Learning :) -[← Previous Day](../day57/tasks.md) | [Next Day →](../day59/tasks.md) +[← Previous Day](../day57/README.md) | [Next Day →](../day59/README.md) diff --git a/2023/day59/README.md b/2023/day59/README.md index 3dbae2b85e..f8bf4d0908 100644 --- a/2023/day59/README.md +++ b/2023/day59/README.md @@ -23,4 +23,4 @@ Let me or anyone in the community know if you face any challenges happy Learning :) -[← Previous Day](../day58/tasks.md) | [Next Day →](../day60/tasks.md) +[← Previous Day](../day58/README.md) | [Next Day →](../day60/README.md) diff --git a/2023/day60/README.md b/2023/day60/README.md index c8301a16df..ecae296195 100644 --- a/2023/day60/README.md +++ b/2023/day60/README.md @@ -28,4 +28,4 @@ We Hope this tasks will help you understand how to write a basic Terraform confi Don’t forget to post in on LinkedIn. Happy Learning:) -[← Previous Day](../day59/tasks.md) | [Next Day →](../day61/tasks.md) +[← Previous Day](../day59/README.md) | [Next Day →](../day61/README.md) diff --git a/2023/day61/README.md b/2023/day61/README.md index 59dc49d4bf..9d518b70db 100644 --- a/2023/day61/README.md +++ b/2023/day61/README.md @@ -34,4 +34,4 @@ Want a Free video Course for terraform? Click [here](https://bit.ly/tws-terrafor Don't forget to share your learnings on Linkedin ! Happy Learning :) -[← Previous Day](../day60/tasks.md) | [Next Day →](../day62/tasks.md) +[← Previous Day](../day60/README.md) | [Next Day →](../day62/README.md) diff --git a/2023/day62/README.md b/2023/day62/README.md index b80639d543..76f61b708a 100644 --- a/2023/day62/README.md +++ b/2023/day62/README.md @@ -76,4 +76,4 @@ I can imagine, Terraform can be tricky, so best to use a Free video Course for t Happy Learning :) -[← Previous Day](../day61/tasks.md) | [Next Day →](../day63/tasks.md) +[← Previous Day](../day61/README.md) | [Next Day →](../day63/README.md) diff --git a/2023/day63/README.md b/2023/day63/README.md index 415e6526e7..e4338fb906 100644 --- a/2023/day63/README.md +++ b/2023/day63/README.md @@ -59,4 +59,4 @@ I can imagine, Terraform can be tricky, so best to use a Free video Course for t Happy Learning :) -[← Previous Day](../day62/tasks.md) | [Next Day →](../day64/tasks.md) +[← Previous Day](../day62/README.md) | [Next Day →](../day64/README.md) diff --git a/2023/day64/README.md b/2023/day64/README.md index 9b27c12be6..d30e1048d9 100644 --- a/2023/day64/README.md +++ b/2023/day64/README.md @@ -64,4 +64,4 @@ I can imagine, Terraform can be tricky, so best to use a Free video Course for t Happy Learning :) -[← Previous Day](../day63/tasks.md) | [Next Day →](../day65/tasks.md) +[← Previous Day](../day63/README.md) | [Next Day →](../day65/README.md) diff --git a/2023/day65/README.md b/2023/day65/README.md index 04da60caa8..904c6c1158 100644 --- a/2023/day65/README.md +++ b/2023/day65/README.md @@ -64,4 +64,4 @@ Run terraform apply to create the EC2 instance. Happy Terraforming! -[← Previous Day](../day64/tasks.md) | [Next Day →](../day66/tasks.md) +[← Previous Day](../day64/README.md) | [Next Day →](../day66/README.md) diff --git a/2023/day66/README.md b/2023/day66/README.md index ed00f65bee..630837a5ff 100644 --- a/2023/day66/README.md +++ b/2023/day66/README.md @@ -23,4 +23,4 @@ In the previous tasks, you have learned about the basics of Terraform, its confi Happy Terraforming:) -[← Previous Day](../day65/tasks.md) | [Next Day →](../day67/tasks.md) +[← Previous Day](../day65/README.md) | [Next Day →](../day67/README.md) diff --git a/2023/day67/README.md b/2023/day67/README.md index de629237ec..62e6f35476 100644 --- a/2023/day67/README.md +++ b/2023/day67/README.md @@ -19,4 +19,4 @@ In this task, you will learn how to create and manage S3 buckets in AWS. Good luck and happy learning! -[← Previous Day](../day66/tasks.md) | [Next Day →](../day68/tasks.md) +[← Previous Day](../day66/README.md) | [Next Day →](../day68/README.md) diff --git a/2023/day68/README.md b/2023/day68/README.md index 713ef11256..4185d8a5dd 100644 --- a/2023/day68/README.md +++ b/2023/day68/README.md @@ -63,4 +63,4 @@ Congratulations🎊🎉 You have successfully scaled your infrastructure with Te Happy Learning :) -[← Previous Day](../day67/tasks.md) | [Next Day →](../day69/tasks.md) +[← Previous Day](../day67/README.md) | [Next Day →](../day69/README.md) diff --git a/2023/day69/README.md b/2023/day69/README.md index d180d258c8..570803dbdd 100644 --- a/2023/day69/README.md +++ b/2023/day69/README.md @@ -179,4 +179,4 @@ Name = "Server ${each.key}" Happy learning :) -[← Previous Day](../day68/tasks.md) | [Next Day →](../day70/tasks.md) +[← Previous Day](../day68/README.md) | [Next Day →](../day70/README.md) diff --git a/2023/day70/README.md b/2023/day70/README.md index a208e10eb3..4a42230590 100644 --- a/2023/day70/README.md +++ b/2023/day70/README.md @@ -77,4 +77,4 @@ You all are doing great, and you have come so far. Well Done Everyone🎉 Thode mehnat aur krni hai bas to lge rho tab tak.....Happy learning :) -[← Previous Day](../day69/tasks.md) | [Next Day →](../day71/tasks.md) +[← Previous Day](../day69/README.md) | [Next Day →](../day71/README.md) diff --git a/2023/day71/README.md b/2023/day71/README.md index ec966142ed..7bcb7bb3e1 100644 --- a/2023/day71/README.md +++ b/2023/day71/README.md @@ -38,4 +38,4 @@ terraform destroy Waiting for your responses😉.....Till then Happy learning :) -[← Previous Day](../day70/tasks.md) | [Next Day →](../day72/tasks.md) +[← Previous Day](../day70/README.md) | [Next Day →](../day72/README.md) diff --git a/2023/day72/README.md b/2023/day72/README.md index 0a71472473..a283b10e39 100644 --- a/2023/day72/README.md +++ b/2023/day72/README.md @@ -13,4 +13,4 @@ Hello Learners , you guys are doing really a good job. You will not be there 24\ --- -[← Previous Day](../day71/tasks.md) | [Next Day →](../day73/tasks.md) +[← Previous Day](../day71/README.md) | [Next Day →](../day73/README.md) diff --git a/2023/day73/README.md b/2023/day73/README.md index a1278cb1da..a1af9d7dc9 100644 --- a/2023/day73/README.md +++ b/2023/day73/README.md @@ -13,4 +13,4 @@ Task: Ref: https://www.linkedin.com/posts/chetanrakhra_devops-project-share-activity-7042518379030556672-ZZA-?utm_source=share&utm_medium=member_desktop -[← Previous Day](../day72/tasks.md) | [Next Day →](../day74/tasks.md) +[← Previous Day](../day72/README.md) | [Next Day →](../day74/README.md) diff --git a/2023/day74/README.md b/2023/day74/README.md index aad4f459fd..2877eeebd4 100644 --- a/2023/day74/README.md +++ b/2023/day74/README.md @@ -16,4 +16,4 @@ Don't forget to share this amazing work over LinkedIn and Tag us. ## Happy Learning :) -[← Previous Day](../day73/tasks.md) | [Next Day →](../day75/tasks.md) +[← Previous Day](../day73/README.md) | [Next Day →](../day75/README.md) diff --git a/2023/day75/README.md b/2023/day75/README.md index b3cb4f2bb2..d7e5bcf1b5 100644 --- a/2023/day75/README.md +++ b/2023/day75/README.md @@ -8,7 +8,7 @@ Today, make it little bit more complex but interesting 😍 and let's add one mo ## Task: -- Install _Docker_ and start docker service on a Linux EC2 through [USER DATA](https://github.com/LondheShubham153/90DaysOfDevOps/blob/0999394e87192863b5c190a90896249c31ce31af/2023/day39/tasks.md) . +- Install _Docker_ and start docker service on a Linux EC2 through [USER DATA](https://github.com/LondheShubham153/90DaysOfDevOps/blob/0999394e87192863b5c190a90896249c31ce31af/2023/day39/README.md) . - Create 2 Docker containers and run any basic application on those containers (A simple todo app will work). - Now intregrate the docker containers and share the real time logs with Grafana (Your Instance should be connected to Grafana and Docker plugin should be enabled on grafana). - Check the logs or docker container name on Grafana UI. @@ -27,4 +27,4 @@ Don't forget to share this amazing work over LinkedIn and Tag us. ## Happy Learning :) -[← Previous Day](../day74/tasks.md) | [Next Day →](../day76/tasks.md) +[← Previous Day](../day74/README.md) | [Next Day →](../day76/README.md) diff --git a/2023/day76/README.md b/2023/day76/README.md index 984bc8cfad..7c3fbb0bd1 100644 --- a/2023/day76/README.md +++ b/2023/day76/README.md @@ -30,4 +30,4 @@ Read [this](https://grafana.com/tutorials/grafana-fundamentals/) in case you hav Do share some amazing Dashboards with the community -[← Previous Day](../day75/tasks.md) | [Next Day →](../day77/tasks.md) +[← Previous Day](../day75/README.md) | [Next Day →](../day77/README.md) diff --git a/2023/day77/README.md b/2023/day77/README.md index fb7cbeb045..7acf545be9 100644 --- a/2023/day77/README.md +++ b/2023/day77/README.md @@ -11,4 +11,4 @@ Grafana Alerting is available for Grafana OSS, Grafana Enterprise, or Grafana Cl Check out [this blog](https://grafana.com/docs/grafana/latest/alerting/) for more details -[← Previous Day](../day76/tasks.md) | [Next Day →](../day78/tasks.md) +[← Previous Day](../day76/README.md) | [Next Day →](../day78/README.md) diff --git a/2023/day78/README.md b/2023/day78/README.md index 4e6cd91b04..631894de55 100644 --- a/2023/day78/README.md +++ b/2023/day78/README.md @@ -11,4 +11,4 @@ Task - 01 For Reference: https://www.linkedin.com/posts/chetanrakhra_devops-project-share-activity-7044695663913148416-LfvD?utm_source=share&utm_medium=member_desktop -[← Previous Day](../day77/tasks.md) | [Next Day →](../day79/tasks.md) +[← Previous Day](../day77/README.md) | [Next Day →](../day79/README.md) diff --git a/2023/day79/README.md b/2023/day79/README.md index ffd702b655..4eb87c4c49 100644 --- a/2023/day79/README.md +++ b/2023/day79/README.md @@ -17,4 +17,4 @@ Tasks: Ref: https://www.devopsschool.com/blog/top-50-prometheus-interview-questions-and-answers/ -[← Previous Day](../day78/tasks.md) | [Next Day →](../day80/tasks.md) +[← Previous Day](../day78/README.md) | [Next Day →](../day80/README.md) diff --git a/2023/day80/README.md b/2023/day80/README.md index 9524f97e09..edbc3ec561 100644 --- a/2023/day80/README.md +++ b/2023/day80/README.md @@ -12,4 +12,4 @@ Do the hands-on Project, read [this](https://www.linkedin.com/posts/chetanrakhra Happy Learning :) -[← Previous Day](../day79/tasks.md) | [Next Day →](../day81/tasks.md) +[← Previous Day](../day79/README.md) | [Next Day →](../day81/README.md) diff --git a/2023/day81/README.md b/2023/day81/README.md index 62c459fd51..a10675fa1c 100644 --- a/2023/day81/README.md +++ b/2023/day81/README.md @@ -12,4 +12,4 @@ Do the hands-on Project, read [this](https://www.linkedin.com/posts/chetanrakhra Happy Learning :) -[← Previous Day](../day80/tasks.md) | [Next Day →](../day82/tasks.md) +[← Previous Day](../day80/README.md) | [Next Day →](../day82/README.md) diff --git a/2023/day82/README.md b/2023/day82/README.md index b1b1c4d5bb..a17acccd92 100644 --- a/2023/day82/README.md +++ b/2023/day82/README.md @@ -12,4 +12,4 @@ Do the hands-on Project, read [this](https://www.linkedin.com/posts/chetanrakhra Happy Learning :) -[← Previous Day](../day81/tasks.md) | [Next Day →](../day83/tasks.md) +[← Previous Day](../day81/README.md) | [Next Day →](../day83/README.md) diff --git a/2023/day83/README.md b/2023/day83/README.md index cf7db513a5..dc80aefc33 100644 --- a/2023/day83/README.md +++ b/2023/day83/README.md @@ -12,4 +12,4 @@ Do the hands-on Project, read [this](https://www.linkedin.com/posts/chetanrakhra Happy Learning :) -[← Previous Day](../day82/tasks.md) | [Next Day →](../day84/tasks.md) +[← Previous Day](../day82/README.md) | [Next Day →](../day84/README.md) diff --git a/2023/day84/README.md b/2023/day84/README.md index 47a534461f..be78b29c8b 100644 --- a/2023/day84/README.md +++ b/2023/day84/README.md @@ -12,4 +12,4 @@ Get a netflix clone form [GitHub](https://github.com/devandres-tech/Netflix-Clon Happy Learning :) -[← Previous Day](../day83/tasks.md) | [Next Day →](../day85/tasks.md) +[← Previous Day](../day83/README.md) | [Next Day →](../day85/README.md) diff --git a/2023/day85/README.md b/2023/day85/README.md index af09a54c05..0cd64c996b 100644 --- a/2023/day85/README.md +++ b/2023/day85/README.md @@ -23,4 +23,4 @@ Read More about the tech stack [here](https://faun.pub/what-is-amazon-ecs-and-ec Happy Learning :) -[← Previous Day](../day84/tasks.md) | [Next Day →](../day86/tasks.md) +[← Previous Day](../day84/README.md) | [Next Day →](../day86/README.md) diff --git a/2023/day86/README.md b/2023/day86/README.md index 722ad45f98..c8f809df7d 100644 --- a/2023/day86/README.md +++ b/2023/day86/README.md @@ -21,4 +21,4 @@ Git Hub actions allows you to perform CICD with GitHub Repository integrated. Happy Learning :) -[← Previous Day](../day85/tasks.md) | [Next Day →](../day87/tasks.md) +[← Previous Day](../day85/README.md) | [Next Day →](../day87/README.md) diff --git a/2023/day87/README.md b/2023/day87/README.md index 04db8dd932..fa123ea638 100644 --- a/2023/day87/README.md +++ b/2023/day87/README.md @@ -21,4 +21,4 @@ Git Hub actions allows you to perform CICD with GitHub Repository integrated. Happy Learning :) -[← Previous Day](../day86/tasks.md) | [Next Day →](../day88/tasks.md) +[← Previous Day](../day86/README.md) | [Next Day →](../day88/README.md) diff --git a/2023/day88/README.md b/2023/day88/README.md index c1dd8f6105..3668934da1 100644 --- a/2023/day88/README.md +++ b/2023/day88/README.md @@ -20,4 +20,4 @@ Kubernetes Cluster helps in Auto-scaling and Auto-healing of your application. Happy Learning :) -[← Previous Day](../day87/tasks.md) | [Next Day →](../day89/tasks.md) +[← Previous Day](../day87/README.md) | [Next Day →](../day89/README.md) diff --git a/2023/day89/README.md b/2023/day89/README.md index 4ae3b711c1..45ee46628d 100644 --- a/2023/day89/README.md +++ b/2023/day89/README.md @@ -16,4 +16,4 @@ This is a AWS Mini Project that will teach you AWS, S3, EC2, S3FS. Happy Learning :) -[← Previous Day](../day88/tasks.md) | [Next Day →](../day90/tasks.md) +[← Previous Day](../day88/README.md) | [Next Day →](../day90/README.md) diff --git a/2023/day90/README.md b/2023/day90/README.md index 8e31513d21..d28985c060 100644 --- a/2023/day90/README.md +++ b/2023/day90/README.md @@ -26,4 +26,4 @@ Keep coding, automating, deploying, and innovating! 🎈 With gratitude, @TrainWithShubham -[← Previous Day](../day89/tasks.md) +[← Previous Day](../day89/README.md) From d493c0248770c1484435c2be92b4bbfb0501319a Mon Sep 17 00:00:00 2001 From: Parag Pallav Singh Date: Sat, 26 Aug 2023 22:21:20 +0530 Subject: [PATCH 170/394] update day 75 broken link --- 2023/day75/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2023/day75/README.md b/2023/day75/README.md index d7e5bcf1b5..3c75d41caa 100644 --- a/2023/day75/README.md +++ b/2023/day75/README.md @@ -8,7 +8,7 @@ Today, make it little bit more complex but interesting 😍 and let's add one mo ## Task: -- Install _Docker_ and start docker service on a Linux EC2 through [USER DATA](https://github.com/LondheShubham153/90DaysOfDevOps/blob/0999394e87192863b5c190a90896249c31ce31af/2023/day39/README.md) . +- Install _Docker_ and start docker service on a Linux EC2 through [USER DATA](../day39/README.md) . - Create 2 Docker containers and run any basic application on those containers (A simple todo app will work). - Now intregrate the docker containers and share the real time logs with Grafana (Your Instance should be connected to Grafana and Docker plugin should be enabled on grafana). - Check the logs or docker container name on Grafana UI. From 88f00b9ad0fe67f04f4995f447b5c370ab6c8197 Mon Sep 17 00:00:00 2001 From: Prajwal Date: Sun, 27 Aug 2023 20:27:17 +0530 Subject: [PATCH 171/394] Fixed updated toc links to redirect --- TOC.md | 150 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 75 insertions(+), 75 deletions(-) diff --git a/TOC.md b/TOC.md index 6ab4598c88..604c12e834 100644 --- a/TOC.md +++ b/TOC.md @@ -8,129 +8,129 @@ Below is the index of the incredible DevOps journey that awaits you: - Description: Kickstart your 90-day journey with the foundational principles of DevOps. Dive deep into the Linux ecosystem, exploring commands, shell scripting, and file permissions. - Topics Covered: - - [Understanding and defining DevOps](./2023/day01/tasks.md) - - [Getting hands-on with basic to advanced Linux commands](./2023/day02/tasks.md) - - [Grasping the concepts of Linux Shell Scripting](./2023/day04/tasks.md) - - [Exploring advanced shell scripting techniques with practical tasks.](./2023/day05/tasks.md) - - [Deep dive into file permissions and Access Control Lists (ACLs)](./2023/day06/tasks.md) - - [Insights into package managers in Linux and understanding systemctl and systemd](./2023/day07/tasks.md) + - [Understanding and defining DevOps](./2023/day01/README.md) + - [Getting hands-on with basic to advanced Linux commands](./2023/day02/README.md) + - [Grasping the concepts of Linux Shell Scripting](./2023/day04/README.md) + - [Exploring advanced shell scripting techniques with practical tasks.](./2023/day05/README.md) + - [Deep dive into file permissions and Access Control Lists (ACLs)](./2023/day06/README.md) + - [Insights into package managers in Linux and understanding systemctl and systemd](./2023/day07/README.md) ### 🚀 [Day 8-12: Mastering Git & GitHub: From Basics to Advanced Techniques](./2023/day08/) - Description: Embark on a comprehensive journey through Git and GitHub, from grasping the fundamental concepts to exploring advanced techniques that are essential for DevOps. - Topics Covered: - - [Introduction and understanding of Git and GitHub.](./2023/day08/tasks.md) - - [Grasping the concept and advantages of Version Control Systems, with a focus on Centralized vs. Distributed.](./2023/day08/tasks.md) - - [Diving deep into the significance, distinctions, and practicalities of Git and GitHub, including setting up repositories and understanding branch differences.](./2023/day09/tasks.md) - - [Exploring advanced Git concepts such as branching, revert, reset, rebase, merge, stash, cherry-pick, and conflict resolution.](./2023/day10/tasks.md) - - [Concluding with celebrations, crafting a Git cheatsheet, and fostering a spirit of continuous learning.](./2023/day12/tasks.md) + - [Introduction and understanding of Git and GitHub.](./2023/day08/README.md) + - [Grasping the concept and advantages of Version Control Systems, with a focus on Centralized vs. Distributed.](./2023/day08/README.md) + - [Diving deep into the significance, distinctions, and practicalities of Git and GitHub, including setting up repositories and understanding branch differences.](./2023/day09/README.md) + - [Exploring advanced Git concepts such as branching, revert, reset, rebase, merge, stash, cherry-pick, and conflict resolution.](./2023/day10/README.md) + - [Concluding with celebrations, crafting a Git cheatsheet, and fostering a spirit of continuous learning.](./2023/day12/README.md) ### 💼 [Day 13-15: Delving into Python Essentials for DevOps](./2023/day13/) - Description: Dive into the world of Python, as this programming language plays a pivotal role in a DevOps engineer's toolkit. Cover the basics, explore diverse data types, understand essential data structures, and leverage Python libraries for DevOps tasks. - Topics Covered: - - [Introduction to Python: its definition, creator, and the extensive libraries and frameworks it offers.](./2023/day13/tasks.md) - - [Understanding Python's data types and structures.](./2023/day14/tasks.md) - - [Utilizing Python libraries for DevOps tasks while emphasizing hands-on work with data structures and file formats.](./2023/day15/tasks.md) + - [Introduction to Python: its definition, creator, and the extensive libraries and frameworks it offers.](./2023/day13/README.md) + - [Understanding Python's data types and structures.](./2023/day14/README.md) + - [Utilizing Python libraries for DevOps tasks while emphasizing hands-on work with data structures and file formats.](./2023/day15/README.md) ### 🐳 [Day 16-21: Deep Dive into Docker for DevOps Engineers](./2023/day16/) - Description: This module immerses DevOps Engineers into the extensive world of Docker. It equips you with the hands-on skills necessary to build, manage, and optimize Docker containers, create Docker projects, understand related concepts, and share your knowledge with the community. - Topics Covered: - - [The essence of Docker and its revolutionary packaging into standardized units known as containers.](./2023/day16/tasks.md) - - [A special project day focused on Dockerfiles – understanding their significance and constructing one for a simple web application.](./2023/day17/tasks.md) - - [Expanding knowledge on Docker Compose, its configuration language YAML, and the magic they bring to multi-container applications.](./2023/day18/tasks.md) - - [Docker’s storage solutions with Docker Volume, understanding its independence and how it can benefit container data management.](./2023/day19/tasks.md) - - [Important interview Questions](./2023/day21/tasks.md) + - [The essence of Docker and its revolutionary packaging into standardized units known as containers.](./2023/day16/README.md) + - [A special project day focused on Dockerfiles – understanding their significance and constructing one for a simple web application.](./2023/day17/README.md) + - [Expanding knowledge on Docker Compose, its configuration language YAML, and the magic they bring to multi-container applications.](./2023/day18/README.md) + - [Docker’s storage solutions with Docker Volume, understanding its independence and how it can benefit container data management.](./2023/day19/README.md) + - [Important interview Questions](./2023/day21/README.md) ### 🛠️ [Day 22-29: Diving into Jenkins: Basics to Advanced](./2023/day22/) - Description: Delve into Jenkins's world, navigating from its foundational concepts to advanced functionalities integral for DevOps. This will empower you to master CI/CD pipelines, understand the anatomy of Jenkins projects, and optimize Jenkins in the DevOps lifecycle. - Topics Covered: - - [Introduction to Jenkins and its significance in the DevOps realm.](./2023/day22/tasks.md) - - [Detailed exploration of Jenkins Freestyle Projects.](./2023/day23/tasks.md) - - [Crafting an end-to-end Jenkins CI/CD project for a Node JS application.](./2023/day24/tasks.md) - - [Jenkins Declarative Pipelines, understanding the distinction between declarative and scripted pipelines.](./2023/day26/tasks.md) - - [Leveraging Docker with Jenkins to enhance CI/CD workflows.](./2023/day27/tasks.md) - - [Jenkins Agents and the orchestration between the master and agent for optimized task execution.](./2023/day28/tasks.md) - - [Jenkins Important interview Questions.](./2023/day29/tasks.md) + - [Introduction to Jenkins and its significance in the DevOps realm.](./2023/day22/README.md) + - [Detailed exploration of Jenkins Freestyle Projects.](./2023/day23/README.md) + - [Crafting an end-to-end Jenkins CI/CD project for a Node JS application.](./2023/day24/README.md) + - [Jenkins Declarative Pipelines, understanding the distinction between declarative and scripted pipelines.](./2023/day26/README.md) + - [Leveraging Docker with Jenkins to enhance CI/CD workflows.](./2023/day27/README.md) + - [Jenkins Agents and the orchestration between the master and agent for optimized task execution.](./2023/day28/README.md) + - [Jenkins Important interview Questions.](./2023/day29/README.md) ### ☸️ [Day 30-37: Kubernetes Mastery: From Overview to Advanced Implementation](./2023/day30/) - Description: Dive deep into Kubernetes, the leading container management platform. Spanning from its foundations and architecture, all the way to advanced configurations, services, and best practices. Equip yourself not only with hands-on skills but also with critical insights and understanding. - Topics Covered: - - [Historical background of Kubernetes, its inspiration from Google's Borg, and its significant role in DevOps.](./2023/day30/tasks.md) - - [Initial setup with launching a Kubernetes Cluster, getting hands-on with minikube, and deploying Nginx.](./2023/day31/tasks.md) - - [Advanced cluster operations, including deployments with features like auto-healing and auto-scaling.](./2023/day32/tasks.md) - - [Working with core Kubernetes concepts like Namespaces, Services, ConfigMaps, Secrets, and Persistent Volumes.](./2023/day33/tasks.md) - - [Mastering ConfigMaps and Secrets in Kubernete](./2023/day35/tasks.md) - - [Important interview questions related to Kubernetes.](./2023/day37/tasks.md) + - [Historical background of Kubernetes, its inspiration from Google's Borg, and its significant role in DevOps.](./2023/day30/README.md) + - [Initial setup with launching a Kubernetes Cluster, getting hands-on with minikube, and deploying Nginx.](./2023/day31/README.md) + - [Advanced cluster operations, including deployments with features like auto-healing and auto-scaling.](./2023/day32/README.md) + - [Working with core Kubernetes concepts like Namespaces, Services, ConfigMaps, Secrets, and Persistent Volumes.](./2023/day33/README.md) + - [Mastering ConfigMaps and Secrets in Kubernete](./2023/day35/README.md) + - [Important interview questions related to Kubernetes.](./2023/day37/README.md) ### ☁️ [Day 38-53: AWS's vast ecosystem and its dominance in the cloud industry.](./2023/day38/) - Description: Dive into Amazon Web Services, starting with the fundamentals and progressing to more complex concepts and tools. Over the course of these days, learn the intricacies of AWS, set up essential services, and work hands-on with CI/CD pipeline concepts. - Topics Covered: - - [Introduction to AWS and its fundamental components.](./2023/day38/tasks.md) - - [Understanding IAM (Identity and Access Management)](./2023/day39/tasks.md) - - [Hands-on with AWS EC2 (Elastic Compute Cloud), including automation and setting up Application Load Balancers.](./2023/day40/tasks.md) - - [Working with AWS-CLI and S3 programmatic access.](./2023/day42/tasks.md) - - [Grasping the RDS (Relational Database Service) and deploying a WordPress website.](./2023/day44/tasks.md) - - [Monitoring and alerting with AWS CloudWatch and SNS.](./2023/day46/tasks.md) - - [Delving into ECS (Elastic Container Service) and preparing for AWS-based interviews.](./2023/day48/tasks.md) - - [Embarking on a 4-day intensive journey to set up a CI/CD pipeline on AWS, incorporating tools such as CodeCommit, CodeBuild, CodeDeploy, CodePipeline, and S3.](./2023/day50/tasks.md) + - [Introduction to AWS and its fundamental components.](./2023/day38/README.md) + - [Understanding IAM (Identity and Access Management)](./2023/day39/README.md) + - [Hands-on with AWS EC2 (Elastic Compute Cloud), including automation and setting up Application Load Balancers.](./2023/day40/README.md) + - [Working with AWS-CLI and S3 programmatic access.](./2023/day42/README.md) + - [Grasping the RDS (Relational Database Service) and deploying a WordPress website.](./2023/day44/README.md) + - [Monitoring and alerting with AWS CloudWatch and SNS.](./2023/day46/README.md) + - [Delving into ECS (Elastic Container Service) and preparing for AWS-based interviews.](./2023/day48/README.md) + - [Embarking on a 4-day intensive journey to set up a CI/CD pipeline on AWS, incorporating tools such as CodeCommit, CodeBuild, CodeDeploy, CodePipeline, and S3.](./2023/day50/README.md) ### 🛠️ [Day 54-59: Journey Through Ansible: Configuration Management & Automation](./2023/day54/) - Description: Venture into the realm of Infrastructure as Code (IaC) and Configuration Management with a detailed focus on Ansible. From basic setups to complex playbooks and hands-on projects, master the nuances of Ansible through step-by-step tasks and comprehensive modules. - Topics Covered: - - [Introduction to Infrastructure as Code and its significance.](./2023/day54/tasks.md) - - [Diving deep into Configuration Management and the power of Ansible.](./2023/day55/tasks.md) - - [A closer look at Ansible: from installation on AWS EC2 to understanding the hosts file and setting up additional EC2 instances.](./2023/day55/tasks.md) - - [Ad-hoc commands in Ansible: quick commands versus playbooks, their utility, and hands-on tasks involving pinging servers and checking uptime.](./2023/day56/tasks.md) - - [Enhancing understanding through video explanations to make Ansible more engaging and relatable.](./2023/day57/tasks.md) - - [Exploring Ansible Playbooks: their importance, use cases, and deep dives into configurations, deployment, roles, and variables.](./2023/day58/tasks.md) - - [A practical project to solidify understanding: deploying a web app using Ansible, including EC2 setup, Ansible installations, inventory file access, Nginx installations, and deploying a sample webpage.](./2023/day59/tasks.md) + - [Introduction to Infrastructure as Code and its significance.](./2023/day54/README.md) + - [Diving deep into Configuration Management and the power of Ansible.](./2023/day55/README.md) + - [A closer look at Ansible: from installation on AWS EC2 to understanding the hosts file and setting up additional EC2 instances.](./2023/day55/README.md) + - [Ad-hoc commands in Ansible: quick commands versus playbooks, their utility, and hands-on tasks involving pinging servers and checking uptime.](./2023/day56/README.md) + - [Enhancing understanding through video explanations to make Ansible more engaging and relatable.](./2023/day57/README.md) + - [Exploring Ansible Playbooks: their importance, use cases, and deep dives into configurations, deployment, roles, and variables.](./2023/day58/README.md) + - [A practical project to solidify understanding: deploying a web app using Ansible, including EC2 setup, Ansible installations, inventory file access, Nginx installations, and deploying a sample webpage.](./2023/day59/README.md) ### ⚙️ [Day 60-71: Dive into Terraform: From Basics to Modules](./2023/day60/) - Description: Delve deep into Terraform, the renowned infrastructure-as-code tool. Spanning an 11-day learning journey, explore its fundamental concepts, automation potentials, advanced configurations, and best practices for AWS deployment. - Topics Covered: - - [Introduction to Terraform and its pivotal role in automating EC2 instances.](./2023/day60/tasks.md) - - [Familiarizing with basic and essential Terraform commands.](./2023/day61/tasks.md) - - [The integration between Terraform and Docker, encompassing Blocks, Resources, and providers.](./2023/day62/tasks.md) - - [Understanding the significance of Terraform variables, and how they interplay in Terraform configurations.](./2023/day63/tasks.md) - - [Deep-dive into the realms of Terraform with AWS, emphasizing resource creation and management.](./2023/day64/tasks.md) - - [Expanding horizons with hands-on Terraform projects, crafting AWS infrastructure using Infrastructure-as-Code techniques.](./2023/day66/tasks.md) - - [AWS S3 Bucket creation, management, and the underlying intricacies.](./2023/day67/tasks.md) - - [Embracing scalability with Terraform - comprehending the art of scaling infrastructure.](./2023/day68/tasks.md) - - [Unraveling the world of Meta-Arguments and their application in Terraform.](./2023/day69/tasks.md) - - [Introduction to the modular world of Terraform - the core, the applications, and the benefits.](./2023/day70/tasks.md) - - [Preparing and acing Terraform interview questions.](./2023/day71/tasks.md) + - [Introduction to Terraform and its pivotal role in automating EC2 instances.](./2023/day60/README.md) + - [Familiarizing with basic and essential Terraform commands.](./2023/day61/README.md) + - [The integration between Terraform and Docker, encompassing Blocks, Resources, and providers.](./2023/day62/README.md) + - [Understanding the significance of Terraform variables, and how they interplay in Terraform configurations.](./2023/day63/README.md) + - [Deep-dive into the realms of Terraform with AWS, emphasizing resource creation and management.](./2023/day64/README.md) + - [Expanding horizons with hands-on Terraform projects, crafting AWS infrastructure using Infrastructure-as-Code techniques.](./2023/day66/README.md) + - [AWS S3 Bucket creation, management, and the underlying intricacies.](./2023/day67/README.md) + - [Embracing scalability with Terraform - comprehending the art of scaling infrastructure.](./2023/day68/README.md) + - [Unraveling the world of Meta-Arguments and their application in Terraform.](./2023/day69/README.md) + - [Introduction to the modular world of Terraform - the core, the applications, and the benefits.](./2023/day70/README.md) + - [Preparing and acing Terraform interview questions.](./2023/day71/README.md) ### [Day 72-78: 📊 Grafana Mastery: Monitoring, Dashboarding, and Alerting](./2023/day72/) - Description: Grafana, one of the most versatile open-source platforms for observability. From understanding its essence to setting it up and further integrating it with various platforms like Docker and cloud services, this comprehensive guide offers a mix of theory and hands-on tasks. - Topics Covered: - - [Introducing Grafana and exploring its features, benefits, monitoring capabilities, databases compatibility, metrics, visualizations, and distinction from Prometheus.](./2023/day72/tasks.md) - - [Setting up Grafana on a local environment within AWS EC2.](./2023/day73/tasks.md) - - [Connecting AWS EC2 instances with Grafana for efficient monitoring.](./2023/day74/tasks.md) - - [Implementing Docker, creating containers, and sharing real-time logs with Grafana.](./2023/day75/tasks.md) - - [Constructing a Grafana dashboard for an organized visualization of metrics.](./2023/day76/tasks.md) - - [Establishing alert systems with Grafana for prompt notifications on system irregularities.](./2023/day77/tasks.md) - - [Exploring Grafana Cloud, setting up alerts for EC2 instances, and managing AWS billing alerts.](./2023/day78/tasks.md) + - [Introducing Grafana and exploring its features, benefits, monitoring capabilities, databases compatibility, metrics, visualizations, and distinction from Prometheus.](./2023/day72/README.md) + - [Setting up Grafana on a local environment within AWS EC2.](./2023/day73/README.md) + - [Connecting AWS EC2 instances with Grafana for efficient monitoring.](./2023/day74/README.md) + - [Implementing Docker, creating containers, and sharing real-time logs with Grafana.](./2023/day75/README.md) + - [Constructing a Grafana dashboard for an organized visualization of metrics.](./2023/day76/README.md) + - [Establishing alert systems with Grafana for prompt notifications on system irregularities.](./2023/day77/README.md) + - [Exploring Grafana Cloud, setting up alerts for EC2 instances, and managing AWS billing alerts.](./2023/day78/README.md) ### [Day 79+🔥: Comprehensive Dive into DevOps Projects & Prometheus Mastery](./2023/day79/) - Description: Delve into an extensive journey exploring the vast capabilities of Prometheus, combined with hands-on DevOps projects that span a variety of tools, platforms, and methodologies. Learn how to monitor, automate, deploy, and manage applications effectively using modern DevOps techniques. - Topics Covered: - - [In-depth understanding of Prometheus: its architecture, features, components, database, and data retention.](./2023/day79/tasks.md) + - [In-depth understanding of Prometheus: its architecture, features, components, database, and data retention.](./2023/day79/README.md) - Projects to automate and streamline processes: - - [Building, testing, and deploying with Jenkins and GitHub.](./2023/day80/tasks.md) - - [Deploying using Jenkins' declarative syntax.](./2023/day81/tasks.md) - - [Hosting static websites on AWS S3.](./2023/day82/tasks.md) - - [Application deployment with Docker Swarm.](./2023/day83/tasks.md) - - [Deploying a Netflix clone using Kubernetes.](./2023/day84/tasks.md) - - [Utilizing AWS ECS Fargate and ECR with a Node JS app.](./2023/day85/tasks.md) - - [Deployment on AWS platforms using GitHub Actions.](./2023/day86/tasks.md) - - [Setting up and deploying a Django Todo app on AWS EC2 with a Kubeadm Kubernetes cluster.](./2023/day88/tasks.md) - - [Mounting AWS S3 Bucket on Amazon EC2 using S3FS.](./2023/day89/tasks.md) + - [Building, testing, and deploying with Jenkins and GitHub.](./2023/day80/README.md) + - [Deploying using Jenkins' declarative syntax.](./2023/day81/README.md) + - [Hosting static websites on AWS S3.](./2023/day82/README.md) + - [Application deployment with Docker Swarm.](./2023/day83/README.md) + - [Deploying a Netflix clone using Kubernetes.](./2023/day84/README.md) + - [Utilizing AWS ECS Fargate and ECR with a Node JS app.](./2023/day85/README.md) + - [Deployment on AWS platforms using GitHub Actions.](./2023/day86/README.md) + - [Setting up and deploying a Django Todo app on AWS EC2 with a Kubeadm Kubernetes cluster.](./2023/day88/README.md) + - [Mounting AWS S3 Bucket on Amazon EC2 using S3FS.](./2023/day89/README.md) From b94b6f8fc9527465144cbe6e9da084c7bb3f3df0 Mon Sep 17 00:00:00 2001 From: Shubham Londhe Date: Tue, 3 Oct 2023 10:50:53 +0530 Subject: [PATCH 172/394] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 10a2b45030..0cf2cc764d 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ Let's come together to grow and achieve new heights in DevOps!   ### DevOps Course: - +   From 0e114f6b2bc261e2bf386f1290df279882667982 Mon Sep 17 00:00:00 2001 From: Inderjot Singh <112561014+inderharrysingh@users.noreply.github.com> Date: Fri, 13 Oct 2023 01:07:00 +0530 Subject: [PATCH 173/394] Update README.md Fixing typo --- 2023/day04/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2023/day04/README.md b/2023/day04/README.md index 1f280fd068..2ffe27d9a9 100644 --- a/2023/day04/README.md +++ b/2023/day04/README.md @@ -26,6 +26,6 @@ Was it difficult? Article Reference: [Click here to read basic Linux Shell Scripting](https://devopscube.com/linux-shell-scripting-for-devops/) -YouTube Vedio: [EASIEST Shell Scripting Tutorial for DevOps Engineers](https://www.youtube.com/watch?v=_-D6gkRj7xc&list=PLlfy9GnSVerQr-Se9JRE_tZJk3OUoHCkh&index=3) +YouTube Video: [EASIEST Shell Scripting Tutorial for DevOps Engineers](https://www.youtube.com/watch?v=_-D6gkRj7xc&list=PLlfy9GnSVerQr-Se9JRE_tZJk3OUoHCkh&index=3) [← Previous Day](../day03/README.md) | [Next Day →](../day05/README.md) From a0cfd591064c71995b8e834401b5edc04d84e47e Mon Sep 17 00:00:00 2001 From: Rohan Balgotra <112085387+Simbaa815@users.noreply.github.com> Date: Thu, 19 Oct 2023 23:19:16 +0530 Subject: [PATCH 174/394] Update README.md upload about AWS Elastic Beanstalk --- 2023/day47/README.md | 47 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/2023/day47/README.md b/2023/day47/README.md index c565848367..99c5f82ae4 100644 --- a/2023/day47/README.md +++ b/2023/day47/README.md @@ -1,7 +1,48 @@ -# Day 47: Test Knowledge on aws 💻 📈 +# Day 47: AWS Elastic Beanstalk +Today, we explore the new AWS service- Elastic Beanstalk. We'll also cover deploying a small web application (game) on this platform +## What is AWS Elastic Beanstalk? +- AWS Elastic Beanstalk is a service used to deploy and scale web applications developed by developers. +- It supports multiple programming languages and runtime environments such as Java, .NET, PHP, Node.js, Python, Ruby, Go, and Docker. + +## Why do we need AWS Elastic Beanstalk? +- Previously, developers faced challenges in sharing software modules across geographically separated teams. +- AWS Elastic Beanstalk solves this problem by providing a service to easily share applications across different devices. + +## Advantages of AWS Elastic Beanstalk +- Highly scalable +- Fast and simple to begin +- Quick deployment +- Supports multi-tenant architecture +- Simplifies operations +- Cost efficient + +## Components of AWS Elastic Beanstalk +- Application Version: Represents a specific iteration or release of an application's codebase. +- Environment Tier: Defines the infrastructure resources allocated for an environment (e.g., web server environment, worker environment). +- Environment: Represents a collection of AWS resources running an application version. +- Configuration Template: Defines the settings for an environment, including instance types, scaling options, and more. + +## Elastic Beanstalk Environment +There are two types of environments: web server and worker. + +- Web server environments are front-end facing, accessed directly by clients using a URL. + +- Worker environments support backend applications or micro apps. + +## Task-01 +Deploy the [2048-game](https://github.com/Simbaa815/2048-game) using the AWS Elastic Beanstalk. + +If you ever find yourself facing a challenge, feel free to refer to this helpful [blog](https://devxblog.hashnode.dev/aws-elastic-beanstalk-deploying-the-2048-game) post for guidance and support. + +--- + +# Additional work + +## Test Knowledge on aws 💻 📈 Today, we will be test the aws knowledge on services in AWS, as part of the 90 Days of DevOps Challenge. + ## Task-01 - Launch an EC2 instance using the AWS Management Console and connect to it using SSH. @@ -9,13 +50,11 @@ Today, we will be test the aws knowledge on services in AWS, as part of the 90 D - Monitor the EC2 instance using Amazon CloudWatch and troubleshoot any issues that arise. ## Task-02 - - Create an Auto Scaling group using the AWS Management Console and configure it to launch EC2 instances in response to changes in demand. - Use Amazon CloudWatch to monitor the performance of the Auto Scaling group and the EC2 instances and troubleshoot any issues that arise. - Use the AWS CLI to view the state of the Auto Scaling group and the EC2 instances and verify that the correct number of instances are running. + We hope that these tasks will give you hands-on experience with aws services and help you understand how these services work together. If you have any questions or face any issues while doing the tasks, please let us know. Happy Learning :) - -[← Previous Day](../day46/README.md) | [Next Day →](../day48/README.md) From 532b8d21d796648330fa31606c030c13e349760d Mon Sep 17 00:00:00 2001 From: Rohan Balgotra <112085387+Simbaa815@users.noreply.github.com> Date: Fri, 20 Oct 2023 09:58:15 +0530 Subject: [PATCH 175/394] Update README.md Link added --- 2023/day47/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/2023/day47/README.md b/2023/day47/README.md index 99c5f82ae4..10ff5a8bf0 100644 --- a/2023/day47/README.md +++ b/2023/day47/README.md @@ -58,3 +58,5 @@ Today, we will be test the aws knowledge on services in AWS, as part of the 90 D We hope that these tasks will give you hands-on experience with aws services and help you understand how these services work together. If you have any questions or face any issues while doing the tasks, please let us know. Happy Learning :) + +[← Previous Day](../day46/README.md) | [Next Day →](../day48/README.md) From ed330f38cef8d090582e4ce03b9603effb1993cb Mon Sep 17 00:00:00 2001 From: Rohan Balgotra <112085387+Simbaa815@users.noreply.github.com> Date: Fri, 20 Oct 2023 19:11:52 +0530 Subject: [PATCH 176/394] Update README.md Image added --- 2023/day47/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/2023/day47/README.md b/2023/day47/README.md index 10ff5a8bf0..7d3dc37e37 100644 --- a/2023/day47/README.md +++ b/2023/day47/README.md @@ -2,6 +2,8 @@ Today, we explore the new AWS service- Elastic Beanstalk. We'll also cover deploying a small web application (game) on this platform ## What is AWS Elastic Beanstalk? +![image](https://github.com/Simbaa815/90DaysOfDevOps/assets/112085387/75f69087-d769-4586-b4a7-99a87feaec92) + - AWS Elastic Beanstalk is a service used to deploy and scale web applications developed by developers. - It supports multiple programming languages and runtime environments such as Java, .NET, PHP, Node.js, Python, Ruby, Go, and Docker. From 86f73e3953cc254d4c6948bf8f54706f0614b412 Mon Sep 17 00:00:00 2001 From: Prajwal Deshpande <71492927+prajwalpd7@users.noreply.github.com> Date: Fri, 20 Oct 2023 22:13:12 +0530 Subject: [PATCH 177/394] Update README.md solved an issue regarding broken link for day 6 --- 2023/day06/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2023/day06/README.md b/2023/day06/README.md index e102718a0a..76c9d09ab3 100644 --- a/2023/day06/README.md +++ b/2023/day06/README.md @@ -7,7 +7,7 @@ Here, we will be working on Linux permissions and ownership and will do tasks on both of them. Let us start with the Permissions. -1. Create a simple file and do `ls -ltr` to see the details of the files [refer to Notes](https://github.com/LondheShubham153/90DaysOfDevOps/tree/master/2023/day6/notes) +1. Create a simple file and do `ls -ltr` to see the details of the files [refer to Notes](https://github.com/LondheShubham153/90DaysOfDevOps/tree/master/2023/day06/notes) Each of the three permissions are assigned to three defined categories of users. The categories are: From 484f4806e732ea35463a709f73778d92d4cbf8d8 Mon Sep 17 00:00:00 2001 From: ArjunMnn Date: Fri, 3 Nov 2023 05:25:06 +0000 Subject: [PATCH 178/394] Fixed typo --- 2023/day10/README.md | 2 +- 2023/day11/README.md | 2 +- 2023/day16/README.md | 2 +- 2023/day18/README.md | 2 +- 2023/day19/README.md | 2 +- 2023/day23/README.md | 2 +- 2023/day24/README.md | 2 +- 2023/day25/README.md | 2 +- 2023/day48/README.md | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/2023/day10/README.md b/2023/day10/README.md index 8081a6b5c5..71250e5259 100644 --- a/2023/day10/README.md +++ b/2023/day10/README.md @@ -64,6 +64,6 @@ Simple Reference on branching: [video](https://youtu.be/NzjK9beT_CY) Advance Reference on branching : [video](https://youtu.be/7xhkEQS3dXw) -You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. Happy Learning :) +You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challenge. Happy Learning :) [← Previous Day](../day09/README.md) | [Next Day →](../day11/README.md) diff --git a/2023/day11/README.md b/2023/day11/README.md index d52d8c0d54..08249b0568 100644 --- a/2023/day11/README.md +++ b/2023/day11/README.md @@ -52,6 +52,6 @@ git status command shows the files that have conflicts, git diff command shows t ## Reference [video](https://youtu.be/apGV9Kg7ics) -You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. Happy Learning :) +You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challenge. Happy Learning :) [← Previous Day](../day10/README.md) | [Next Day →](../day12/README.md) diff --git a/2023/day16/README.md b/2023/day16/README.md index 57bcc7decf..981c2dc916 100644 --- a/2023/day16/README.md +++ b/2023/day16/README.md @@ -27,6 +27,6 @@ These tasks involve simple operations that can be used to manage images and cont For reference you can watch this video: https://youtu.be/Tevxhn6Odc8 -You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. Happy Learning :) +You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challenge. Happy Learning :) [← Previous Day](../day15/README.md) | [Next Day →](../day17/README.md) diff --git a/2023/day18/README.md b/2023/day18/README.md index f101e56e38..b57f22cf0b 100644 --- a/2023/day18/README.md +++ b/2023/day18/README.md @@ -38,6 +38,6 @@ Learn how to use the docker-compose.yml file, to set up the environment, configu For reference you can watch this [video](https://youtu.be/Tevxhn6Odc8) -You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. Happy Learning :) +You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challenge. Happy Learning :) [← Previous Day](../day17/README.md) | [Next Day →](../day19/README.md) diff --git a/2023/day19/README.md b/2023/day19/README.md index cd034fe06c..6ad763f8e1 100644 --- a/2023/day19/README.md +++ b/2023/day19/README.md @@ -34,6 +34,6 @@ _hints:_ ## You can use this task as _Project_ to add in your resume. -You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. Happy Learning :) +You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challenge. Happy Learning :) [← Previous Day](../day18/README.md) | [Next Day →](../day20/README.md) diff --git a/2023/day23/README.md b/2023/day23/README.md index 1bef06c7ce..1fc2135053 100644 --- a/2023/day23/README.md +++ b/2023/day23/README.md @@ -33,7 +33,7 @@ A freestyle project in Jenkins is a type of project that allows you to build, te For Refference jenkins Freestyle Project visit [here](https://youtu.be/wwNWgG5htxs) -You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. +You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challenge. Happy Learning:) diff --git a/2023/day24/README.md b/2023/day24/README.md index 9b638e61dd..b611db8316 100644 --- a/2023/day24/README.md +++ b/2023/day24/README.md @@ -22,7 +22,7 @@ Let's make a beautiful CI/CD Pipeline for your Node JS Application 😍 For Reference and entire hands-on Project visit [here](https://youtu.be/nplH3BzKHPk) -You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. +You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challenge. Happy Learning:) diff --git a/2023/day25/README.md b/2023/day25/README.md index 289f7e0dad..dabbc9b07e 100644 --- a/2023/day25/README.md +++ b/2023/day25/README.md @@ -24,7 +24,7 @@ I can imagine catching up will be tough so take a small breather today and compl For Reference and entire hands-on Project visit [here](https://youtu.be/nplH3BzKHPk) -You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challange. +You can Post on LinkedIn and let us know what you have learned from this task by #90DaysOfDevOps Challenge. Happy Learning:) diff --git a/2023/day48/README.md b/2023/day48/README.md index 26a953e8fc..01836eac4e 100644 --- a/2023/day48/README.md +++ b/2023/day48/README.md @@ -1,6 +1,6 @@ # Day-48 - ECS -Today will be a great learning for sure. I know many of you may not know about the term "ECS". As you know, 90 Days Of DevOps Challange is mostly about 'learning new' , let's learn then ;) +Today will be a great learning for sure. I know many of you may not know about the term "ECS". As you know, 90 Days Of DevOps Challenge is mostly about 'learning new' , let's learn then ;) ## What is ECS ? From 27a1023e9ebfe79e624fbccfeb1b0a40ff0e72f4 Mon Sep 17 00:00:00 2001 From: Prajwal Deshpande <71492927+prajwalpd7@users.noreply.github.com> Date: Tue, 7 Nov 2023 10:22:14 +0530 Subject: [PATCH 179/394] Update README.md --- 2023/day12/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2023/day12/README.md b/2023/day12/README.md index c5a9237c00..456bfe2feb 100644 --- a/2023/day12/README.md +++ b/2023/day12/README.md @@ -8,7 +8,7 @@ Let’s make a well articulated and documented **"cheat-sheet"** with all the co Let’s show us your knowledge mixed with your creativity😎 -_I have added a [cheatsheet](https://www.sqltutorial.org/wp-content/uploads/2016/04/SQL-Cheat-Sheet-2.png) for your reference, Make sure every cheatsheet must be UNIQUE_ +_I have added a [cheatsheet](https://education.github.com/git-cheat-sheet-education.pdf) for your reference, Make sure every cheatsheet must be UNIQUE_ Post it on Linkedin and Spread the knowledge.😃 From 81b86dad58d151bf4bef5f23f90fbf83478db707 Mon Sep 17 00:00:00 2001 From: Shubham Londhe Date: Fri, 28 Jun 2024 19:12:52 +0530 Subject: [PATCH 180/394] Added Day 1 Task --- 2024/day01/README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 2024/day01/README.md diff --git a/2024/day01/README.md b/2024/day01/README.md new file mode 100644 index 0000000000..519abc40a4 --- /dev/null +++ b/2024/day01/README.md @@ -0,0 +1,27 @@ +# Introduction - Day 1 + +Welcome to the #90DaysOfDevOps Challenge with the #TrainWithShubham Community! Today, we begin our journey into the world of DevOps. Here’s what you need to do: + +1. **Fork this Repository:** + - Go to the repository on GitHub and fork it to your own account. This will allow you to track your progress and contribute. + +2. **Start with a DevOps Roadmap:** + - Watch the introductory video on DevOps: [DevOps Roadmap](https://youtu.be/vjNQbontOgY?si=X8Se7SKQbrFuqWFF) + +3. **Write a LinkedIn Post or a Small Article:** + - Share your understanding of DevOps based on the video and your research. Cover the following points: + - **What is DevOps:** + - DevOps is a set of practices that combines software development (Dev) and IT operations (Ops). It aims to shorten the systems development life cycle and provide continuous delivery with high software quality. + - **What is Automation, Scaling, and Infrastructure:** + - **Automation:** The use of technology to perform tasks without human intervention. In DevOps, this includes automated testing, deployment, and infrastructure management. + - **Scaling:** The ability to increase or decrease IT resources as needed to meet changing demand. This can be vertical (adding more power to existing machines) or horizontal (adding more machines). + - **Infrastructure:** The foundational technology and systems that support the development, deployment, and operation of applications. This includes servers, networks, storage, and more. + - **Why DevOps is Important:** + - DevOps enhances collaboration between development and operations teams, leading to faster and more reliable software delivery. + - It improves efficiency through automation and continuous integration/continuous delivery (CI/CD) pipelines. + - DevOps practices ensure better quality control and quicker issue resolution, which enhances overall product quality and customer satisfaction. + +4. **Engage with the Community:** + - Share your LinkedIn post or article link in the community forum or on social media using the hashtags #90DaysOfDevOps and #TrainWithShubham. + - Read and comment on posts from other participants to foster a collaborative learning environment. + From b0e1782b35c747c62e590f1025de40a20390afd5 Mon Sep 17 00:00:00 2001 From: Shubham Londhe Date: Fri, 28 Jun 2024 19:13:42 +0530 Subject: [PATCH 181/394] Update README.md --- 2024/day01/README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/2024/day01/README.md b/2024/day01/README.md index 519abc40a4..2965f832fd 100644 --- a/2024/day01/README.md +++ b/2024/day01/README.md @@ -10,16 +10,16 @@ Welcome to the #90DaysOfDevOps Challenge with the #TrainWithShubham Community! T 3. **Write a LinkedIn Post or a Small Article:** - Share your understanding of DevOps based on the video and your research. Cover the following points: + - **What is DevOps:** - - DevOps is a set of practices that combines software development (Dev) and IT operations (Ops). It aims to shorten the systems development life cycle and provide continuous delivery with high software quality. + + - **What is Automation, Scaling, and Infrastructure:** - - **Automation:** The use of technology to perform tasks without human intervention. In DevOps, this includes automated testing, deployment, and infrastructure management. - - **Scaling:** The ability to increase or decrease IT resources as needed to meet changing demand. This can be vertical (adding more power to existing machines) or horizontal (adding more machines). - - **Infrastructure:** The foundational technology and systems that support the development, deployment, and operation of applications. This includes servers, networks, storage, and more. + + - **Why DevOps is Important:** - - DevOps enhances collaboration between development and operations teams, leading to faster and more reliable software delivery. - - It improves efficiency through automation and continuous integration/continuous delivery (CI/CD) pipelines. - - DevOps practices ensure better quality control and quicker issue resolution, which enhances overall product quality and customer satisfaction. + + 4. **Engage with the Community:** - Share your LinkedIn post or article link in the community forum or on social media using the hashtags #90DaysOfDevOps and #TrainWithShubham. From 086bc78e29c203d0d484b1267db63026b66f4cf6 Mon Sep 17 00:00:00 2001 From: Shubham Londhe Date: Sat, 29 Jun 2024 23:39:16 +0530 Subject: [PATCH 182/394] Create readme.md --- 2024/day02/readme.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 2024/day02/readme.md diff --git a/2024/day02/readme.md b/2024/day02/readme.md new file mode 100644 index 0000000000..6f5d4f6754 --- /dev/null +++ b/2024/day02/readme.md @@ -0,0 +1 @@ +Day - 02 From 28818a11d7ab091210a68bcc6ba75e075b1ff457 Mon Sep 17 00:00:00 2001 From: Shubham Londhe Date: Sun, 30 Jun 2024 07:46:08 +0530 Subject: [PATCH 183/394] Update readme.md --- 2024/day02/readme.md | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/2024/day02/readme.md b/2024/day02/readme.md index 6f5d4f6754..24bb7fe1e3 100644 --- a/2024/day02/readme.md +++ b/2024/day02/readme.md @@ -1 +1,41 @@ -Day - 02 +## Basic linux commands + +### Listing commands +```ls option_flag arguments ```--> list the sub directories and files avaiable in the present directory + +Examples: + +- ``` ls -l ```--> list the files and directories in long list format with extra information +- ```ls -a ```--> list all including hidden files and directory +- ```ls *.sh``` --> list all the files having .sh extension. + +- ```ls -i ``` --> list the files and directories with index numbers inodes +- ``` ls -d */``` --> list only directories.(we can also specify a pattern) + +### Directoy commands +- ```pwd``` --> print work directory. Gives the present working directory. + +- ```cd path_to_directory``` --> change directory to the provided path + +- ```cd ~ ``` or just ```cd ``` --> change directory to the home directory + +- ``` cd - ``` --> Go to the last working directory. + +- ``` cd ..``` --> change directory to one step back. + +- ``` cd ../..``` --> Change directory to 2 levels back. + +- ``` mkdir directoryName``` --> to make a directory in a specific location + +Examples: +``` +mkdir newFolder # make a new folder 'newFolder' + +mkdir .NewFolder # make a hidden directory (also . before a file to make it hidden) + +mkdir A B C D #make multiple directories at the same time + +mkdir /home/user/Mydirectory # make a new folder in a specific location + +mkdir -p A/B/C/D # make a nested directory +``` From 02707772a959da10ec233e9662cd817375ea559a Mon Sep 17 00:00:00 2001 From: Shubham Londhe Date: Mon, 1 Jul 2024 08:39:18 +0530 Subject: [PATCH 184/394] Create README.md --- 2024/day03/README.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 2024/day03/README.md diff --git a/2024/day03/README.md b/2024/day03/README.md new file mode 100644 index 0000000000..3fc984d91b --- /dev/null +++ b/2024/day03/README.md @@ -0,0 +1,20 @@ +# Day 3 Task: Basic Linux Commands with a Twist + +Task: What are the Linux commands to + +1. View the content of a file and display line numbers. +2. Change the access permissions of files to make them readable, writable, and executable by the owner only. +3. Check the last 10 commands you have run. +4. Remove a directory and all its contents. +5. Create a `fruits.txt` file, add content (one fruit per line), and display the content. +6. Add content in `devops.txt` (one in each line) - Apple, Mango, Banana, Cherry, Kiwi, Orange, Guava. Then, append "Pineapple" to the end of the file. +7. Show the first three fruits from the file in reverse order. +8. Show the bottom three fruits from the file, and then sort them alphabetically. +9. Create another file `Colors.txt`, add content (one color per line), and display the content. +10. Add content in `Colors.txt` (one in each line) - Red, Pink, White, Black, Blue, Orange, Purple, Grey. Then, prepend "Yellow" to the beginning of the file. +11. Find and display the lines that are common between `fruits.txt` and `Colors.txt`. +12. Count the number of lines, words, and characters in both `fruits.txt` and `Colors.txt`. + +Reference: [Linux Commands for DevOps Used Day-to-Day](https://www.linkedin.com/pulse/linux-commands-devops-used-day-to-day-activit-chetan-/) + +[← Previous Day](../day02/README.md) | [Next Day →](../day04/README.md) From 64362f0a493966e55f20de7e433c20f9716aecc6 Mon Sep 17 00:00:00 2001 From: Shubham Londhe Date: Tue, 2 Jul 2024 11:15:32 +0530 Subject: [PATCH 185/394] Create README.md --- 2024/day04/README.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 2024/day04/README.md diff --git a/2024/day04/README.md b/2024/day04/README.md new file mode 100644 index 0000000000..1eca473867 --- /dev/null +++ b/2024/day04/README.md @@ -0,0 +1,31 @@ +# Day 4 Task: Basic Linux Shell Scripting for DevOps Engineers + +## What is Kernel? + +The kernel is a computer program that is the core of a computer’s operating system, with complete control over everything in the system. + +## What is Shell? + +A shell is a special user program that provides an interface for users to interact with operating system services. It accepts human-readable commands from users and converts them into instructions that the kernel can understand. The shell is a command language interpreter that executes commands read from input devices such as keyboards or from files. It starts when the user logs in or opens a terminal. + +## What is Linux Shell Scripting? + +Linux shell scripting involves writing programs (scripts) that can be run by a Linux shell, such as bash (Bourne Again Shell). These scripts automate tasks, perform system administration tasks, and facilitate the interaction between users and the operating system. + +**Tasks:** + +- Explain in your own words and with examples what Shell Scripting means for DevOps. +- What is `#!/bin/bash`? Can we write `#!/bin/sh` as well? +- Write a Shell Script that prints `I will complete #90DaysOfDevOps challenge`. +- Write a Shell Script that takes user input, input from arguments, and prints the variables. +- Provide an example of an If-Else statement in Shell Scripting by comparing two numbers. + +**Were the tasks challenging?** + +These tasks are designed to introduce you to basic concepts of Linux shell scripting for DevOps. Share your experience and solutions on LinkedIn and let me know how it went! :) + +**Article Reference:** [Click here to read basic Linux Shell Scripting](https://devopscube.com/linux-shell-scripting-for-devops/) + +**YouTube Video:** [EASIEST Shell Scripting Tutorial for DevOps Engineers](https://www.youtube.com/watch?v=_-D6gkRj7xc&list=PLlfy9GnSVerQr-Se9JRE_tZJk3OUoHCkh&index=3) + +[← Previous Day](../day03/README.md) | [Next Day →](../day05/README.md) From e5eb4c21f875400ea41a5ad733b2af8239f780a6 Mon Sep 17 00:00:00 2001 From: Bhavin Savaliya <41487075+Bhavin213@users.noreply.github.com> Date: Tue, 2 Jul 2024 13:30:53 +0530 Subject: [PATCH 186/394] Create 1.html --- 2024/day03/image/1.html | 1 + 1 file changed, 1 insertion(+) create mode 100644 2024/day03/image/1.html diff --git a/2024/day03/image/1.html b/2024/day03/image/1.html new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/2024/day03/image/1.html @@ -0,0 +1 @@ + From f71e33c227ef3f1fa0eeb0889f827af69cfb3007 Mon Sep 17 00:00:00 2001 From: Bhavin Savaliya <41487075+Bhavin213@users.noreply.github.com> Date: Tue, 2 Jul 2024 13:31:44 +0530 Subject: [PATCH 187/394] Day 3 task image --- 2024/day03/image/task 1.png | Bin 0 -> 15449 bytes 2024/day03/image/task 10.png | Bin 0 -> 35273 bytes 2024/day03/image/task 11.png | Bin 0 -> 7646 bytes 2024/day03/image/task 12.png | Bin 0 -> 10305 bytes 2024/day03/image/task 2.png | Bin 0 -> 12079 bytes 2024/day03/image/task 3.png | Bin 0 -> 23370 bytes 2024/day03/image/task 4.png | Bin 0 -> 14643 bytes 2024/day03/image/task 5.png | Bin 0 -> 14133 bytes 2024/day03/image/task 6.png | Bin 0 -> 36126 bytes 2024/day03/image/task 66.png | Bin 0 -> 35088 bytes 2024/day03/image/task 7.png | Bin 0 -> 7898 bytes 2024/day03/image/task 8.png | Bin 0 -> 8390 bytes 2024/day03/image/task 9.png | Bin 0 -> 29332 bytes 13 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 2024/day03/image/task 1.png create mode 100644 2024/day03/image/task 10.png create mode 100644 2024/day03/image/task 11.png create mode 100644 2024/day03/image/task 12.png create mode 100644 2024/day03/image/task 2.png create mode 100644 2024/day03/image/task 3.png create mode 100644 2024/day03/image/task 4.png create mode 100644 2024/day03/image/task 5.png create mode 100644 2024/day03/image/task 6.png create mode 100644 2024/day03/image/task 66.png create mode 100644 2024/day03/image/task 7.png create mode 100644 2024/day03/image/task 8.png create mode 100644 2024/day03/image/task 9.png diff --git a/2024/day03/image/task 1.png b/2024/day03/image/task 1.png new file mode 100644 index 0000000000000000000000000000000000000000..6d43acbeadefbedecf20502156158ba809b074c5 GIT binary patch literal 15449 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 literal 0 HcmV?d00001 diff --git a/2024/day03/image/task 10.png b/2024/day03/image/task 10.png new file mode 100644 index 0000000000000000000000000000000000000000..bd1ad3ce033331daac775f65ca02bf3e83dbe4aa GIT binary patch literal 35273 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 K#R{J4`~DxoAGt~Z literal 0 HcmV?d00001 diff --git a/2024/day03/image/task 11.png b/2024/day03/image/task 11.png new file mode 100644 index 0000000000000000000000000000000000000000..92f1a020bf3f7125f1ca7b302671b67939280d29 GIT binary patch literal 7646 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 literal 0 HcmV?d00001 diff --git a/2024/day03/image/task 2.png b/2024/day03/image/task 2.png new file mode 100644 index 0000000000000000000000000000000000000000..321719e413704082301afa43374096a925a25528 GIT binary patch literal 12079 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 L<;AK+41@j`zAz6a literal 0 HcmV?d00001 diff --git a/2024/day03/image/task 5.png b/2024/day03/image/task 5.png new file mode 100644 index 0000000000000000000000000000000000000000..68966372f21fde8a1855eb7a927c40c14e5c856a GIT binary patch literal 14133 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 literal 0 HcmV?d00001 diff --git a/2024/day03/image/task 6.png b/2024/day03/image/task 6.png new file mode 100644 index 0000000000000000000000000000000000000000..2ddfdbab264e67ae99a800f4151177398719b59a GIT binary patch literal 36126 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 D`(kM0 literal 0 HcmV?d00001 diff --git a/2024/day03/image/task 66.png b/2024/day03/image/task 66.png new file mode 100644 index 0000000000000000000000000000000000000000..5360649b4f5a98173bc6edb79fa21c3ed0fcdc4e GIT binary patch literal 35088 zcma&N2UJth^Dc@73n&VTNJnW>qx6ng=ta78P=&jNG`_@G2$1hZ(7dgw+LkqoAxzD~=i9Qs|eD^kFh$!-R*TZXp#^+`yanzrO zk6Z1-YryxifBzkSD$uzdxSSefezWA=B{z$o*Jc{F$QMJU_g;r`nxzSM{yI--Vi9>1 z-{G6(i&{Hh=m@9Ex>A;i=y&X?+$Q+izvC#1R`P!b&SQ6?m_oSbdRk^tD8x`rP33L6 z+k`8om!3cqRY_CEJ5i;J_uJ$7oKls8M~)2fJr*u{1Apntz2|;ThpYp|La{b`#*)sC zx@>#Lx%pPEWPjEUa}As$;z)71X&3MKvUb|Py7Xfm7EK$)24NsuDQv%Vk_rBgGU}{* zptUm_qrd96)AM0%?m>TvV6)lDoXIJzUp)p>H<`HT{Gxr^vHWWa9ujbFyvjc~AQj!- zR=X`lA?oRW_5|8^*2Ch*-S20V)xoSF$R`7I)r}6Jl z?D`Qy)Y_uY%JLV%V?W^Z{hG+-s)!2B$(L^NFDHCv`^=P@4}yUfB37<0r4a18c&zMO znyty|10}_65S9gK9o0#YHek(<5%>Mr^QqIIQa`IcLz(xgNfp z1$*YI6T{qR!UgB|0N>qG26c^?Hb#0sBK?8)z-&3jTy<({{lq`mb5a1H-D!4fsTfOJ zKi}iWMLShdH%z_PvKww*%$13bzS&kdQ4;o3dPjy_2$Rg?mKz{r6{|kN9EoW{sn;vg zn70r{D6!Q|>|gwj^t8!r>ajar)V9=q)#mbvjj1{J*6ymd@DV6#SME3Q}P(&v0BIoB)dqJIOKLH+t#uYd35n=He0A34@8VxpqmA z;xMmUHJR96e}bFmp1E2;Mz!$g{0-I?OSxO5t884Or!@G>JVu4*svzfiWc{27jyJi8cN+2-{JD<8YkB{?(d zO_oPzAzPwuFy|yerGl^&8q!XEAw^ffhQL>z#*y9BdeCUud(g5$n$kYtjEXr zcvHAa{7yhoyN7;`vr(oq*Kqp6_hV_3zfO+xewkFNYVL1uqyXCFeao~;h#jgPX6hwo z8$H+we6z~p%~8>&izi>X|DtNbLK-W-v^sv_H?1&-3EiYJ#b&?mR*sW>Ua?}~{IxmW zV0*8Uc)LSyH;wk@pJn}pOfUdzBNZdu>Nthg9L4S*56qUBA2*#}49@qKWw>b(G}@={ z1FmRRk1kW4>!fCN4kyxq=*60|`e%nzu^5bt2V%T(XUC*i>Z#T)!5bVIZ4aJ&4FTk& zrJoDIDbJz99z9O1jqL}e`FRW9W##JNK2yzuZ0Z6#_;Zj*WIsM&n>}^N5?Z3@wH2(x zvF16d5OZ2j86bLd%f%KXV$sycJ|}9~l7xGH&pg#JKbPl8YT3)z8tgN5_0>*fXG8Y7 z&7jogBJXGA7zJJFtZ6_;Pg66(#d%hT4M@U!>lBJWPrO=vnhSZP8lOnsZ6B9oi`1Pg z$107Z9ZEM`hCCXwxaR*XnHP$qV99#yHM8a^mh^p%XdV|2zA_d-_mcFas5HjJWTV0= zSTs}Jm1~X>ncpRTaczI|K{|9bYxjY+8OvkAYDiz z$u_eWkS?=re{3Miq?pgUVOTSeW=$y)qcrDhh<2r&2XF7-A!D}#%N;S-ne%oK@eVwR z1?AS4+GV#tiX*csjDzt5+&qr%>8~Kjmtt{9n(|{Dv>l^i)HUP|mua4aRG|mtZ@Q*~45_u=Pk3ve*KxPe!x#iCH()%dO{p z+`~7>&0ECH_WFEVjjiC_idK6$off$85$WSVOE!Y3$nb&&$)zxY>^b*PI0xJ&RWL}A=O|+b0U^Ed#LRhFSDf*-h4kmOTYdOJ&>?bv@JW(nEZ|}uiyqemoESdc)zcf4hC!!8t0<1V}tlftF zaD<8lkTgMqdD*P)K^m4$DWuVM-I!jJ{nW`CT+>3s%bA_Uo%yid`A+zQ@kvc5^MmNQ z54@Xr3))$^?PZabk3Ni0%<^tRQbW!%q!z?gd@o7;+`kA2tSTN~rpQA$xLy_=@1KvF z#shcrzQ(SazMtb!--h|~?rcg!Hl9OB__#X@5j;+<<**0p6jgkZL^`#>CGMc@lSZv{ zw?AivwHYag`UNBQp1GrU*;R}u8heG>luwsZ?i(uiQ8?xaoGw1fs1-x623n3#t_mog zWut3CB|Q`azA7B-38x%8ugZCM@69!bQu}!OC%7|#N5EA&9 zJ(^S&9jAdlEA;?QXNq{A$TK+lj$ne~*`#!Qx9+b+ZhGj(_p@d->ESUAos%#w_^G=0 zt&632r=Do3Q%YQp>1m_H*-OKaLH|SX{f>0MxM;_1_|puTm{Nfzyx^kd{`(#&A01Q#c$$&yK;gqkFBMC@ln|u@tas;PKA)G_3@^B!k0csGsnt9R8D?i>aMrg zc+cz-@uC;dm9F2fpsBsDF+ObpDB_TmFqa6pKv&$V0PXcmqIdjv9^rg;Rr}Ees0)mc z>0-AP7-)7w752>JMDc|01>Qk(qV&^d2FGO!Doz?_JWO)BACEfc!P#i7&av+o!10o} z_q(fENe}p21EW^}GhYJFb`7SF1ke{OyjX2qo3Vj~eWf&(X=fEc&t!s|EAcbgox(o4 zCafw?73CbGpXnpG^%wimq{2EVm1I`epx|_}X1CLb@$omf-@1BnlKmO}gN5YiT!juj z{Jp`i=vlN&p&KJ~blFs*4!yN-(!t{=q_Kss+&k*v)QvXKX*8U}4|emy!7>)JFrh3P z6X`cfXb&T~&qeC9I>!=)e|!8H-=GI;=8PdaH{}#{vgaNhSS9K?JAO(kOo`U>ZxocB zbM=@i&|NR|AM2L|e^`EzU^yj78LSvG=YN6jDH%7ZY%buh4=rIxC{Ba8tBCe+3-{7?$Mv92SiBSWw#E0C8G`}R2SH$7|EdSHn}c&ob59Gn7K?U__acFF z_yGD@wL+0XV|OE?xizr_36HWvbH{j0N?Er+0Ix?HTJ0nLYHBp`ZgYExsb1g;LsWY< zA2yb_-j_~M0hGseayUJ~pdK3RLrBo7_8Mv1ZxhC0MH5CB*1b zfGM@sz7lKN*_(MgQ8IStt*PGwOast}lPoI1L8@Npl~SwXB#-XfS!vEB_nLK&5jC1N zo%_(F&I0K~9i_CN;v?2+BtSC*h8$Ik9HzYpRdvlK)}rrb^{&u-rT%OdKlkrTj`@~F3S_--TmkZw)=Oy8Adh~Kuh zHU?k0c$DWT{38r)iz4_+Px?cPv5lJ^(S^kg^>!K-MW}|tPWszThkWK#NvA-=*hfv7 z1-rlx+Jl4i|K5R(bng&u;PsjBM#gque}zu@9^ja4>Y@EBp)-$ROnZH{#76SXO2`Cz zKlMh3(bWqAJW*X<&>DdF5;n8r{bMFFqV*!e4CM26*9eOOxgI#;8O#kPXV-X0Hdqq} zat$voD^>B_7y!P39$v z%6)j_ul^B*t)Np2PW3P%L_rdkqU7dW_wKItV%|_lO7d%>kTUf$Da{GQ(5A%z0ax=tXh@T zZz;MF&kXFW!jkRQ+C1EB^o42O9HvL<^$kJKSu@->`~kHAG0(! z%SnI~5Z?m~pF~@dPC_yYeJ@i!uc6?%;xW8#X>)c@1|dvxAyAX15#Zy^tg)Tt&w}r~ z`*z++u&9Ol{ZWZ~+U0raSL@@YAQ=jAQvH(8 z7OgkGpV;G^)EM(lEm|03((H9*9$qI#jnJwYNc(tbrL7}MCv}uk&?yQZjnRdzKvOy0 zhB(U$a9f5vPnY^(swtjreRIPPookp<(zX#r?tKpwxso?E6&;r7`)hdW{rg)Vg9p;7 zT4(PkGj^WcEW~uoeT41q?*%fmPVjH9)(j?b6Z}?&qNJc9yEN6iE1xx|mhcPA0T{1# zQB%VuZJuH)de2Q~bat3U$<+LOqP@>Fpm#kf`sOx{EaZx3!K*XpSb*{uMp$`5*5`~q z+{pdo_c2~vQ*!!LDhxMI4R$mi`TRMD9-k=(NOQ%5Aaxi_Tou7M9u&0)ZJLg{OO96S z@r1}Y!nJ=l=Y{SF#WOJ*nh~|=s830v>&T#_dQ8EbLR^!7(W({=@psi?eU%0VuDgRI zMQIx&lqJRZXCm2iH&1rSG$E z7CN0J%S7HI44#E82pJ=WGGA%uc&Woz%H-(kP*dhFjNB@pWJTRZQZWVw<$DvBG4f+( z>|xntxaN_h-jN7PKdv-;L2Yg;Jc}&ZHN3qmAKq{wzkln&ofOjIsM0vj&D4V>F~!2# z7}6Ki0HY8#r3pdJRrQ2s*hl2Y!Ca1Fvw_hrZ+XfiViizr_6u;&YDHonTJ5r(@f!fX zkK9K)fog}AS`!Hf{620;7;FMN6cp!*V|ccjvjc!gx}e<{!Md>8#NR#a`(DyjU22mD zpKD5YGxP@J_VeJ!dzQ>=_Wif;ZdMv9!MYLGlMG8p;yTA$0EIwlb+m7Wt!z1B)XsW! zc@^7lC@1KXjw_&u!~b0RdB@9I2@XcHs)_0{!rvo*MJprEUH%KDtw6BeT>u-4hx71z z{YTGgV5`>`JVN#=acR@XgxOR?fuGE@dpJu~;%4sER3J77kFe+>OiCCwFk?sLm;lJ+ z#mYdy&8p+IHXPJ@E^@<#3v-Qf^9*aPBq~>}59GPsp$y>aa*$@}Rz`uhtsg4czME^Hgg;zKR(2#r386R^z;B%lZ>dXrh$!Xu#^ z_uZM9BhYm3euT9&&HbAGVboC3ShW5)0j9gZ4I+3hr!3FGN>r@r$yBc4sh@bG{_q1& zA^wKq)mzMU(w#2gHwW~Fo1|GYA?uiLNwLG-XJuWQ+ozu#%p_~(l6udbb>gY+gt{i% z=QvqMNuTiGV(&}%cWV6w3-b5&V$lSQj#z_JfDWk650NI25O3?5plTEj)_nT6#PiO4 z|M{68*a$>X+dE_$p{LWFj#3RCq%ZHiQO$f6roEUp7x5_5hq>@i-Z=;=0-1bhNY_UD zN^borGYNS1mw)p10p7AaCsm@nbmeRRllZ2|x-t};WGP*tbAK-_MalYNzutv0<+!lx z=LR9Dh;HZqIKNCUt@+G8RqSo0*eZj@j@c+ioIwfhu=Baz3_;jLUie)?+oZ|^*X`tU zOkQeO>WAX@SIkmkH%1_LnaaGqW7O*yV)m`^qv=_a_&KA-?OSejqPR%tcGpHRLx}qyUk{}(Gspr|tj@ep3O2Q7N#OE? zb)J`)Z4_a|OS2u=w{~Q>ZX*>L;G)}*H+IBYjq}}zcCR#1fvN}5p6XH zXSxPbh$UpJwv_zn?%S<#D+EaZjInokiEBN5$oCu_OtVMA6*$MTIN zae-8~7uIp5W$cs0DbY&)m#fhMX^V1mf^;DTk;@J2291|1Ck|BjnrfapIv<(kRij{OWmz`;`$Qu4G6!Zrm#1ZNWFfTZ2+-IQ$5&D9qn&%mXooql z>sfvHx!$yT9o=2%2)!{Cc6`}JJhPaIJZ@{JA-uqjs8XeC-u2JOO4MqUr#Q2$B=us; zGy?0ivZ^E3A7<${(z1Pn@iMm0QupJk zgwo9TCYY9keEO;qJWIl=cU-62l zbFZH6KLxFqccT8C`jR8-eDmKConXL!MlBR>0YsKOEJWyfD>2j5O)FuT`xbmD-RI{( z2^F@t>%Oa~&4Q>fWMb%ch=Oq4dFH)9AiqFGCV)PSTjVw$lI-esB2Vz7QOc-L0h$qO zc+$42U2cAxG&SNE>S0$;RR5O9eH(0-YYUR{dX(~G_a;b>D$K6Qn1S$*UkWUv=WO#` z`A1qe>1|B5i;V)f<`hh5WRzLxqVb1^0-5?{nGu#S9MwOmow<)w-ONFLRJWefG}%Zl zc~<1n6U*wWP%E#so^|_6CCU_VWXO0*{Tu8JJ5G!7Ae0FBfmPuX%$bJ4vE+Mlx~`Rb z4<-dKxyU&<@uHhgx*l8&&P<QCx?h(xaoyPz4&Sz*4a>*;fNhHOm`*Lx99ZidM zkaRT`TQ3l<1%nG&4G%zZ`l!%*2dO`Qv448Y?CNE}!xv{XpUsjbGcVm_ndR!+Ld7gRjhca$z2^bb z@7hQ&js1MCREZkVaDI2=+OlW+Es8g(g|*TQy+Ob%_QHq=!7RB(b1hH9^gFK{B}ZZ= z6Y&%2@?LyNpmv3_3g-Ko*YpiD{al{hmYd%y9{*l671=LkgE_VEQc6GbsQ$pu^@uyH z!Qxmazm=|}bKi5I^kaKz*OZnbDc6}n0o1b3CwtAq7XEE*^&PLt47F%+<|HjW+*Gn3 z3y^n;O;IvK=E zB(Y2?&--l2=TvnZ_y#UF_)2<|-%4tG@*F|a>Z!$PRS&@884~U{yqfLp@4wx@;*^zo zRDE!+F2qr-8vZH@x4?PSqI%pQ9HIZsn(XJMXk*X*mBMscTFxv*wLPWm{jCB;EQ2bn zxLzr8lO;uLU0HT=m|T83A@%i+l2&ejmxS|o5s5|J1arQIy9MX_;p>7wZJRTr(sM7y zN+86P3ta+R@-_T-DBzZ~CCTTXIGrR7KHHhw4!c3`dv&(?BU)m1U-p}G2x-{)Gzn&r z<&KVpmE5woT&$`tQ)t^}&dgt)%4V7Da~!}lc2#WpmY+mvaj#{*LxrX^_tnsksz zSoz~dEs#SL!o0Qjp)uw4_O-Q#*9l7Ovaqzq{u)_D{AF8Hx1Bw=kSR6<@kZxX|4lba z=Coqa#8rWtH8A9ts!2~o!B$*>QO*98%^#UJdt>_FemHaoH8ISG*l`XhSi)IyPPo1L zUu?%!84vFtzr7)p@uN;r;9E5Vzr!>inSQ)IhnynkWMBCJM!&0~%~uS{?s?>T;C1Xj z^jl%5!{*ZJeN~Zr_TNlB)GtbdhYz3gUCC$4ui(5gj`-!OlMv5bZdlNPJ`COd6!R=S zyZkPfiqmHNN%r;~(KE07Fn!hS#+^4Z0b_~yyh^*y4PL>ogalBH^&JZbl@UJ5g&&hD z3CwvKO4)RHkqQhQoD-8mJ6o*ocq+8*Na5)c7MEBqPt>Hge#U%lKjLbBr=s${mEz-T z8El$)pWe5kO@~zPo*CX!Ndq&1_*z)!Kd=$s)zIboo4RN;lm1xL$X06$O&^ENPrV!) zmjHSq+VAVi*wOFE*(vKWr5+jiGu)r*|p;PCO6&rfsGPb+jFsLMvYMvQ#M<@k`vrOc0B{ z6f&A0fG&B2@C`fC)z^hPrb%NIl;jxskUv5#gzGB~8aMVzsxzT;Jp}CbYE3!eWrJWC zMPho75S%wnUbf&>8pSrZ%^`bGj_K7l_gYWEnWel>bY#G;e$lgoY(BQG-0=NDE3IaW zaQ(cmIj3+v`rY`mz~%J&B^35LPqdT5a~r8`w!}z4E37|xEavt-+m9Og?(P4K$U{Zx zH=gieY?L7R0^*uwIZkSvFY1v8jZ1qam6;d#=GH*g!hkT-L`{U6?k&%|7eSii`R^D?dsT346Uz;_%4yBZ}V@H^f$P0GWwc+-!Z zzk;e|22h1jSQ4=5%Z)e}ue8fUFfGE*J=0Kj&hj2uD9(6DF_$C5p_Za2F>gs!n6C-2pk`Fj}mk3BOpdCke2QTk_pYLE5Gx3|`*B#L&= z1_N|zCnAISFd35U+etEq z)|jD1P?u1OWs)>aC`yPDbl~galUXE!4S!;OY__xAr^S7MwPNv;*vHD56I3;9+%XAn zhQ_6>`-dO^QlLgPtNf_Bq4VQAYaWSLE;+Hja`<%|u%!9tY>3IN8hV=CJ62Zc1pWyp z0}!-!^VkNIqzd)t-17w>wg*@6=~(P2@?q@@jtkcW!+){K=h}oAkD1{=8T^_&iYNM2 zjvgx$ut9!C0d(y+sVqz$GES0I|8Qs}70tyota;dIM5B|USdc=)C)Cjps$BDxToCe= zBc6J^-ILgcEDX=6EZ(1vPIk>P{%{vC+GBP)Aw{oim$~Hh*(X{F3!G9k_xegs$pFvH zoJ@IJ*ww@#yt5TSmzFuH9cA(>a}^J9yVtHGRC0sT$qnALD72b5>Oe|S`NSUCh%VYZ zZUKO!)+?J+Rw{6D63jFo^~su9%35o+yFFYkV&f1u2vg>qo}?dDN+HcU{~mFpfh*qB zJj_E4`IR}zR#c;LymJC71IfYZ#CH&e68+xRdfGdg_y~C&F5=Yor2jTWzQ1?G1T#^+ zm8$7g2>Cm{{vn-9`_1^&u~%~vb4MD`ha|zzfj4ESvUHU6h4DTN{~|-8On8u^Aco>i zT=PSb7q^GYu83qrne{%R^)pZ(9ngSY=@ z)Jjh0L*f4Trymp!hy1j%`WNSZDVwr$UU5U6ea6+P^&R#{Z>HZ^^|Wv$P(|X)e|aW- zXMdaFB`r{q+@k z1EQECJxw~7L)|AQZm#iJ*XNGgzDnTx!V?ecl@eUS6Y3NvnG=Ny#GJ+5kU(X!LKrl_?b zeKsQ;P;H``crJKwp~MJgVVoIUaYMVIlp&*hB@iru$zeCaRY#|}ia?zO>#5gcYLM?1D7h6gEoCwvVCX?6q9O&^DW12gRKz@W1af&j2{9Ow%~)*W6R<(aLCJJeKY zAjUarFiTtfn)6aB>{6=dep~-ss(AflIvkikZ) z?Cr9Y{7(`M69c7kwe+gFbQI0{zJuS>>JN2i|GX|tS0nd4mB`aD`Od4tKM^YEjvfZD zE*p827Lywyg=BOp!3N`6-4Wor1>U-r3HqU;xvT680+BxeFN&8o6# zcYH9V#Y@Vy?X!`D{7$CeFrXyqSu{sY--Lj8%0?A;nfZQhB2Z!6ZZP(?h>#BcoHpoL z6(tK9V8GU3Y?9bibIxC^72FbPNAoykfuhT?z)ThK5t?btha7k%T#`Bp>FH-R!fYo% zSS^`9?44KaP>CkzFPb~fJJ?ZijKD*#eYw^{51$h=@6Tr`(I7ck@+jZ38|q#l?FN;! zfCZd9QE*gP8K(wfx^&pB5QXhm`5S|n9;l}{`743;mv^(I4u;`uS)?YNQfDV#D+fX^ z;`G!sx2&3N{N#umK+5X{3#;oKz2y~5LHO+_byJ5 zAJbZx(O0mUewSO8`R<6OAmbpxFpzG`S>-C!7xGzOw?S|VbN{Waa5E@7sfmpsu*awk z26%^FQ5Kz%n7yUB&)y_alexH5yTl;%)kLSk@ILJ(#32iS%Xb~6O>u}muG5*_X*bK( zl@%x0IRe@8q)FT@DofOJ_19{#8{HDG-FuwBA+$2KXSxmIbmY4+%afI5i9fAZc<+g? zwf_~lsN?7;Wz7c0kCj3)cB1u*aErB1my;iqYfQ$PgZ=p4_^n_r=>-@JJN z%;o-j0I;Cpler(ckjZ{twk0GTjjCbm$f>FTk^@5NIKq}aS zW_~mrYp~Cb;-YcrfMlI*JN2mL@a;&&N}tc|^Z){cFKhji?{@mLfQN56uY{m_%L_QL z>@LuXUaARq#B_=*xah9WZi2{37n-DFwGY+I2j-udJ1DwWp1o2LW$q^j9RWI&2<5kp z&?##s;-Jdn>OtMHHQ_<$Mc2{?Uf;5mnP#@@O;J>TJY@6OA}!;n8o`g54xOxdR^gUI zMks72+E1z(z1>j7K+%9isln483Qdg%#;TPp}>K zNM0`K7=(ZAsm4HC4n`%b2>07(s{wWzHdGO?x#f1|-*Bhu4@>S6 zEI1Z(Q%?0F&R@tnauG3j@p6aEi&r{QKiVG+u-FgrKfzoEY>^$@z`2+anFldmma)8~ z@WBq$3%IQCtIx?~q<2d*H1DF>!OQUr+MP{1-O=Euu(Lj@3+QggvwdL7y5^FO8=jKn zQq_^_a`h~uEM0VeUwilYV_ga$)POTLPBGuj)2z4{E!q445$YDFIRF_}QI#i9LxqJ3 zm&|npG#U)wNB=Tm2)UIjCS#YVQ^KC}qbR`h#yUd8no=X?M!qLBZ1&NC?)d34q^i{= z88x4xA*(u>+QutLIpJoowsvOp>q2IM<`e>$ z2b5?RoL3G|3hbgP`Gtu7><2k#EYhGXTL+C+wfRHcpCTpRlC_ez zP@}@|ecCoeGIg+k@9(#=H~RU{X%922pjeo8A0`UF%DM6UQ@*Z1GLe-9us@&HYE!OCOqr$B)Da zxjPnOBfDm$G))%v$w6b~Jhz$ZGS87-)-Q7*zqF(D6|G4Ls!K?Uw#G7czfD-EwLb0N zS-CAkmX~+SHd(=`$^)^KpuoG)^RhQ>$!>oVeKUNz0HLNme(p+SZFK|wy|Gq59yLvNU}T#|v1%KWyVuy{V^>(F5Uu+8F`Lm< zERq?;BC-Sr$bV@xo{dD40vM%5G(Jf#J4)4>>+L+VeO8%V=y89?u#Gdns8&c2hjB&Y z2;lKFA;;Ut1vjBZ6ys&w6aN zjjLXF`M9CKtnieUquWfwLXr`4CV;!(#M1q#IN2}pkxrEpVY<6`SRY;+q zYwF{uySc!!1P9+SF(2b;Ff}rclS2ZKXkR1hTR7v+5hpnwAODo2T2?j9)Qq!cAp##Z zN%2ne_KAhPKiw){Wy*)ZazXVE0Dw(Zab;$-FG%0gLy;uVuw7A9k%0x!kKlB)bWcqZ zSXTG$^E9cjo6`XPbA{!(jpP4Et%|Sx|8K3zYpOAmG0h@qr_WU?4sc!+Hp!kS=fD7$_*O!zm0Q>JK7ZZ+>|4t-AkU*_vh_7~Y|kkAO=GiTaVe%}SIoA& zqCNEq9lQ}usM&-OAaP<{cPieZKmr=k2!DEE&(iXvPEJ#d%fOFdp3tJ%cXOpW3utdZ@uW53COrl(|s7s&SaGv#L6`i=ooYp4i?`oq4e*=>)9E4DX96@ypr zKwd$tf6x^Gp;CoQo@g;e5GHy>vEeg;SuWrkiBpZ#1yTP8H%JaKB|yEseIoa4>>5%=-C zZak&NnMKyqUph*?Y&lyOXTR$VO+><~KMwFyj)1hbldopeX~SocODVMr#lDAS$Ei zv+$w6VisT`zw6nB<4u3+GP*Z@wEEr!>e4_mpOgK?$d*v^Wd{#VHm44?x#~z@4G%cBS;OzcjhZIWOlW&I(0`Y zPiLKb|19;ntWkrpUXD-byAswO_&|3>uAQ+P5K#U))|s9WR(1Ki`?%j?$X>x|HLdKi z3myG4OTU~yeYaIa9gYIX`R%7VM$R7PFmbGX>aduxVS5YfRDSO`M#|ZM5qr?QWj&&! zIS)dieK<>w<;Uueie2 z$Wa*YfV76|e_kj;VdENu_QqYm^#WwEqo^qr+0vPNAg|m(8C&?3mxy{h@Bv2f!~X@% z3PTs}5Y7^^54Km`JA}_~b!L%&_<|^k=C0m9tn^zw2mSvss+D|&uzH|`ypSKYujiBF zFU$XK)b!ff{Jzsu9o2*U9zqd(urAB+2_(-lt(~$$Tmb*FMU8z=if6v$_P|yz%Y5e8 zq4L1jlk`k?(kOL`AwoSqOMdkLDDtu#2jihr)?J&Pr1e=vT{YB5Fsez2EcFb{+govc zYFhkPFyP`0QyVwD)t^+W&$F()Rq8;(sr-4pf!307#^)OQe8HrjNM^`dZ1jzZsU1Rn zxlbsniw~x1)ZY9v!h_-3J;Gh-VwoL8HHK_kwQiA=yuOgvFDP)OQOh3@OAWeQt<5sC z0P!B+W?}PeWf66(-$PIMsgLxFfWDk%I%=}~CT9yZYD4}^{bR?6n;aUb&-Ax{?+)ad zT`Z&KQu%pSGQW`{rjb1FR_ZT+SGHm3+9Q_JsnfSUwD6Y}7{~G{=Xnf;Ivr=!gj-Gc zuEb9DCKvfCR7}UV3K;BVU2VJqdHhUFL=yEc9xlPd2{i=+Ytkoc?u;GV@<3 z?2L}xqW_3Lc+0#5hh&VkWOjqDc>+kj^|9En>?<1IqUsihvPuzRt}o2hkLg?pnIG^$ zW!iU@Z0mU}{@j@+4NE+yW(cStG&VTA&Qla^5LW<}I~hE)9!&b*8XE+}Z=~cmaSSB=c_vIaer{;wi zbR~a|F;*2(G1qqbY2P;ezcn}9(SH;4|JvQ~Y5D)?Zg}g*?GCn2W7rWH+A{j?!1A1Z zxVhY6+G4e(`rw$J{~nleq>EKl8ry73m?&>qlBRJH06;m&mfOMYU=z=u(%;5m&Aym^ zGfUxHVucGKS*B=k`dO2_r)99hpj@m0FZOF4E0;Q3{Wtcn;Vq}ytO#Z+)*R-FfUeTu zOWy4o_$JE~DZ!VwFug;IBxMw432(+12d)9pPmWQ@0cGDZO&cNck@au!Y?F3Ib2ATu zYU@I8sV7Kpu!brbNTv`|3Tu+D1J?EnHLviHk(p}$+NS?~UzUS*4(df_8>tJnc*Ju8 z)!Crr7on@CxAwr*DDriDqpETcmwyAF&(Ce8{wlL$i%LfqDu$YLPgO3mw@v5P)gv7& zm68S@xZ+ZL?F@CJ3HcOxLCg+{! zyN$hoDbs_0-D@glnde`^V3r_8ciR-VLk@OFLOl4pRWBvRV*(>@%uGrz$(*v)WAS(~ z`6yR3ne9?2OL47N3MxGQb26pCpAarRloTDTy*FgJJzX$4qi^94v_$a?DH;^(VSzDY z;|X=l<)!5>QobZ)yM8?M94-+Z= zE=Uv7dR}~v-f|*i_U2BzjY%Nu`<_onO*po5{Et3GmH(_69({5;4!uxMwE+D3kL#}S zn!mMzmv1B2C!P{avA1DSS?Z4XQkWKb%W{c5jz`msk23ggQuE^j9E80>r@_Bl$x#GM zr8`jUXgnf_W~rI|r7f$9b~S>eMrzGTl_lIRdt@26CHkpJr?j`Ks*S*JAKv$L;uKa_ zitb2~ClH|Z@0RPt`qyr8$secGa&p=d+PQGM91V@nBu(TjQJ^apoq4n`c*k!#d zmmWcr7>TbDEOYk08SdeUmD+E4!L>t23tIX-4#DM6Qsp3!w(b|P#K?emDPoa1PlUrs znqo@VHEN3V6FD3*hW>Ge75KqrmGxc3Z#j2-;bVI93@f*v7_P&jQX^Mxvm94nv4-g? zhbqpVaJAjmm`3HhljSYoAJum1U(El>dCSv#_uIS49yzG&7#s%){md+Q$fnnZF1^=AvJ!Ky;pgKQ14$Ol_^!fSVTSo8KU)R;uu{iLS9k~1rkU-Dvv$l!w(*=|1UP`+RPzM z>xaQ(kKWoxQ38+e6HC(8`q3y`>Puy0U@2oQ1af=!# zxUnvfHbP@@<10bT-}wYFb17)+0gyNMS9#%FE;E6-CQ9e7)acYjxzO{tq&w=u;lYQa zIXTG|s@YY{O30(pZS%uee+ANjAEXLecX@k7t40{&wDTJS63UrwdqPdd2+e;}FPv1T zmt$BgDgPHSR74?PbEx=7-yT=tP-l+|D{_RDth-dP5dWgs<6yeicSBJApe14l4Rc<} zw|U4k6dRm`bru=1AjU~YoUKU1nKi~{yHM1)YYPW`5Bwyl$&cE4%$R zoGj0dY+`A2&lJD(xpIioe3H;9hTzXWFEpa(wKIvrBTd;lHQKqR3?O6Og ziZTGR_ym3k5^(v;B69nAxhSAK=Vm1-^b223Qf~R96u#)}m7|WCPG2^opZDA{rDRLK zzu2>-XjY`qT3el;&gMkjZlGl~7Mvsz2mDymd;F)Ie)g&WQe7YCW-j$hasS=lZXTD) zR;|hayt9dA3z}`l1CiGujMUc~EhrmCy^Jq9&{G#qbsrf+n}aWu(^8OZYvI|TvmzV1 zih?4Y!*X+UcbWz9+owoD`P+`}K0r+uzC=|AA^40|+uV}%jq5qG3v9jTW(|IP!{jP$ zy}kKIg8gno+tKX>%i%~W|2D|*r}zuP{#eF6D3AVNlk5<65vR#6|FO=cR6FZgM%+1VcS`42ebrh6kc)m2*r_^ zMV3+Q@#?Df4YC#;%_kUfLO+*Aent=r&?lRhGXITdM!8lhPQ6;1pSXWaC9kSzXOeen z2z1`+o0)nvJI`}ER!YeCr$qXW*pew~o5m?-sAJZP8Pbvtm5KFr+g;q>#q&hiW_KaT zkWKF0eG#U#{Vs!~0$aXt`_De%_^QU@u4mLKR!09%q`lRMH*wrvQ0re0__8M5@(OSQ z3{ddD~?I&dsVv@>j!t^SfyA$h|3d51AYxi)ZG(;+=7-Xi=j-56#j;jkK=D5QRq- zqvfp`R;hdX{m73U3SQmKq@W*XPAk-q*SgA|5>e8bA;=eeh8Ma;Hk5KgB~XSvrr~!3 zuE4|s^#6i?GvuBnSEq=GXa%+lSu8a{c_zyR^O);LpOv%K9)SavM ze4^wrU1-R?40r17C%0RVg88Z_v%Ir!eUsb`CS5bz7Kr7g8a$dUSKdEHkpml|kFY`) z3@-EpbSEy0hz(rr8PXwP6E9NV^7To(8(g_1{HH2silH2OFO|opPJbk2MvqG}arrmS z=Of{v+D7v*iNquS@=QE73ByDvd=a;jOQ>fW*0&daC$I!ChgzyR>r8g93C;a$$AXzT zHtZf`naAdqYxo=;Taf0hXkVJmQwhIZbpP#<2<&vxVRnWdElQeD1QofE#IfSk(2S({ zs03-JHHIj-*`!KA1tP1)ElWCp**kUiQPod!Xj4jR@jq@D9Sr`0aZ2~OiDHY?<4b0| z$r1F1A-t;^zVIEBdYNcVp?~c5TXE4RK{US4Z}6ZkRPzdZPIX_7X#p;=`)d|2F0J#A zTHk>bE*$uG>}a*5FT3*NG96vW&*#87<_J=UpRv3p@fVUz`>o+r0I9kPLh!U{+>5DU zfduXhuJmimG4QhSO_bjwAlUxa{ZZe^_{AeTo7}k9-z=QW8;5fB{zq?L85dR8x66Gi z7zhd~N-L>SN;e|i($b)GcZY(42n;cVLn_@U>5w8I4Fb{~1B{g900Ycf!{Gfq?|Gl| z{?7Sw{4_t@d+oK?-h2J)x~@O8c$adqrBHi<=m~TyVtfvuL2{^dj$)bSYyDGt1ZKm; zYM^|4=gNeISe}de(6T?=*Sl(sy-O=k)6KzHJzeEfXiqjB{ z86HB3rupj|9kYeiWH@87isj~}03VK!7 zP?HJ2(_Hox4n3QF$t$*MG;Qbk9sSo)M_uwgk-w8!rqH9?tBth{@xw$eR6zl|X1vug z%BlwjX%;sVZaH;3G_@dX1h|&Wf9-_#_BQ4dmZ<(h(G~T0FUISX&pBx9A1m1Y_Nk$F zD-KFZwxIN*4VOpZ^EgqTf9Z=+IFMNw--;abXgR4oy1M1iE>^zLG4QoRvvHcXBdr~y ze&U0+AI*1LdGB_>(IsdXL}1Ns%NL6&ft|cN@@QON*i2 zAp9sqz2(U2M?{h7A3~jT_jnVBZ`)}_``g;b^y5c-TJ^l|G_qrEYOfRi9S*PSSTal= zO?q8L_$u1b@;kybd66K$k9f#UGabGCamtbbRQc^*s0!4X5GGXB`mLQjD@LW z3-}qAii7Y{;Q`-HJW?IkKxiWY%QQShXcH+M@*h z6W1fvP<_3eu};U6ex|&nOyb!;kh-Z)U!0xH9j;HYzn0c2 z>P<8KWgTZ}0~k=RE?Q6lJ5d�Rm9r694c;arN*6OHR>ydc1n4x+@e#61xw&*BV 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 MN?Ee_iE-fn0$q&tYXATM literal 0 HcmV?d00001 diff --git a/2024/day03/image/task 7.png b/2024/day03/image/task 7.png new file mode 100644 index 0000000000000000000000000000000000000000..e16aa39374dc1007db4561fc0b7a7dfd5c90a891 GIT binary patch literal 7898 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≫}(x{X;Pt$>>fDI)mdqOIe1M)bq} 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 z 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 literal 0 HcmV?d00001 From bdb3d8f6ecf393fd53f229c5df7dd1a7ad12cba3 Mon Sep 17 00:00:00 2001 From: Bhavin Savaliya <41487075+Bhavin213@users.noreply.github.com> Date: Tue, 2 Jul 2024 13:32:16 +0530 Subject: [PATCH 188/394] Delete 2024/day03/image/1.html --- 2024/day03/image/1.html | 1 - 1 file changed, 1 deletion(-) delete mode 100644 2024/day03/image/1.html diff --git a/2024/day03/image/1.html b/2024/day03/image/1.html deleted file mode 100644 index 8b13789179..0000000000 --- a/2024/day03/image/1.html +++ /dev/null @@ -1 +0,0 @@ - From 2a5ed73ce69b49dcf1c30bf821b92de760e66730 Mon Sep 17 00:00:00 2001 From: Bhavin Savaliya <41487075+Bhavin213@users.noreply.github.com> Date: Tue, 2 Jul 2024 13:34:06 +0530 Subject: [PATCH 189/394] Day 3 Task Answer --- 2024/day03/solution.md | 51 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 2024/day03/solution.md diff --git a/2024/day03/solution.md b/2024/day03/solution.md new file mode 100644 index 0000000000..511d12965e --- /dev/null +++ b/2024/day03/solution.md @@ -0,0 +1,51 @@ + +# Basic Linux Commands - Day 3 + +Task 1: View the content of a file and display line numbers + +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%201.png) + +Task 2: Change the access permissions of files to make them readable, writable, and executable by the owner only + +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%202.png?raw=true) + +Task 3: Check the last 10 commands you have run + +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%203.png?raw=true) + +Task 4: Remove a directory and all its contents + +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%204.png) + +Task 5: Create a fruits.txt file, add content (one fruit per line), and display the content + +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%205.png?raw=true) + +Task 6: Add content in devops.txt (one in each line) - Apple, Mango, Banana, Cherry, Kiwi, Orange, Guava. Then, append "Pineapple" to the end of the file. + +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%206.png) +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%2066.png) + +Task 7: Show the first three fruits from the file in reverse order + +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%207.png?raw=true) + +Task 8: Show the bottom three fruits from the file, and then sort them alphabetically + +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%208.png?raw=true) + +Task 9: Create another file Colors.txt, add content (one color per line), and display the content + +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%209.png?raw=true) + +Task 10: Add content in Colors.txt (one in each line) - Red, Pink, White, Black, Blue, Orange, Purple, Grey. Then, prepend "Yellow" to the beginning of the file. + +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%2010.png?raw=true) + +Task 11: Find and display the lines that are common between fruits.txt and Colors.txt + +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%2011.png?raw=true) + +Task 12: Count the number of lines, words, and characters in both fruits.txt and Colors.txt + +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%2012.png?raw=true) \ No newline at end of file From a1d962f05237a74e88b019110ea8c3e2bcd0b951 Mon Sep 17 00:00:00 2001 From: Bhavin Savaliya <41487075+Bhavin213@users.noreply.github.com> Date: Tue, 2 Jul 2024 13:38:55 +0530 Subject: [PATCH 190/394] solution.md --- 2024/day03/solution.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/2024/day03/solution.md b/2024/day03/solution.md index 511d12965e..56360ac16f 100644 --- a/2024/day03/solution.md +++ b/2024/day03/solution.md @@ -3,49 +3,49 @@ Task 1: View the content of a file and display line numbers -![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%201.png) +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%201.png) Task 2: Change the access permissions of files to make them readable, writable, and executable by the owner only -![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%202.png?raw=true) +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%202.png) Task 3: Check the last 10 commands you have run -![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%203.png?raw=true) +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%203.png) Task 4: Remove a directory and all its contents -![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%204.png) +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%204.png) Task 5: Create a fruits.txt file, add content (one fruit per line), and display the content -![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%205.png?raw=true) +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%205.png) Task 6: Add content in devops.txt (one in each line) - Apple, Mango, Banana, Cherry, Kiwi, Orange, Guava. Then, append "Pineapple" to the end of the file. -![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%206.png) -![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%2066.png) +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%206.png) +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%2066.png) Task 7: Show the first three fruits from the file in reverse order -![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%207.png?raw=true) +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%207.png) Task 8: Show the bottom three fruits from the file, and then sort them alphabetically -![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%208.png?raw=true) +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%208.png) Task 9: Create another file Colors.txt, add content (one color per line), and display the content -![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%209.png?raw=true) +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%209.png) Task 10: Add content in Colors.txt (one in each line) - Red, Pink, White, Black, Blue, Orange, Purple, Grey. Then, prepend "Yellow" to the beginning of the file. -![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%2010.png?raw=true) +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%2010.png) Task 11: Find and display the lines that are common between fruits.txt and Colors.txt -![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%2011.png?raw=true) +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%2011.png) Task 12: Count the number of lines, words, and characters in both fruits.txt and Colors.txt -![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/main/day03/task%2012.png?raw=true) \ No newline at end of file +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%2012.png) From e5bebe04b6e9ca01f99a507bdad359451d4a6cd8 Mon Sep 17 00:00:00 2001 From: Bhavin Savaliya <41487075+Bhavin213@users.noreply.github.com> Date: Tue, 2 Jul 2024 14:13:35 +0530 Subject: [PATCH 191/394] solution.md --- 2024/day03/solution.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/2024/day03/solution.md b/2024/day03/solution.md index 56360ac16f..3f094c9649 100644 --- a/2024/day03/solution.md +++ b/2024/day03/solution.md @@ -1,51 +1,51 @@ # Basic Linux Commands - Day 3 -Task 1: View the content of a file and display line numbers +Task 1: View the content of a file and display line numbers. ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%201.png) -Task 2: Change the access permissions of files to make them readable, writable, and executable by the owner only +Task 2: Change the access permissions of files to make them readable, writable, and executable by the owner only. ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%202.png) -Task 3: Check the last 10 commands you have run +Task 3: Check the last 10 commands you have run. ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%203.png) -Task 4: Remove a directory and all its contents +Task 4: Remove a directory and all its contents. ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%204.png) -Task 5: Create a fruits.txt file, add content (one fruit per line), and display the content +Task 5: Create a `fruits.txt` file, add content (one fruit per line), and display the content. ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%205.png) -Task 6: Add content in devops.txt (one in each line) - Apple, Mango, Banana, Cherry, Kiwi, Orange, Guava. Then, append "Pineapple" to the end of the file. +Task 6: Add content in `devops.txt` (one in each line) - Apple, Mango, Banana, Cherry, Kiwi, Orange, Guava. Then, append "Pineapple" to the end of the file. ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%206.png) ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%2066.png) -Task 7: Show the first three fruits from the file in reverse order +Task 7: Show the first three fruits from the file in reverse order. ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%207.png) -Task 8: Show the bottom three fruits from the file, and then sort them alphabetically +Task 8: Show the bottom three fruits from the file, and then sort them alphabetically. ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%208.png) -Task 9: Create another file Colors.txt, add content (one color per line), and display the content +Task 9: Create another file `Colors.txt`, add content (one color per line), and display the content. ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%209.png) -Task 10: Add content in Colors.txt (one in each line) - Red, Pink, White, Black, Blue, Orange, Purple, Grey. Then, prepend "Yellow" to the beginning of the file. +Task 10: Add content in `Colors.txt` (one in each line) - Red, Pink, White, Black, Blue, Orange, Purple, Grey. Then, prepend "Yellow" to the beginning of the file. ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%2010.png) -Task 11: Find and display the lines that are common between fruits.txt and Colors.txt +Task 11: Find and display the lines that are common between `fruits.txt` and `Colors.txt`. ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%2011.png) -Task 12: Count the number of lines, words, and characters in both fruits.txt and Colors.txt +Task 12: Count the number of lines, words, and characters in both `fruits.txt` and `Colors.txt`. ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day03/image/task%2012.png) From 78d3e244ee3801f77a664ba9e11a2ab516d665c5 Mon Sep 17 00:00:00 2001 From: Bhavin Savaliya <41487075+Bhavin213@users.noreply.github.com> Date: Tue, 2 Jul 2024 15:30:05 +0530 Subject: [PATCH 192/394] Day 4 task image uploaded --- 2024/day04/image/task 1.png | 1 + 1 file changed, 1 insertion(+) create mode 100644 2024/day04/image/task 1.png diff --git a/2024/day04/image/task 1.png b/2024/day04/image/task 1.png new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/2024/day04/image/task 1.png @@ -0,0 +1 @@ + From 59385d88e7e50af81328f4817b5b8a3b9d240963 Mon Sep 17 00:00:00 2001 From: Bhavin Savaliya <41487075+Bhavin213@users.noreply.github.com> Date: Tue, 2 Jul 2024 15:30:45 +0530 Subject: [PATCH 193/394] Add files via upload --- 2024/day04/image/task 1.png | Bin 1 -> 24856 bytes 2024/day04/image/task 11.png | Bin 0 -> 16899 bytes 2024/day04/image/task 2.png | Bin 0 -> 7408 bytes 2024/day04/image/task 3.png | Bin 0 -> 11716 bytes 2024/day04/image/task 4.png | Bin 0 -> 32981 bytes 2024/day04/image/task 5.png | Bin 0 -> 24098 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 2024/day04/image/task 11.png create mode 100644 2024/day04/image/task 2.png create mode 100644 2024/day04/image/task 3.png create mode 100644 2024/day04/image/task 4.png create mode 100644 2024/day04/image/task 5.png diff --git a/2024/day04/image/task 1.png b/2024/day04/image/task 1.png index 8b137891791fe96927ad78e64b0aad7bded08bdc..ffc9913f6e2a7a5f06848715bfa23a1409bac5b6 100644 GIT binary patch literal 24856 zcmd?RbyQS;-!@8!2r4KD2ofp+($XD*bhk9pAwAU4QVP-?Lw73OAt2q|ATbOLLk%#) z+4#Gk=ef^$@AaPd-?PqMYu4=9d(YnA{#>8yx@Nv9D@r}aCBsESLwhVE{XrEC4U+{8 z4PD^Dec*@y&r~t+hVHB?C5Bc$Ob!D++_QME@E#5AXXL}1PguZb90zG_XEZdt&bt?S zkA0yj8k$j=%!l{t?gslyN?%`SHHzF=EKkigIkZ%I>(5jlK7M98o+|1SrUDid=XjDE ztZh0f8SFzcB>!ZajD?d{=WSpxdZZ{X39CUs&C}R!QMpHt?#Ei$5WBUfrr*1lyr8hs zzgl|IDR6zT<(=-Vh}4MBWza}0Zfc`a{lKsbf)uOKKniwl5Mx8BJhwnm?>3tA+oW5} zzq@h77$kpp-U{6VstRn%;0JntcQQ|()c@TPg}rj{zsFq@ECm9AKC~2TV=?+U-JN;z zK#y2?9~Nq|$WDGrg~~%>ej>nO&+?gf2W`;M{MhT!{N>`o`Nq%7-w<_HGE8niGFSgI zT!Q0b<5E1cJ4v3b;h`FTjqXB5BphrGG4|*I`C@Hq3tQ;nz3Z`VGYsvx=6ybDByvQd zxj!a4{i^*Qnjb+!my#aA!8sh?#rUiXrsnMpnQjSUj6?oJ@sv2CGtLvH$kT4Qq~~T& zu09FkGuf%z^*3o8jz8r->%rsOse+E?%GI=^s)y)fmbBwB(Ms%8gKnYZ!kZilRWqkc zfyW#l27qRxOyqD#cByL{&+1T#ESU~l#WkygX~>s_Gjo=G3@m!bF)V{Pat?56?HEz0+C{KKlJTvFS_AkP%qB9w-z(093)#ws+$Yt#&1&V>0Kd{^gjnH3wRCsJkQ zr|ZGWbhnFQr@dY4r)Vr|eTfgFKcGNE6aCh8pT*V2u*QB`Awxby$7clwI%QwIz)>jP zv(|%`OfMSIDeyOOJ@P6yIarpnDSL0!V(?3$8c8d=?h3IUVhR7E;IN_STUH)GViQn1 zKK%)**~NFcd+g(Zc%f=931?p@SCtc{;%Di@#87v`E?zWu_0sfD^|EujDk4aH?;rps z9WNzzSnI$Z-#65hph~P>(AAlDQdW9$290rJYcTOzyN0d_9=jrKohW(j9d*-$dV^N* zX|6`Jhe!5SSm)rRzc%MM%wF|S+p8`wD-`Y!Cx^IT1qz^{x&1&HJ`$t0Kq*>)TUl2bTE5cJ5jMizK|8{B@EKz zjfXW;mQ8-AJad^-=Pn2!=v4?E1b4YUq$ok*}9>!Im9KZz

94I*_HJ0Y;By)ph+5zE&rhT2rfHjZSQeLW^|I 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 literal 0 HcmV?d00001 diff --git a/2024/day05/image/task 1-3.png b/2024/day05/image/task 1-3.png new file mode 100644 index 0000000000000000000000000000000000000000..d5b26990437ada9a729fb962a224bdecca0b8016 GIT binary patch literal 43690 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

8u#rZcC(x!QL{ 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 TT~{0_Khspdbgt;vTR#5*xQ^^d literal 0 HcmV?d00001 diff --git a/2024/day05/image/task 1.png b/2024/day05/image/task 1.png index 8b137891791fe96927ad78e64b0aad7bded08bdc..1ac28abb7cf5b99c7ec4c5e4a74826835f908b55 100644 GIT binary patch literal 13543 zcmbWebyOSOzc*UJinma-Kq;jZhXTb(f#U8iDek2}@lf2|p+M2#UR;VhL5mX{f_q4? z8=mL)-gEAK&-=%{YfWVKWM$3XvuA%lHlfOjQh3-D*pD7P!jqBytorEDlYG>74=fDS zdk{O*D(d60ld6>1qw>*LFw_p3g{Xq)qeoTII5$9a)c&)t(mGC$9^rRAydL*C6q-JI z#O)>XSybK4@F1hvey?Ssa{Ibs9X;Z8iE1JiR1>9agPlo=F83n1mKE>DHsE@@3 zgCE4c<;EJtFVLFeZXw67RbJ4?3(P8hfGm4xCG?+Lx>4W)IU=7-}bGwN|nKXTlHUkl=XRQGW!bu>ukidu#=(o{ll-hzo%`|6#hm03J7e`@i z_n4KfIc23j;ivbJ&w5SBFa@~$CRzcl2^K-X6t3fuh>0!yT5O&j`YtTMo-J86@cC#` zC17|dvz;P}aA~Q-z*!x>9dv3%Fr*{RG(3*HIr%%Be{rvOVnDv_^gFK!f73}6BuXoJ_I3X~lT=LS{niY8tqYinp z+`>tT^6O?8F-bGo1pCSCbX+Mz>hPpNF=&XxVg-U1QMugG{_gUcx?Nl4z?dqvxQUvOMhtblkpWrj)Pgeai+;Z}K3t|) zK2Z&KwP88L#nVt}VEnfhb;I-F%iitd4|wtiMd75+XNR*kE~wJoYvpJZmFO_*C;rH` zi*&cY^lO~JGkDvM^d{%tV&+V`5@HQvY^wr6@wR^8C9)^RJh@rKn9N20h%A0yKuEO1 z)XvK|RWv*}hICYHXFWthzT8;fm7jr?`!JH*sdDfsPi3V30k1d$#(DK zL@?Ixz=ZbnJ25m42dhe@WJ~)A_A5fTiQBJhZD=?cBFXV?iF92B*4o@%{{gp)dv%4e zH4tI_jFy7@#Qt%35B?fonHzpl?h-pIXTVVFZ>LM|Wvb00IoD&}8tMFw*OZ$3vzZQ4 zN9oTh#l4bRU*&z&>N$9Ye@z}RCm3^6=l1dDE|I?XMHWpUag8;F_Oq5YoOtrmk7rkp z@BL0&+SlSGMA}uQ)tZhm+6#|0KK|T<)A}lLiiZSs)Rc5^*Mhtz9HL9^;x9CV0t1vZ z3`|lzb4dR%)Y;r(Y{x>=gCk43c9S-qS@2mNsQchyFlH@bZ7IDc*!3n3J6)nmt>>Nv z%W?DOrZ$1+s9OjwZV{(Cb&$MkF<+vi)n!WVzHEVdQ<55AV(0qc%< zD%^~0Yk#7g^CRms$lJ+rqBjZ`5gx)>e>~pYgIsyh$zNzh-Vb*_qZS>e24|(Jd{{O% ziKc438OHGfcInz$hZeh@q_Y-c_UlGP~(B8c*FJ-r?VV{du3yS`q=Q;5-__qci%bf8Cr1pCz}2pYmF_oa`ONPoc=EkMDumwu1g1EI`-8cI z4nj$UkEBUC23iDX7pdvoVq49#=}x?tajH1}>~Pd>GcNnxFzut&eNdcA)w^&Ym*<+` zj33~XtEcb@gN6nP38$yjsV-T>X~m5G367Kcf;+M05sbe_{S9@A-|BRs307#sp_bg^ zYt{7Rw;R(XrUzrl6Zv~w%Pwzju2w~p%~UDzx2|V&GYsvYrl54P46yvWG+Ygl=1-h3 z?K)D+_i1)o&&dzpwxsjDFB!gx;JvEXux~Iac;|N882hxCHx}Z|KGX?rV&Ayck#@Ab zkKJUCRTlZY$3@K7yef0Lac5vOcNaF5ibd}>LWdY)L6nq!~R#mwK1R6|s2cI2l`NmesCtuPsfkCk z4FXsE%G?6B_xeHXie}gIGMsKFm^-M4J39L%>4o;kI3BEY`t+Pb_uXYm?wsmb;j^^D zN-WY^%z_lS_#RjTxxI2#aM{rs+*cJA*b7ad3OLv}qH9lU)V^&sS6}$z5gYv+ueWwa zh0Q$fX*A#~QP7)@ytvbyeAq5kOVF7fLOjes6M1Ly&TmqNMx8c4Mp4yKlwGo@_oLZN zZGPO*8Jp>3a8sAM+C|`zsv6SXxNr5Y^5p?}RQ>Z;a=yUJBB245(jXPXo=or|d*I)| zfia|2`rYxX)rzo=pR5+u^11~!!HGskNyg#|v?h4f8d5VzJzlKVgu~`Rx~SV%Gb~?Z z4S~(tf8>CspPvRW%J+=Y3vyP*0Fk>J>@6F!PcW%?;I8r2@S9=dMnOsI87$NY`tJ0+ zpH?fXoo^x(lz4n=y&A-yzkBVa*tRt0z4Tq&jE?)P5caYI!3~q~;|x)_f^Fkd%Pu{e z;I^ZV3(T1Jia!uDmT;fgadP5ku(Tzb3OGH~Bzck%d=hk7(tX3YZz0VYiy1>3({n?m z3n-hEsusm}4<4Se>NdF7F(6DJ<&$aZKk}2O!COyk#ELv+2BZ!NsIl)l7!nlS$-2v4 zEaiyLKdm8{3+JmPkS2BC(3FwWW`py9Te45S3+a;3)5nBl$o)<9MThCmc3FflxG+O% zmF0S)x1yEZm8m`d>0zH*SWuR}i(F&|e#AY)B?qx7GxTK}gi`v545aA5n^$h@TViHb zmm<;?J;0i!`8B>+f)~A5PwaMqy++X;KC!G8OHQ4es_)A-0nL3(Ek-c}uga~%?}V)8 zQfDMYY2gB87C4Ix|8VpT(Waz7R1-!s;$k@kT{7zX9s(rmjb1J|D)BuDnb)hT1Q&I}5xDblftuga zvzTKj(Gbg#SIyE{_d?G-WfXU|)zV4VlJmYam6^Pvrl1aFjl<%Ou=?$DUT|nLmcg?6 znzt*hyEs2HNRSnHBRg-~ zalUz^e!;*o@`YCYIx1xT?yyTW%?f(5mO<|mi0>M7Q=JK?^9+qYcsg!K4g3?IDa{L> zC(y#+J8Gj&J}u2;OvF@Wf)#<7Sy0!?{sx6fZ{dK8vuMAl7y3c9BWgZ4f@B3gmS(L& zoRLFJD8zY|4s*$#!%oh7X9d;qKMzBGG`(`X%JnOaI5 z6h*9>A(1LP=(yG44uj>5W)BJ#NjYv+ci>)ijeCU;6Q z{)2>Zog6{7^8fjM=53st@E^F$XPbaRF8_e#ZP^G_fxm~3g11b*32-r+5Y&wy6Rk z%B)b*o=SqU+*0{knXHG=XH#m=oLJz0b=lO#AW6u!w>~G*KDN^pMSTzG@1%jBSJ4?A z0QtG_RG$Ed*nmDe7QmTbN8!B#z-a&APMlwN7H@rA#^X2&##08e3M}AX-F7vK_d0XE z%#n(b9ye1#kSV20wsE4rt0XIn?MrQQ`O;A)ze^t zAXFWcEYRRE-#NibSUTf!WXbAS_bvk&ZoJPo|HZ?ha~EM;H=}mW$uiq%in<)2N39h3 zCkw8Jubz@Yc)t?r?T{s>QMbPB@Jgh7ox}%O(Y$#sS>vs8NrAXHgUtkA&1_sH07iJJA-B3CkpZZW1e zhO>Av0A3d{O0v_v?MXOsZLK`1x`bv?JGPBzcQBV0(xHuehJiSVHSB< zX2gwiiN`am+$cM$2-VY+T#WoqBw0he6cy>?z? zBD`FBxQTTrXq@0--NF?e*+LMT6bXD{?uk6V{RpU__57H$Kt^li-~%*RF4PBTt!-_Z*5UldOxU%_Te$D5 zz)r&Ky*tg@k$}vFRj0uirvgUr`KPK!up&{D*vsz`%TwO0QX$=$$(c_Y+bWn-s9U?r zk6&C-oKuHe3o&It+1mh~KNX$D=&bijW<_389pc^&-D)cBQKJS%QF)rckM|4BEQZbK zV(TBP?1b55_<1xBcQ=eO*hG>%=!EXiJ-x;0hks5I@`F@> zQ~sz@^dBLl?f)T&JX8x**$VIauX-{2-VD`*+Su?Z^Z%^_!#%+NUO4Wgdn@^0b;sro z(;MG%0iLlz0FVZe?_)~wQV1xuxd_LEk zn0rn;m-p%9`6E=8FRjPqf}Vr^&T(}5z5G{OVTNmb4cIv>Kj9k&W_!(deItp(cB&Qe zY2k6Qy1m!*S_o!-o6=?77yy>?zSnMP$I{QdUiI2^`fPXbjldIpge*sRmR)4*$&rF8 z!3p|1+KgF`mh06Ta>e{+oMZozNjjG|p!AjWnB!AXNq3Gy^!VH%AHQr?q?wRm0x9n3a zHsQz(w8&pcgi&9#<=<%2oM8y_OHPboC4-kB&!XH&I#~k8M`%viox&bbALV;;8_Huh z1;6!O7w{WMlZwGLF}WdJ^HIA}pDyr%IIlLJ8!gEc9;Ge%?zf4#QFIrbdY&^P?2bIi zDIz8~Z7rM9S?YhZL~Xo-c7fXad=5CjCl-BsIini9a5gWYG-K$#VtH=ih0i|uXDYMF z?YZyB4eIW!O6@B~e)YH^TaFIdR7hVtbHdn#Rip zlVznJgY5lb+4wajk||>HAtg7JK8Hz>Q)1Eq|A$*xtC?>MtY1h-9FyO z#8iT@4r|H1vdJerBB|8ge;qX$wjCode>?F)ykSv~s}Jt(ngC{7>VOWvNko6Aws;na z^yYfZbfc5xA#GP4_E7SMm2dCc$3{eFz1AtJE)K8^bU59ThhPH=H~)v)k5 z&I-}OZ;=04|ItX7dcQLB_GkOoFju@;b%+*Uab8$5Na5Ae*ecRr< z@OrWr8kLyphkH`e>tnu#7X8{hdJ<9^OXW~m)t96N+Cpzr9+#LVnjZg~Nvs&?$T>2} zi)8_i*-aUMi4A=8yOxqGHCgbAgp_XvA>)BRXrEkaV zYZpY^PJN1JtBNgnZtOql<#y|q2gRqkr4be2C~m^1J~Eq&fQA{~b!@^JaI3x>iwkR< z?jUV=>hxALMT8fEquze&rZ3D8R>3*~BOB#K@Ip@8mD|>S=Za;Yr5?hXP4(*8jofg+@kY)wyi+`qyV{x50=P^6 zoLdfa{q=#=)gW)2?Kb;i)>`2%$YKx=2u`5Oe>lQ7pXBr-)se&TLy8;)YLopKoTkDc zkzREVtAE{&jdP({n|8QZ>@#GX78{i+AEnbYtwIc9ATjm$$hmOW1bJKWI)jox+e@MM z^>vKvj@gob%}wT8o0OEuXCEiHpXkSpD;WmJ{>3k&ft*8rd|Z^`av~Pc%yhRkb>anl z^FGD-d@G#e9A~&&F`&FzgF_r2W#;J{SvB|lWryPSC;$0YvIGqw&UL&yyF}N3l%i*b zKK6OOSMN?!56yJ0)Zu|G@KyPPPWk4Z1-L=x<>b z=lPdx+`>$IcFLmeKGNcLd6!yxDYgw&sGf=W z8gEvPakywFj+DHHb-|)DuulH>?+&dyp`^YR>%|N8j;RpMh&sz@;ah6FseBiTZ(3Q$|GXr|u$!*&=BfGNDx|bxG8t=uyL#vNN^-XG)FF zJ@Mw$r>EYeqm!8l;y-OSbMbW2mn9X0@8rOMoU!uzkpFoTZe9Rhry^_{6c{v<@f}HaWkmA1~_?Z)v{m+HBvesXyK({>^5Vd6aBmuy{ zAjUiGbIS~4=WvCj0kV(xww%)c$YP7T;CYV+S*+XAhN|Ojx;UFRalaUGlTUDi^S6klVz(FU-!1TKa%>) zxkVBK*G%*7i4w#rm2uNZ(sZE7!?SRpI zfpP$)Y0wbXkRcXVSm;5=(3lO9YEWc6T%{OnBiZvSQP(T$C}Ty_O=+nxe85qPCF&Q= z1R04MT~GiU`40_x9sf$5YQ}n$I@Kyl#}vNFSrLjI{#7)(Kg=Ca3)0Q^!LOFUf*Nz=Z9ReLpOMToK1gkcZU&F0)xB4nrxMyIJ@V$Lg+GM-E3_fK z?fMUd611wei|XWnl=S#zS#>Z1$n(46l!7@`bfn(@AhXRd>dV3nHlO!_qHIVw=_@J? zSXT0lVdIa0*lJbZl1aYp1jb9bpW+x!B#F|2x0dIytX7)q7oTrd3RaG~d-Uy?)RB zHO@H}ik>P$(aY@goMKZ8^dZ@0OKu9DGU`SI<>S#$5!*<$Vrj}Hx ze`urV-qm~KmiMvs^OI2RMmZe*L7!J2GN)G3>lk$HhdHVYqI3wX*k=@Ggq2;8>Y2Pf z-^5{)-~G09e_vjVmw6!vO~iLLkClGcgHIc`Z!QwsUG4<_!v9`M>M8C_3i>dzn|Xn0 zh3g=LCQvlH-}zrYmyIO;5=TBAiv|A;Fc7kr>Rge7O6z};i zzB~9~ym~@iK5MmaBT0$5L1sE9{mC?I_T6}!RZgU+$!dNp_)Q71Hmn=lIrfg4`7@Rk z3$!n4UH}Ua9PQz(DqzSNKu_|KJom4baxG3RAMTk&);4SFkt)xu6{8PI4ZA*nzVsu8 zE%H>wmV3}`$A};;B+XZe0YN4Gm;J+EEf%q%$r*%(E0#nAR5-^=Q()XPDd}vcKzyF4 zf?#gwr!7rL=0=sfp>B3v)ldu1=JoPb`N6>RoT7R2a%D^oXt!bXS~k8h5~o#IxoS}v zS?gLLlZ@O^7ZKi!CBClEXRrM+W9Z|A95pgRENoZAiwMqA9`NNuNDw7!f@c#RG%|1LGQ=>>7i?mGZ6yUrn~mHYkYfPbXMNnUQ&EN7aAj8H>T z0Ry5=yc;wyw$Yx}z@=tlxjVa=$>!jddg`6X5r= zd$jdotoL&FrxUsz!G~^^7Z23iixkv?a@A*otrAoh6=4nh4|EX`_+P~GCk>_Ae_VGj zn*RfzJeLyd3!>_NZvGF6MDffBcH4xo#4)60*+gJapk1`ud`i|G%7qVZME@)CtHz1< zD~F3-F2u%vlow*Ene1*}O+-4=&fIjf0FkUqyl_ytYv=56!(IPmA*tL12PdBnqr@bP zwp5k*MPJQqj8;>!Rf`NfI&PM3^26Z9g)^qTCZ8rZdiu z*EVLyaW(gKzP?MTs21jfy@Kjz?aJRg81G`+Z*5Y+%|yXWT=H4CU-3nfQSpE_oJ>ip zN20-2d1s>3@$>{vS!7aL5Dc`xHF-|HE+4 zSLz_|uyy#~37%B*`RY0Mx3A22rRRI%H+r-w%u8burzOy2QIob8CZUkYFDYx3d+;S= z{8?p$>NCba5IYWGUE|ye3LrM8Z~3WbyjaFyDQ+3f_W8nE`8`W-#nzF454MZ#SHuGC zZY3?GcYM-z4+d=H4#X= zs-`icy_LCxejIwB+uq^60p9}B?Nv6>yLXb~>k3XA`Ty^P4DS;5Vr0a!;LxfL^GMv= zr_C$rfD6{9ywdH-4u>Q&I-mqWH;PY7|m9ar0eGF z8qBE$OZQ%VNdr3&jvmrZbH+~w#@V64qmvAYSYOIoSPzx~{7;3*v8_)xc3~~n5ve~Z zqTe*tt(}37)4mqP&e;9piF=vx*+ZU(om*B>3#;9sVE_7vLXaLwWcw zvDx^stFXbfG*o?Dbco~bL!$a>!N(LK_cnoG94X(+iL!wrCnXtsc#CM1fM>5PA%0~K zQG!4g40WaYDP?PK!Ly^vFq%G!Z%Er+-EV#N088RBVsn%8A9d8=Z>|JlT@fR zeCg|PLZ)QYPF4Ij{WmBV_ULUEN$!*%N9jhLvPAUXXOi`^`6**-lzQ^NL}6TYjJwF9 z>&&8lDBh|;wg!Ce+?t=-8AX!70HMY{5wDy;9?Q>z#;PIpdvPk>k*7wLcZMqlODfAA zX{n-J7i0=!91^h>%rW77F2jO&LL3lY%GnSb`mQKRg3D_z8UfJ->CmqcrP=C^wZv!8 znL<>VD)`JU3F}L?ZIrCHk4!`*0*Dr|kBTU1UiVOm>N)nTVIgTFft({ImOT=}Ns*>_ zo#q1tg`SyBaE!=8mhX_3cT6mu=m)-xTem20JMoU6udT@Y>(Q!X>6h#iUNcOfAmX~e z!kkUhr-FRCF2!)ec*dSg2jOBkP$rb-yBh52DWgx3+Lx9(N!`cgP_XA z*qP*GieD(X)@=;MW~vnCc1UPI`nCOSr^kQa{lybw&%Z7| z4KV@q@r0+uY0a{c9IKL%|H}lN1{85wOjFtf5IF4ob$>*qMsAn#_Jsjl+J{lG^E`e) zGV|9SoU#|{Ol5U!-HIxo+I1U%ibY6~tat}rXQTQhHeU{fIYBh<8+P+KLF8@Z@I`ix=$jVHUMIWh3lHn1i8mWk5``2&02#3srQIgv_(IU$*01%#1~wNG^}b*JPFk zxmc&-PI3`+>eLB+sMwnMYvf5n&MJe}lBx;#>H2-BFfRJspljgK8ODTQP}bxEUJ6W`^T><_%ci7g$;wjd%9Jr8L9?)jwZ9g56d!stB0GMudvqPNQU zgwHE56+Vyr0mt9qzuil=wPED)&M`(U(b*|1*vbv4sCX{tKhUxll0L@26owN=K*GiYv>G;BMGbx`&iYc-9X$ zivgqTt_<4t((T)R!!^_EPqoQXWXE|76C*{JU5SrJn=AVAg-R@BH+>UiJ&K{&;i&tW z^8O(OdaHDMllvNt-?*W?kaB{__xXIS$v1oo|Fq`+e+0j8#yCNkeB3lR-F#ihn>pN!_8Co3gAf<) znIJHCic*(9g9ZYwc>4WKdZ*4f14n(~m!>oS3mHsNW%6cfO7zGARRp^srB{wc&?uC8 z5`1Xxlg=*TQQfhtcPaJbu-<{I6Y|VMaqN24 zyqI1+x6t8jE7=^kfLy%2swl@vuw^&Hy>0g0zG4-2{Yh{NFO#ZR zAB~e&aOwo!V0()Gm78j!L#LWGJf zBKnZwIuL4POE)S$TE=GC=Og&31#Mk(FD?^b zdz4C-2(wt22Y>oyODhcRa&Al(!g~eXaNgR%kafV#GMWtqb_L!uNRXWCLI{zcb+;=h zbGUkYE8j;&G}{?!>|eEoB#Q`N&~1W8i&BcmAa{*U?ly^ctedHa9M2}UdBZTz650*C z9s7iDxoQFZzm67)Z*2S%exW)ia=|q1vZ^AoQ12if^9N}b%=*r6lk?u=RRETM!v1CQ z?(0Bcc??A^F%Fleq6+jYaZ_cl;$Oni6_K9tc{HgMz9#_c8A6G8)v>lx7P=2YB$F%$ zf*F^V7?4emNLC(UK_1iWZHa!8?;8kbe$BB^kU7(R6x5{GXF}r@`ac@^pEmRdjhs^s zm1s~Vb+$8my4Lv`c|HIoL4Njk%@11Jpq+rolUBJMsa&Z$Nb|R{ujVQl-J%^A>T5Dm z^s3zowLVR3ypp>q6F!(AKv@db2pIp#1YLtqsoIvyDnq-?U0u;pfQ7fSz0W*~xFbe& zNz4*nYdr0)x#68M(j9YOs%0gh-mHsd1S6~PGwv+wFrC-|j;kTdijUS282DdsaFVx|tQa7v zWS_D!PG|hjOPJhG8H2ViG8#}q`&w2zD#1K78d$KtQG?0iNtqITy<c^jdWUWGmd=bM*F&4Ji;R3lC7&ToPgvtYs53t5-_+A4luDEG{*D$2aC z4)uS7B1Ex2zOCE^J{sZJ?zT=aS0jW+`$yclAj=)oJWMGZtV(inV86g=O)JbwMC+K- zGPpuK_G`@dV~CO}1t5-i0cV^k>{H3eElnvm=`4yS~bEnS%Y58`#2fZc9G^^nhCjvS%0-2ex$0$oqz?) zRe1-clH>!RWBjMPq#^bRoeXM8kNgnt^w6ys9?!K!t=u(U38M>bR?(h+i@9C`!qFFk z6rVt)%f|?4kS8ICK`6=-@p?`a@D)u9ICWSaJPWnf*d#^KP zkXjHqb|Ja=`PK;pySAeS;iqj%$>31J;BW4WZl-s(W!2l7<<*b|^H~)C22)t=2n)6+ zMW&{W=A|@jaa{g>(8}$KZ<2a7D4u=_gSN>m&SO5sM1<;7doGns$C{w31lxY5s^6t> zZtHxdgt}eM55=E4KPgh1Kb<%;c@xR{)W7eMV${Koo^Vnt<#X6=!@tRdjp{3_`bP_q z6jqU3lP&X;<)IBo;220|TWZ6a+BJM^P%&-0vl*4F=|G{72^9nXrBF5G`2^(on{fNu z8wIM+MuA2U?dR)rAJ+1Vo+>X*OWAh0>)f+>t=BVfm!6WFg)riZBNMPtW_1{kSKv%e)h@WL1(yJ)HDNMnds( JxtOuv{{_KLUzq>^ literal 1 Icmd-A000XB3jhEB diff --git a/2024/day05/image/task 2-1.png b/2024/day05/image/task 2-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f62a8a053ad385fdb6e6d92a29209a4338791c5e GIT binary patch literal 61140 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

dFw4-D@bA zgoMf1gsjTe42;xgyDQH45aL=4={{+5o}{aMYCy`6j^-MH6FVVva@Olx5&J5U7c7f6#b=AGypP8S#OXLd~5Xca$oZon2+YwB zj|2?H6vl*N`J>AQkuAlY{cjH$0c)Y`%SICfzxbRq*rjV8U-A@^_dch{>RzxCL_hwH z1JX7;4m-U^7D6^z*QuYpq<+mr&?3>?f-iX&<#(($2rS;ZeM;kDVqg&v*LovCYYk(^ z>FQ?L1&xv|mPCfx+Ft@5ISK1;Vk;(ZSlKm2blI}%6Q1d1*}TG}JXv54b_O+>0?F9| z&`kbmbMXUk7Q1lhfwV|ELc%s6qmDpU2__E}qMFJMx>{lq01BhuzYL~;x25bb#L6jhAi+{}bv9b_{0i(Af zNMZ%S8#Q0Dl^6vpmGR2_`$=xT`2@l9NHi5}`9$eahg-4*r~*H`%VNULY(}W`QN`ZdkTY=vO9m|RF8qL-^8KbN zbnI>K0y=B~7{f1`mScyhvKj&DxXXJX;;WSGolR#1K5vgL zssLCf_?>;zE>x_0KiPD)Fx7|Cta)UT<>x(TT$7jx{Y*Pu0oxaK=(I2$ zys}kvSFr~N=oE2$8~ugJT#VUWqD*4r(XgzZKOqzqC@bKAm0K-+zj*0~z@sq6wPFz} z%9Wap_Uov_Ndpr z&8|_R;$sfq*cagm@D@U&+lq-?!Nj*fe?X#owbOkKe={Klgc+A46`Rm7;r>Ws}SqLZVv

bD7Qv#f+^&cGkIg}u4g@XpBSX+u?{U#*P(7B^LE-Is+@`{_ms zX?;f6u%l!zA*Q*KDr6rZ?1cez0%<;W*#qp)>s8gn<09A>cX!^j)Pnmshqd$JOt|kH zK3egk*FTvc63G&Pq*2uKCu&Q3Njm9HWO)JCaANbl^OFtRk2}hFDNuv;18EJ*aYVvD z`y!%D{HtKr(+cGA!vGIq*F*A#{H(On#q1J5F5Ul%SWgi>`l5iXVvY4g8}D#@Fv8v7 z+YKC!JtKTKB}K3Bb@8KzyuKUFoPck)Fd?fn_{p;>Fn4E)Swi=e@m zzmYAnSgDITP1#rOM(sGL?#lPhMkrvJKemEx@I~d%9iK3WQqFDlE*PJI{a7B7e3|Q$ zi@ch3A~e#-k)fS>0b$z&4I)c!OnM!nt z^%W?TIoUn>H~Zj+iLHrhr=C4+s|L2IW=_i7_$?^LIbS3D6+Vfi&Yp)d6nlX~+%0cDT3J`rN^-wS95QL zJH^Ql$u8^EhApN=YJS4P9&qX3h7p2}U1zAXU#5>q{FuI~5p1TQz}o5~_#3OoFnVN> zBvkSA{Jj%#b|87E@5ptgNY9xoFlxgzm2Ify=2RC<_uNbJwPi|j3H82YU8rJwvaT#H zvryty+RkCu8eZv1R{FrKB3as9^{z*g!&K?#ExA#ys{6WRPmhO<5nY>a&z%zhb54>z zf^nymNnd0pUGeN+?E?19JqRl>5vRs$IJEh-+gwrP%J;p%_@mf0)qXmw7i0*9O9pa)A}RPtHZ;bs9$>lb_`B^5Sxsgg?mTkxv=pc5FWaK+ZhlmaBb!!NN89{bfo@Qk5y)eq z^-YHK3+a^&qv2RW8w*C3u-5QVIm>p0;#qP@KKyBb;J|FIyPm=1@9kIJfX-RTP0+}d zEbwUM8H60vy|hFizW!ckKjL>e*(W^KI-}zG4Tg`L3-VqiR@2*>awEQR%{hXPTsLG7 zT(5?G$?@Z>Qx!s_;0tycm#fA6^?Rcv#N3~sC>chlLn}n`qv4n2TaR~9(5Yi#of8tW zIAQvh*ggo8E?xTtC&ER9Id%fq%I*Uww~kA-ipfAsjFRS46a9_J5(3?3O0LPiAahjS zO73yTD-PnWQRxb$9MR9#PM6xjJHT_ONOB9{sXoNKL@kq;M-7{_eA@pwee{y_0FWvp zF(kH9%AxTmbqKxZwqK>SJ~a>J!B_gPg_hb`2@UR+nW(tEUe|^tt~>q(RWg(>lDkfs zKK!F0eQ&SiQ>XK6kxdkv@4OAD*@$O?W*^xbIszJBO-UGCxuyA0$58eOI7BSfJrA?) zhoJ5E#SL6cua4p+FIt=5m@Mul6!1^PKn=p}gLK)s-5h*U8lHlM^9>&OT2SeuQVLq@ zUXfVz$h+Sp4G-c(knnyu+L}Q&fwcO!KI=M2&nVZQ3D-|bG5s<=hi zU#(}aWC#XF30Y!`}#mi?3}xXt4pCvq^5yt71(V9{D1ji!5U=Zu0p9IQ;$43QhE z)V@@!-p;KbN8`l)5ww!fUWVKjmO5Gg><59FNpJY4g2&;Og38ZEdzqo=!N)+0I#NX8 zCJ5Z!+gbX(xVn9ziUU9vaz0&6!5x9zc?7Nb5El{;>>bwL{hxZ&zg48=*36OL$`R{( z_q*J7Q>9Fqk!#JsE0q6MuKs=Hza_0Cr;UH~qtKs$5{eE!tY8OIs{cuD`u|az`ftAt zRp4JlD&?(Y)Q4L^RM=&d5Epa`kAyjaMCV*?SWeWpW3&oI+i39vtlPGqyizHocmH?w zz}o%kYC!<}8Fa;)oC;Xh3wY;CNS1yL23(wseTT3G|VZ2QTH#vdJ4Q!*EKtAEmSr1C^>^Ufj=;Ilr_r%UHKhFES z;hTY5YpN-NQUT_LGFqKauz=*XW|z&%>Y}(zhDmSPvPz^tF85A@3BQo4!Pb#o$bpTS zphUn-e!bdksr?s8K++_!cm(3QX!Wg+E+ZBcLTJ8&y23Dvig$Un$~V^u&}tY(%zF` z-2vBwZ>gu^$tULYG3w;t8|Xs*^PB^lXH~kcQaf(ijgIor2b(x&&Z;q^$UCEAndFL! zt=szblb;rm)x+C;f>ZhR!Ly~M`npyk#RQ|9=i)DRCy;;RJou^FzX3xQVQx4{AX~}D z7$?rDnPydIeQ1%gc4-lAoM(jnb7P>VliKdilp=DT;QVe<5o$xPkfK8qLpi{w$O} ze)go_Q8OL_m8aMpQGbNk2Q&y(-8RBjsZSNwAkEYmeFnjt-RHgQ{Br&}3|F8@}F zlCm_j_Ok&gw6kcwHM@zUP5G+TBZKDmS|OS9{|G7c*loeF7TkZ>MiH8nFf zeT1$1#3F!+_vBFd4{%s@8-YY<5!){4?r&tltGh zrL1Y9vqU3xUgbpfE zZ38TZBR@!+{ZX3@l_hG+PBD7>e}9)6pk{Ru2w8XBfV^3AE)}V`&Hj*M z%u|&$Brt<=-iF~-`dg7ae>W+ZgO;mQYvC$p@6J1Ma?;D$VdI3h(e$ELmLtN$icHu; z^hp-jPZxwY8()IbCdpItuR+*_JW{6>lbWbv1#8uKUR=BRT+r^tb;}>^pWQzm;po@+ zE>heFnU?!MecMRJ-N$B-!Gzc=6_S)vUqeVOq{e#KtKa$hmK3T2^YO5M^7X{(IjRDo zgvoeBDfZT89_%_8>OIgU1*lnHtif~S=J;M9=j64PA2tqF?hO|hyq*())_|UT8VMT> zf5aIXCISx>SPLq}&L^N>=&WH@qqlnT^^9}wv>{0*MW2)$QrLxUv5%OBQH|FBjD!t| zwtW51bZ|UKq1M0Rq$v_{RR*~qg}{ZruXHK%beev|JSD4k3JM3ZQ&9AknPaU@&7LM2 zTus7!7HMnm2fg?Z)EYe)A@c23OdbP@oFedhCX(^YBWN@+;YU14nAQjJlyDy+CK=T( z?yhYRpr}J^A;m&-Z2aMAR5w1r8kn^bHhB>3$))s*u4d$}lNXH4zT7PvUf96BfPvgi zP-?NdI0NtX1z_+;1agf5+C%nK7Dt0ZVQvqyU0AeSJ!eaAlh@wro{ke~kS!TJmRM1n z*{v7oL(blBB9+g(7Pfs{4$tKGS+0MGO#EfXLh&g&;U0H`Ta4$&C(IR_#rK>ECK7ek z6VXg-r4D-o5yr`zxVh^mPmhq2{RjElV5G^)L*GD>afb0+ISWjJJ$ z%B$V@Zoo`+zy*nHSX8ZjUn* zX$KfT{_Pfag0{1*#^0QErw2iEv*UkPIW&PS67-^!!Ha{O^zx@U{A`(&Rz8i3J>dO&llw zErywEOWC@8+HcAGF6z+RmK3yL@a<7MR`LFL~^h%0+pBx&6e4LjD(TXC4pb z-|zn^MG-<}CsDG?zK$gOzAw=zNr`RQLkbN5xhQW;O_ZjMY zzW2G$x$pb@^P7K7kFM*QYx%sc*YovybJeG=UNm_w5B@U0>i8L3?Norj$vQ5yz1y_h zv2rZgJ159~sABP5NUPcC2RnOV9CVJv>m60xRcY#QTNF~H{^}QN`ycv{_#tH6X-`qL zexH!0FK8s9H*G814yy%ZkahC-^fXiUPpMTCT$rl!)k?pIiu`BYCN|~|3;0f)Bw;;! zxcmzKqS%*(>-^3=TD+-V7@ml}o%hJf=<+2KyZJBccnxxo-3aom3GB{PIq!g((SDb> zG*^VG=lJw)M~GH`&6z9PQGE8%>58pO9}AbU7v1`si}ICPeT;kjir^EL?Q^NHm*da- zgmR@yZ#V6Xw4ten~y#WF~H@+O$p`kD1o1c2v%Bxd0xz>whww~dNP}E=EIkK)bT5)a+ zC9~L^#bh~;MH|n%Hn_d3eevX|9mlRrCFP<4Z=F_(|SJSB^S(H z5HNm-i}T8}%NVULP59Ek*%jrNGuGAUt5Zgyw)d5JLoUPe&A7zdNO`Rp!VfP6r_ZpD z&s&(%q#<_!R?KRNy&Qg$V==FTs3eWo=T_@*O}UAc-qoFkJjL^I8Q;%Ki>qr0`=07^ zUf6c=4&XYx{B?qINR#eX%tG&h0W-n(cG+I$jAiCeOxX*@MzPYoT>gw~Q$KfIyu}L| zG`=$#Nj}~TJ8QedH=wwY%t2m}yCB?{>tjFKU?M3nJHfER4vKn$wf4R`PdOOYKIeTk zx8o06-;x}uIqZTz9#K|T>jmwQJwA-x?XCY@yC$?F)srx+!7PXw*|mhhmjt~|U+ z&moh6LOZkn>g=4kx$|khV=>3_3d}Eeb9QC2Z2P@xMo;d0HC!o&Av9-(s<_)0kP;Sf z`1_OA?lyv!t4BU`X^SeWg~zK+sZQZvX9{}AmMM!Xo;ald;`!BOJHLCRWqliCLB8L@ z^SAmx3@aLUG^?RJ)Z6-@@9ki3sfMtkuw7;Ob80%qi)tP)5-P=&%u8`p>9AyHLc}hG zol=g^w2#q`6Gj}|9YL{vsC}*gD+l+**xni{KAG|Cnb@T^PxP!rVyY=B%s>3ffsblp zhR&VRk0*Kv`!)j4@sJ4%%(?4%`X8X8TNZ(kVd)rIlrukZsc$1q4Rs&>!_g{4aqy-m z+_JD4JMNM$-9Rn4(w!;&&i>mH)>axlb)aY}db&x)OWAdLLcxzSqz28e>v@;;@#sSJ zN|9@`$l?5BnP5@=_OBI^6U!@|vu_>>AB!e~{X>uA9I|km0;V zb%{sl)bcOJ)rtH!_6@GvHw@36kZsBEkelpRd%q(-VfYG7ux4eaa)6};XW27peO~4k zaw*liv0c;GuP?NAIIURf?HyyxmaGx)3F29Qd!xUlODbo5HxhBvbU>HR!3x&bvho#E z_^A*@ySG#urV$&9{ZTIE!Xf=Jdx6j8H8Yd@VQyotv=$*=>MZFc{K#+;KoBW$l2 z8pg<9>VYNu*EYYF4GCV8I%UtKd`S{=Q-l)+b@(kDG=8ZO-DKbjT}>@F>~zrYiQvL8mjoicd3`s{v*!td>5!Ob=S!Bm_G{MY7C4=3bs0llaMW0 zn=yTegPZZl`0XbTw{IfQ&PJF3#4K4h4=_*L7w#$=N>mCm`Z8t+IO=O=#7&th_X2fl zxGQD1%c*IKbdKIj_1}L07IcAY@}$uM|C?e#-XegEy+O|rP^Z|O)d07+qUWenZH2_> zs>vC?70xnwM>EYE_TI-b=AvmbN8SKXAEm82)`i5v)2gb`0P$2C<+oOU+tKK#96LV0 z1mnkJ$CSs|aZyVlkhisI6btB&mL7{Ho=>axq&nA$hlWMJTyK4a{9eGf7oqJTExwXM zaTV(M`HPz;AP)zTQ6gzvsPE#^g4Mkh)urebap}ZVKPytTMi%da^IVDNlr3)L&YvfA zpQ${!hX;$(OtvCUi)i#U^jKF$cZoAhY*41TClf)qH3mD01P8A_)j$0UV#@27U*752 zK^^wmv3ZN+V}VvP%seFfkBHe%F@JVP?@-DCs20;b{y4iwouT?jWU)>Kcg7XK9Y5@l zBSKabc{=&LZ9vm!+m$Za=62z};AKy9@biJyPsKyVpgmY)nUF` z$^)}gkgmL?Ie*vFTKqt@gwf-QfbgI<1`w{AQ_5n4pd@>Pg{kmXnENKr& z7?+a??Ep=&7V0T@WUTiA>clVo5unA9T$m~zt|E4s-a8+7^dI_lp!VRIQZ78;k5=%N z4NLB&ITzeH%2+@3J?HWayjZy#Qr1IwlBa0_7F2hAg0 zr$1js3zDX)jHST5a!j+TeXJUf-c|EhH1~X}u8D-Zfmi*O`gqRj*8u*_pWHe(W#Wcc z3i@l+=FdX7$6_o^#tR@@R;IBK40vVp^zX3-zIX9}Z@K!P*#log{V#MkzNB>pUjmm{^ zwHlySQaisFe2AK1ZPnjXwSV>@*D4K4$?Uwp`eMO&2_~e0YBw4Cpg}K~>iB?Tp{=2r zH3`^5ctxaM{4-{(a44=te5+a{nD~!F2Vx@0=!qhRqK4`V*YTfSdK0U zAaAy6U3Ux3P1Q0)u%cGG?Je!G?2(w&vxYl4^3r3rm*l_=CN&8!Sd^OEh7?{sEKKJ`IW&k6FP@)$CZF$u{d8};>%z-3l&iYuc~P{~iI*D% z22AXik#q4lhn!jUSzAZ{l1;wJw8H*Qf9qOP!oO zc%hW3ljl<&AC-kJmsd@<;Z{hd>(2|9X%llTO?n0PMn4$&j>H8GftL+w{m613rbH3a zP6xh86I^9CLfNtWu@~O8`PHz{eW;tj{X8H#WPSNnibmc0P$F*`?yPw#r`wO~;@BnR zC7Vx{eYFwfi#QZ+9VZrVR0*L9Q-yFViHuu&0wj;5rg%*dAE3@T}?qR*!j2{{Y3%PxC8Pl7e-3ds30dsmik zThzDcKO}{YBCzSI`>}k1} zgR#xJQ-#@ipD~OPMZdk0!4{Jcc<~QL4J${f-IpTvr-jQ&5w{akpgc>7YM5b4qd@p@ z!-A*$VMKF|kd@rU&ElAY&aPFb)nbfl3a*GhWx#7BCvZH~QYpP#gmiO!dU2OjvhsV+ zY9ZC7kG@|N_#K-7=Q2}~wuYBBSMSj?LA1>JXWi`c@nr5BPLSH<(uMkJtd?>WYOf!- z%$T0{fzG#RXG3qKzzQtrskB!L7vW@MNTiCwS&~Kab>;>GgfK zSuiQ}xbm!h87mb?Us6Y_TgGx*5(lZaE1e)W!4d`c#+{>jl{l%vTICsr-T_NnkydwwWHR3Mwo7HM-aPy zjWI({Q3`C9V9XY8eLE@wnF|$?Tgm*D=0r5UT3k`>=IRMuhbjou^e=j#`Re_?7*X@e zL_=lAzYXzKW2o1}*mXmatlW$wSHa5|un&mVEBJGZBu)iy#iWcMTQS|Gf3srJR*tP0 z*Vx}y468Qfj~{?-W_#RB0Qs5kguT2c{tZI99{SRXgE(wy$4jLn=&4Vlrwv`IXgtq&>C^P5UWzVkJ@30O(SB14 zjeV;*+VSpg)=Go;yj?|JZhb@U-Mo4G$mY|f%jr}=A>C$izU=ehU}hDylYSj3!yblr zaG2jVT%f}{I1X3Nkt)}FweE`AC=+>Fv5md?EcElg;3F2d#zI1$IaBQR6XYn5T6HNmS8b= z?mWYsaX=5Y5LNql->hHIc0Z>2z$qU2(PdyFH?UMYobHFapEBRw2y3Z?a5tMOT5Ia7 z`8hm#&WCbfgkp- zxu*s1kF>qaJJ;1LA_Xyrg2h$?2@o`f=DP8Zm22<;&#{|Y4p$G@_jUOh-DxSV(cxfK zHGP!ZgM~`KahRTSyPWg9#ZkNA)_rft_dq^kc8vFMXORfWbT!ruYUbWv+P1};?` zw^tR5;f5DYZAo~n@93Hbh%$K$@;PD*`}A0VyF6oA5#q_K>jxy14&uQhaxn#qU8!(M zo?cDeBDtU?aeUutT!8g$|9z3F(Q-yMDfFwY_hGAf2@Uf}WOwG1-go0xHN1Sf-PPnG zytv%W_Rsy6UGYQPCn%0&SC;<`+6h)%3RS`RgIhcCTd__@DNlCF_^-7mcZgXdAr3Kx ziR7BlZO&T-YY#d3ffg!w0oM(W0%noz4#o-|cwopwR@(3={_%P6THIT%RTw0GH$KTr zmj=rXv~ID+Sz_0}`LVXuP{Tc2BvTdjW!vSXtbIn%Jx~ zHIOV-7*@$sbN$u?L)$e|hZW6P4dJfZ?d$&ze_jNcXv^i*G!yW%i(>YuT>5H*{+!)F4{#iVqs=R=S*nM!H-E z$umG|EzL{^HCAU`hYqu;tN14B+Y?JL2x1>7Rztaq`N!vJ4o{5l~l{dOtw9EQ3r9&~mI&$hZNr6+8$SXOHc zT&T@fC@!l$)@RD~lM4u!o3g?<@$z5|cLqr;Q%F5kTMoZtadn-JZ8p!huEwp%%Mu0IU zZCfo4we%HTSGN5MY9EM7P{{?pW%-DZmbp#qu+!Bj_hdjL@-D6x!VA#5C&4BM2bvhw^6tX;gJlLEUEbzwrTemk8%=Yn;~3vUo9|?(<<~=h#8TXG__Fh^0Rs4p)_0VP z91^V01HqO!!wL1iyG9U*Pv5F*F5|wGA8;N=Iq3+zk}>U>#bNM>#Z~+Xq#B5`opaaV z%R%(l+*Dt^d5+cd4Nh2C!mrBu#tJVM*E`6J?UnpEu*qkVhqI5|s>S*+FX}VZ4 zmPy%Zt6^I1@np6&@$^8DUOwi8}w#W}**CT*ExsI@f)t*+WLBwBr7 z-@MQc#;?zP4U}5l`ji2+O(Sz`h7L z@FIey_7LpN)3vf58}-Hnjyh>g*0tw2-{xUc$4M<*Gt%;Pd=n{zWwSu09nay74DdNR zlIuK$yWK$SZcmBy5~)7g;KnP#81TL!S#e(=Pg?8xbZq{zI(_H^`~sLZalCt6cgbn; zo>lCKtjt6=+$lzVM$X1=1-bd{^?BcKETou<25LMqduW{3t=#r>7w zw>LgH&vQYA31<(*m>Vus@r8TikcjYxCesww>EQ5PhTTHbmV$%J#wM6L+EeHsFhOTmP zeNwk>Zj+uR@%m=;0Ms=U!lAK$Y^uY>w@n58`OxertDC-grJ0rYx}=+0u8gi(0`2PZ z*0=1-mpxx&`m=>KxS`)i0%g8GE#WUxB_T%#T9+TWk7BP=1-+DSi|o}C zEM+GkS8o36Z~rhV|A(p`*957*CqeZX|FPHy->LG~=h8{SzqS0lJO5Opq4(e9Hd%W9 zC#uc|a>=Ro@)BQC<}MPgl<=wRAJfq$;ZW-l^3F^F&x1d~P@8wky_RJcq>VpHW-Lxnd`<|UNP*6{vm$J{ zH;pUnctR}~ldBpM1g1FiY%9j^-O?zh5US00m+C4IgRP%V(fjCBG7rH$Jkb-|Vm}Ba zaW9m6uRjqy{}*~^m0tGMY6^X+Yhbu)`7S{3c2ABNqRuXJC~({uQ$w|*FqC>{cNKAYhD~(S_S~k5D z)inT>OTU3U+toOD9i!CN!Bdp3{UE1I-&l$rPH}a|_?eha`O-4z*_1ozBswAc#G9!4lu)lm2zu z-6@^wqNr0#8;gA!5`icH^mf1|K5uz+mP ztCC{C1q3>+(=08Ddaul_NKhHVhIwsfnA|4!dn9bV4Br!J)J5(w$)~~D5Bqlw!(6A( zR46K3F%4)zptbQ_@T&Joma435@%z{`wXNpvqcPx6&E;)+z$7}L9@yGG;lC{ykjC}_ zpI%IsJ$c&vo+&3YWr30}j6)i0BH(v-$6lE+yJIo=)7-W)R>nPZJ24nwc7yE0TXGsl zDa1Eq-cc|%DOGJfVMHofJQsFsG6Y_-WD$x)#U5TVgdHkq#`iZXym}YEpf~N*n#h6s z9cX)t<@RjLpqtT8*`}z|Lq$OniSU~81p%Ud#d(6HCfe{zk~Fn%}`aM0GI_i?h8nN=FZT!@i~myyZxi+lN(n)_9IrrY-oAFi2T z6-Mo#+-tfyCDz0BB=mFpChg^dhJz#TEo;Y0T8Ieilfow5N?sQYb6Pd`xJ**iR+V^9 z$yK?x3zyCP#4zBG+Oq~~@6n+;<_GJN8@(RMQm+ZGCd4aQd8 z^DvPqvQK*KIc$YGz8$V$p`S`t7j}kE6af-XIim(W#Gz1$s8UW%Ew5VC8mzaFc${o84(g#z zkA)wfT2WT-+dgb43yH2z;#S=oc_HY)l!vWrU}0gY@Y72UoKTsAzcgM(GsAC<7aqGV zomna#O?;1J+i--u=_p+{)~0@B-L)E#iEYb zz)0dr+aih+fDHtKZsRL^NgW80EoW6uCD8@N*D*2W===%kvD~|*gbU-O4*_H$52jsj z+#r4GL=_S1>h`0XyF_xBil;UvySOhK<1^%vl~tw9f?2Yu_SZwTUTSkH{t^|-9nVHo;duHAtuh+B=}qqA~~ED-JO>;fraP2hQthnCdzU5Y#!E9P+PKg;(kF zIJcku1kgbV#pN2KG5_=|PT%!YpRStnG8ZOI7^-VlbPSYxhv;PYlj0e!KUh)cT!F=hI>V z`su9u@dPbbA?U_I^qWGgPtNA7bCU*rXRZonI4o9gMait8g9vd>#b3iLgWiz2vq3)Z zsW$LHWPKhRA9IB1@%g1w^4d9jOaTBRB)i*K1AI3ecQZ#75+x|_V>f*S5+)vjgoNn; zB-9+C(Qq!84Jt5r}d2WLBv!|S_mw}HNcP3tshpir-&)y0LNQ*R(W z(6Dmd?mAo^I6U^#R6nEqj;nm?fD-DJ!W{MZq(PAb!wQELo+`2A2y(nAq|rJOh3yh^ zZ#4Bh?(jPjrsGgow66Xo=yyE{u>{!((RZcH%1Z} zBHajvFYVxf4d(;n8^R5_jwF2#v#_iU`k5$ps};!Qf!5Yd!0W=Ny~{>FC-q_=`flXDx$aJ}n>E3rFkyXXC#zIQGenrRB!aamvN z5m0?PG z_207^LXb&J(yx-Ch7&nid73B`GV20Yw|uML%xrsXD{lKG*Phc~D)0j5!`e@;slM@} zG0WWSA?7>$!wuV%w{&RY&7o|3ncN-6uAY7S-VUkTOPBlMp z@`e3X+Ou8;N_&ud(h+({^4f#ZSZmcWqYv1-wT$kKSEX5#^CIPU-+)>hE7Oz&Ybqcg z!SBt>daGH%3)Pj}qf1k?oj_HR10J69C`1@)gLmHT5X!N%oGr$aWv6c~t^U2xt-0%? zCI#@qa-bV%FYv2hS6`A|(UDuF4Qyr+rt^03R(ku^CqxJ((E(AKy$$bGJH{Y^C5J{0&ZT13BLus)& zTX@xFCvsXAg8)=oykO z%CT-wS8oIyV^(D7+}lv>kK6{05TpQfOy30DZOe%l)M!}%&uITvGXY(#ML1y3*#9-r zUaeUpbc7sZPYE<3S&&dfln;f%?wx_9mnEH&l%--bG5qdg0|+s9I`%1w^+={hJ-S#F zjVe}v1mZyRueDu~V)~(I2$N&{i$w~xoXgEaSIcf#_Kp($TL*EF?W3czQPY`g8jq&L z6V`%HLA3rg%vjsQ?RYA7Ere?HKS3XB?YX}b{R8Nz%GCHbzU==VEA4Z6as0Bw~QzMQ{zg}vHHFgK#{&Q9Ev5rO$&?r9#e_3@tbiq z4b6@ijJNz|bNY^eCoQ+CW)bcca*k0W@z?|u&nzHWInh{ob}_PY{bDO?nnFePg5|pl z(p+)lkHLFo;0QX&0!J|3?cKoM!S8a{2E-I?D=Q}=DA^Fo4a6eI3kaHA!yppmL79(I zXW7bgQ1Y|KyIpOg$*To@)|3yDSiED<`Ho#~_RRMh%N8tb_neXnTIw98?RvODl!Yq| zRFfAyFFZAo@k@$0Wasq1{KXkGAvx*}Tkmm3&$v;vki;EO{aRMyz%(&aF7VCcLQjKcYvRHnpK}Khzv^R8 z)xN`%6>2Ej*aUSi2u3?_Yxc?n}&biNt*jTkHtwXH5MARwy$4aKX@HQ5hT3udSHQhcivwFOF!6F^|!tK1+!X(M+ zx9{Xy;|~iXchbz=EA(B3l(mm5UPrv&ZfCvYWFESh{oWhoS>L|mw-L1a0iH%HDUlx# zE$NDb-)E)hi!JQS6@aI>p3T8L6x@aC&OEHr_=acTWq6+4u1XxLhj#SCO|!ir0Xjej zR%@wT`A|w_!k}4#Y$2t^F>$i}mt_YEjTO-t9$G^BuGQbAJMs9^o$L{LGg?QYPfvb2 z?|hWl3*H{y<%)UxN3b6p| zg7Gc6s>|53ox7a0UO#JXV%0;=<(70@19-0rcWAw33}qeK^7gY`J{7? zZ&NV8(Cq3TtWg+!gZhE2>a5lH`R%Ues;hEqg2}e5EGMHFhdY9ldKRNqSbTf7FJ|tY z+cWmF!2#59qCCGGK0`FFbiQ_5{D;!{&t>JNUbGhx8=koZk>g}S@o8VgJNXFX2rGXOVs*y2qYsWs3$+cYN^A(jj!=u&+`vW;*8 zQCMPSg=|-QzmaP8iUji47r;^--EV1B0Gd>Z&^Oqx`$%=kplTyUU5%s<`%;~nF0T9~ z(vrEKx}2bb-{&XyAVa)JJlE)G*g!LBar#*oUZ@=!l-SZKfy#fl%k4{|SJhU3-hmv<*DJKA(9L5}!4yh{)I ztUO7W|MbF5!nc(Ty|4Hg<`dw%G~8XS+pijik~tnn@2m9A)Nj7oE`7mu8klK~+xoHz zXwl7z6OeN40Q9}W{=G-I2H6MgW(8qQFtd&a0Dwq;Gb6e=;jiRDkD(}5D%A7)GN4G` zv3B8c9f~kfYwOBIz|g8Q8pf5ze-wWGQdfM%U_?mf>+m`FlHPW^gMj@!iWACA|hQZ2{J>L?pAb zJnKs?b?SmT_?T8y4rpJOlWnj`7BDo}H&XCe242N7tNr6YOk;n(E@{InJ`mvm-q{k# zk#{zcV3|k`a#yYWsXXAl!-!Mub)Xu1o$6j-I@Rk{61h7l7;cn3!bSmYZf*3`vmysX zyfJ~ULz^+Dm~1}FVOmY@{DZ#$M%z4-OKDWk zK#0thBJ1pqFW&xYV|>DYVp4!NkzC*k$2Si(+zSrp$=2<<4kZJu2`DZ_stJdfT@2_P z?Yv5+Uvhi@%Ys!wq?$k9Ucfu0w0>P?YMFD!=j24@CjVdqBln=_`G8J!wWs*7L3y?t(o(Oa|;dESn?u@x5#Qh#=uxtz>5 zzaNLK1}ot|kHc2PKdtD-yGSBH*vicVAGT6)vZ>)_Z-5jNmn4uEZsa3O*j$;^_p&;k zWtWP}17-G>{`zU%99$7GCR*3irgaRhFR(MGM_0!wB?^^E*ng#Qb7a$02=oHzn*)g@ zl+qIH5PejPT8OiJj*k^;WRPWx-uYdeddDVxG^2V&xd?qCt{bn9`fQ6UWYu2m;0rij zs8+U(r+PQW*T&+J#nAF|BsU;MFJtHAUT<8FAdZ!YoH%IQ-7aRzT&BvO>?|$@mK=*6 zLCzy^a(^FEymnwIax=YuL)`9FMo515>n(sRS}FAc1-Ds?KbD*THhxk)+)XvSDTHw? z#9g(;YF*~d)1=0qD1{(*T-7&s(axJb#0ns?RwG;4`dCQELwvw0eEKq%jlDCCg>2lL zC%(ApjRz6APSf$vlo>*3@*Y*2?#9gQ+h68A*{V4GWP0NVC4CY^k9MJh=$F)ZbPp?t zS(*3lI$cO3|5Yl$vW^`nn*3vDF)J5k#(kG{1w0|{I&U3=;W}UKiKRIB-q?HaDC~O3 zkk=tz&dl(}JQ*IEi!U<;*Iqon^OT&S^Kk|s5(`ReeUpu=#|HQs?t&gsya;7($Rz<^ z)5lj_j2duy&B=jym7S(ZJo)R#A{uZhk77T~nx^=BdiOoLgH;oF<1~_tdHENG1jD>} z#5(!JX`o$ItMxC_E+|m0RpFCWc}vI1s&p#9y+Ha135w+9FJ)a*>yYA;yz%76nJVin zZD3Q~>wMks>GZwMD);j3s0)di4$5G^9^G~SLoKr2u#TdCD>{*C|JsU!IV2b4_Gphb z6?vS}l6=znxoVF$-3)1bF4hIEc?)EyKx?M~egUBmSa-pauqbP*&NU)%h-gP*NfOCl zU;mS*(&a2dd^)Sn*;2}?^3a%3QL1_uFq@Bu2ZFFrcd2&KdWSSjdcwls5+5% z|GgNz{8r?Hh|84h*cWGKC?TO!rdV@jowN=S-m~#Tv68CgoFSaf7?uF3X7$v~fm;uN6?XBO=P6xlwZKxoxz3Z2Pxt;4r|HGHk8z({ z;-ptEKqkfhHON@Ps!G%N`7DoAs}rrSCYUb%0?qQjxlF)*T9BytOrh4qrSTXccb@=q z``N$#_J^|nuTiQ6^PV@yJq=}UG>|CPPEO{3ww^LFhAZOOEwyQ-{ghqicP1+_EIsAo9VnH3^TACaHgSlU*@@jcI3Y#;f7y?q!l z`5m-_a%Gxc=q^QjJj9|Z=j@X8lr@8wB^eB1z4-ADjztv%J(SjinwiC|c z`F^bwLyw}j^pioYg8|Fo2$(=ok!__#cagsFb9`&7sYlwe!StBP^oFvWQjd6N02{>I zRV#jS7a7hBiXBW19Oj%gRuyA%q>LSlF|%mb)omoHpKR0W+WPJNVMt#r@>`sv96!$V z-u}Z^eVh1z6xOVsKx%$qHF=XLc%Y`4V=mWvkEEdE&iP=Mm~2*25FQ&=O|vg$L1amB zC*v8zu3IZb!Y4r32t6d21eYz)Yx~3&e@@iq@sTCuF28BAN&qn+!Nz!OxK*wO7j(F)Tf#QaZ(@=bI z!-;;YTr|I(=UqX2`A3-|$V=0nd!t|Td(?h!{$os63|!V4-{gQWSGwv9W3Loax?jI} zjeQ{UksR|$Nbz~i66dUFdhr?at4)X}j&Q?tjgs((oI7E2?Goli3#Aytxm{*;O;JyD z@~_W``f-@Jd@sE~{N;Rh*4B*nNKw>Iw#4*}!B3uG07Oc}s=im7&vg2+jBqIgeVnKfc8*wrLigkn8PqTIPc5)%s^6ng>eeV&* zvhx$ZVUp_Jqcd|qB*zijazy*37b9zDs2AUb$!r8Z8aekQ{+u%&Q9lwPqF>KN*glaB!jDGaf#1kQ5!2at)7e4{t|C+ zOFHgsxa2pK5fVL-9CtLkL3Vb$5fKXBF>VQ*;{rjbS}C;x0LcR_aZ2%Ou7<7i2mwCs z%R3Ld1Nb5!r7tuVKUco{;hZEjXm7X)oj;X>Z)TJh#XU49o9))zjI!ok%qxDgeNFC% zFO^i!XJ1B(Cb=;xkKs;!8YZHf4S$JhyV1E#J)KBzGE*;O+sX{m9c6A+tLTfO`ZjII6;3vP}P$#06190 zJsU@)_hEMdO`Jz{4J6h#yM)fTcz0xjcjxpHCE9y9K~1?sE*97w9~SQKm!~rUXt=73 zqYgMSZ|=OScul`^D~4+GXs*Iekt=?#LY1J)UZ5%0%j{mU6;S+#MrKNNrNKi#VR6^( zY9O7DVYT^rs$efboJtPt#SL3?0Xdzlz?-S1gMxc84?!C)JL^12H7y~v3&b|fss5nZ zrKw7uG=0Hu)$i8|0R-I)^aGs?v$LGu8N(D_9S>=b32#UA)C4+US+f2Pm^Q$H6i^RR zeEZ>xV|1wxvmfn`M-rVx@^XmSY(sep_6|$m001WyV?KgkV#*XZt5D-KUF3F}_6JA$ znZd?aJLsR3z;2Vg&Fnl5ZDh*s-0&CuMeE`p0W>kd~zUrLw_tqvC@h#+k;dpg(7SG@b z5kkMhYSdM){jWL9~Kf)z_Aq)3R`t#Rhms z61T@&w8;aEM(bR4*<7`XY8=ic*c&GFVA#jJItevbzrzG6BvOP=PrEzEaU253Q{M63pgKIje?>$Xcqr^ zWIs2`)*S=@HJ6VJ7kml|_ifq*H!A`C`9Pe^aKsQ_3V2XunX_4`)O++MKslV(g7Mt% zjs{2jY3iR|v3#!t-kTVG;~2(Q@-gEp`AXaRV<2(icrmfg8bMqH#(5a%_c}8#DSQTz z-RjRB4JsJJ0nBgG4%R1@W7UK4y6;U421Fn~vp?b&Ky4JmLnfP1gEVoSKOgIxX%e8l zD&ZapLHIMj6NRK9na{Nd0vou5QUMznzp0iEmo>)copQ7p7EdpT&`%KE3p=eB*nmZa zf`*2a779~_T(s8gR9q<4-rHqUNTBGdReQwv?n!k!D{yiY%Ql9|SMPUWKXxlO#YwIy8Y@T-Q~)Te!K6e+gg0pxi5FcTO8gn(b&s zr+Y7ETIT}DLn+_dhsz)0n=|4lNTxI_b>FKlqg$If%hZT-_rHU(^sf zm*>Y^k|m>*pEYw_#SjN4!{7g9dn-}2aUDMaR`ttk+*<{cqcZvO+G$VM-VFe1dz7qTvNZDF z_yqR1k7^iluLOs4jA{}=J~{pynW2~fN*Jh2+#}`$=E3ci;ncs*Cb>R5s$fX__8%pg zTrJxFVX*X|G5Q|{OS_u?J>^7lg5Ynah0z(BB!h^*(o3&RU(5VP*PdZ4x=Gc3hh!8U zD=H3*+Bv7X2w#4@}*@TS1=81j(L$BA{oeKZKwCP4VWOmW0&TBH1x!)|~ z@#KY1H~#JD=~T3uUFz1_7cpVX4{4qK%YBuCeZCcgnLSfcEqwa?RYR%Aqzw4~=|S*UPDAm)u~_(+t* z9lH@`H3_RM*-=3{p${8*a$$r6zphhJ4QixoAHMJyKuvo*`PTogLO4e{TtVpD6XX!| zgCgX1U)^i9Gn==pQrDnHhWwt#Qz-QOX$W*qiuqk>N!fHYaRaN{gL)O$na>L% z`#vvd2##Nl=dDZLx^f2=8CKBuRK|hniL6C5t*qeBN>;>X1e4S>FTM6m(_VoI1_>{F zu!pY2xdq}%h7?4C5m2UFrm5Ih&7rJ|D0Y$F(HYV60ls{K$gQ0^CYWZLYAVk)0o?nICa991q{UgI#KmtH=$S9DuI`wpA5)!>D!#G^Ckrhby(3zX2xFV|W}$=s=XK@#b5bY!i9 zte)A(F|Y_9Lv682j({1gS&Co7$Whf3l-m-AzF7xL96nOX5^nbOr7hmI`7EdM+)()l zb<#sxwgc@0*v^3$1vFU9`z;F;{-Py@LfSpM3wFW!(B|%%1YIPPL!0&8ItHXWH~s2b zc&`0L`K6sv{!D5c16nt9X|AyEg}0I2n2K0~!@h&(qL}hB!6MiRpdr(*3uMa@vT-5X`#Fv>)f~ky}s)?>W&WW3J}L`(?9fkzTJgd zdR6+qoBG@}7LSNuNPqkN1j_jTO{vuDJH71D*^~;v2lKgCtQXUFVSr@6!IWYp zBFAUvadn$>u;4OZd!)wxl>%Cm8R~}TZ@$k&(7TP)JKKL%{q;bN4jcGgo7@LA7IN<` zGR0KpCZ2{0k9=dG*!ossflt8&)-vvD(&(P*EC!W4@jOPsD49dB0%}}`vRbKrOtiG; zVf1COnu2il>&~dc+`=A{jV%UoaK-vJRgydG^#ltSo^^t>$!3HKU@516n8G z3jWTm_kv6$pw|u+=z0XAczsL~$Vmjy#d#s$K=w$OQ~8igFxjSS9l^31|6We{!n|~6 z!&v8rMef#}K30JRWHwWxC8t?9c>&ee+%F%<*du47wV=bfJW?e0;(d$z5px>~Q6C+H z+f!hFU2VbQtVw|`{CRF7s0(h7xV}rXo%X7JulG&+T^6NV&*BLWe;3}D4PBz`6&X^Q zrrrm+5s0fbJ zfLsuWA!Z$_`Z2ye@#a?I8|^vgR< z{2p6iH{O;Np~i0SlGj15tDv5>&xd6lZrc66-uXFhP9bKZ_POXLFZIuUP2A>_-8xx1 zNvfF`lk87hC(l0U;LBBOV_`gg3TY8KEAV%>?)LYPF2<=ceh=(T?+ZOcpnIxAsbBlR zDOWM2>&?@Yk8-k~*InYsqaklV4a@T{nvtE!$vb?3E^XVE7%@L$-EV$6eYkHhguBAQ zVrWam&dUO1$%1!qAkh@XCEgalV65BO-V`S35Df)2G6kVWPYSeUs#c`Ym-zXi)1P0p zt=0`^!AG|03hJv!`gT8lPp|!G0?k7-nBid84-QCeBw+JFKHh4{=b8Ed?hZcBK5{=c z_dL+?3y@AP5x1v@x-I3^b6hTP*SPCq8z=msB?wF<9o__4ZS32bz=IWhdD4n-@uxWpM%*U*bMr9}Y^}CRau34|;F(kFr!O28j`DQHG zE{>g5V-};_koR%_nk(BD9pW*5y$*HVvr@AMIg=33cSWfW_n_W){oG>pR%7{(L5*P6 z+@=fkexSYOf@jL5h1dB%lSB?%Tz3+4_A}QDL{kSIw}`DVNx$~j2(ni*7XR{XI5WZI zxo(<9syqSVz)&D%uZBRjM%Tf-LHWdMwmpIMy)SyKPBFQ59$BY0SnP0R>W9_6^taVR z>DRpa0=Z~CE>+*KRF`>*VN~Ede)8LtzkA-UW|;Y|l)~|0QTipKJf81?8T`g45531I zckcPe$n<|H9uQ0p5lZxoeH!@zx9qVMEte~IMVI#)SxK$`htUl~+mPFl4$&J=>pes{ z80(j`4Fxscb;_pA7IH`*s2IQ4(V{rKhW5hkUwW%Kzbxo$rJt)r$jlzSiQDy%rTCF- z%64GARszdfseeuI)C1-8Zk7nm(nspExw~n*F$Y4r7{_Io_-9XPMJYOFGgHF9+nlNM56u zb1vcS)X8OD#$Qz0uLRvJ_I{+2Wr*)*d*40%=Wv9S@0`i)Yq(3QNcTg4^t1D)5z+c+ z2iET*-jJCG1`G>@SJyD}d;=HCnvzm7oAT^BIUj0nFAf+;JZ{1zm7 ziAL5u?9AAdHdjHx@^%5@$Lsa4UhqeoPFvngL{*CpbcayVB_>*CKIswCtx95fhOCWU zl;-$bsV9bRpIYAFhmL<_d_=3nJQdKGTlRH==4Jp5>pYl7-T3G*5HaSphMV^x zl>|UzkoRgzoz>gmS=gW%*}}vb(*MWaTZYBaZCj&BNFWA;gy0e&SaA0SLU7k0!2&^p z6Wjv9U4ld7ZowTATpMYe;LvDrYiPIyk@wyE>~r?{?zey3AGdz+@H`Y%wPvkaYmPa` znDgxW)|&+)1M|~oOPJss4C=TX=V3C0JncNf8&|Gwxlo-m$>*e|CdkyGn9BoKjq+=D z4{UdwCmF?fIMfwh&lJafj^(wZg<#T5Yt!2&+Owys&XQ+a<7svp1Ty>E8E1E0BEQ5Bm8Q(b z%NtF&>GCS&k5&+`BXB(P+0_d3$hrL+8)ajV>E_zo?lY}^fbztU zEnORt>{WQC2ZN;lsVlb%Z$j;z*>tjFKS?|ELzZ<-ke81y#`bIb6UyD=Jx7ogIup=t zytG3Um+%$kpn=wDI2PMG4#oiTdN2w%YHsz0kf&3~-Nn=Qrv4Fct5?k#}vUlwVPxk9s4j=uVCHKp&Wnu{DcSc9a3RO%iGGdLA(nw(pr7xqUT3)H& z(RsSNPMW4m`Bin}s`s|l?a;lS%ZF0rzi8!Mv!CngqFa9JhCndIfyiVU@6U6U^~q7C zhUAFLt8zxTpK&({IZtkTPlhOPI^IcP)Q|GaXlvYNoiKs_!X!6t%mLX-ojsgjWa!M~ zo(uhQ$r8tn(=eP2(mDb3Y*=LjfmDcFO0=>(xmjy4hAxpfl4MeVK)>4BNS~-?x0kIKQse z>_z*(+h{5pk47)LLRt|YeQZnk_t0+gtk;!~Z4LDcm$_Rx5&s-Y7!3`#r+60iVQ!Pq z!D@f|Xl zJXU<5|6C{ruY%-5FNr(-;?91~Fu-Cj$<#G8 zm2k!jHY%CTDs;7txhaO69Xc8>K)BkkN$HwoiYC%@B*{`Z-Cc%=oRon{=WlW z3jcfHm5k%g{ExuvDK{#^)@mjzoTfB`nEqHf{;0(!ehDT+HDqYCceyIn#GM=t$w~dR2fB%WE=N|m! zvD!a`PeFIUf`CsMH+QxzeDZu@r^4sN;l3TM$iZAVv%7o-BH!`rh6Bi{nIzkB*IH`v z%lrBkj`&(-%-ltb7C)^VwRh89P4S~A^5r1*F^G&hLi7w}2HMl!Uoe`uVz+cNOQb03 ziMuKNK|ODQJvk_N%dKF(H~!@i>@8JGX#JGBQ0DeqF)k&$ z*F!iDUS9ai3QN(+7w16vfO2$jAC@D%l>vhMbTC)@Ih&B_`8N(mR_E!#Ihi{9epIKf zq>Kpz_-2l8qpf*c$*8e(5pl{F*W~v04!QjFMV0h@Y_eKyy>0G7o%%j50&tRtfH+w} zFJ`D3G3m@fnVm)@(uWJ)f(47Ob4RK6?rZe{(bFHFcC7o85eJNREWjs92HgeF`CwWs z>SGMa$3q4wWw}(m7e}mki9BdL(4k$XQ;s3a=#RE*!=)~&Vc~{Ma;+gI&>VSIxP5F! zZo9E4gW8(KXSaChVySFq%Pz@>Td?wz#Q9gAs@5FzOl!$8!!4+eGBar8k#VqS*Lz#1 z-il|1s~APb;!nUZ2EH#5B0c><5z;xtro&h-e_An7um5fq31RPAk~DW4;pF{;=dH7Y zsKr3hGXRcQcwgWVyf4VdAZbDR-ZhWb`4RS-nl1aVN%th)Y*EjMb*GqTqu76YVn#t% z^lOO9G*>#x66#RRBlx$O=Mc9&KkHrj1n!IIpd(|Nag1fO0#23ffSa-+lD+klX@_6x z-R|L#y)ip8nZxbveEQ?Itj{ddk2dYpy=@OYSh(Z`s)7>y&F$U!cH_EXW9iSD!w!l8 zBUC_>B12JqcIWe|1{|_P@9j(|TqBE^@4j4+bOq2yYOYi#Sea3#!#G{ z(f{&3!iGp*`=Af|GDjxW?1c41+p90CvgE6{!^M#4fh-fxx?tlDdWVzA%U2ebCj%>I z_EG4VGqrg%*rWz{s^1Q(X~)~$7d9xW+oaSYLUM@IND23Z)c9mV0M&1BV!XoD_r-8i z@A(6e*X);2=4X@bvwN=ZQvA;GTj^b+eR0%~1@k5S3}mz3I+DHPW=^UeOnSjDh5OWB z9BCfoJ;wMN7=$=^XXIm@^@W9ro|^Kq5?ieK$Z0WP@#0(_;sxrRbg;rHcnO!0$OTptbBuL%hZn64C@um?2=`po`1--$Fpt1W<)9;AVu$lPWqct6 znXQ*^aA~K_3p#xA3*6Oyd!hNQEK4*rEfOQr3j=jh!vrdB<{Vmo=V4H2wGmlb4DvU! z@ig(`CQZ0nj?0mS-0&JV|4N7N;l^Q3b|oJqOtJ1!LsMO~&ABaHDyt=+Pds>rkl30l zN0jSSWVy>XF>~zKSZJHSAyX_GrmeU}Bn6tCOy`1+vYurua5)aLX(w(mfs~DSGh|E` z6ot&JY=}h8GB(jKSW6PKJJeY2pVZznXHUoM?Mz>@*DeRe6=@@T`F1X?f6F+%!)neXp-@*v@g`KXE-LCI7 zvU~I|k=?`2w0Grl_A5)yZS-m9P`~wNViWe3or+fOP5v>M`^Aov?~eT^=q!>((}sNs zx`qDb!WKS8bxW3tg5ub=qI*IezRui09tdp zqRo2swED!*t}u(go`Rw`dIZ5c__n27QwfdF(*3@jafNe(E?7<58Pac&p%`KfF_Pg6 z*RH{>c-bj`x~_8+HB#aDTNd*9EKA5Gpl3V%CBtcb6Q|Ec=Ut&Oy917jQryQp7h~F> z(U~DP(aN0fSiZyOJZqp^v-$;D<+Q6+2AJxV+BoPVc^|fXo%ns`@&r}#P5fojinqNo z1i7jS#l3M3xYr4#n=-!emeFn#jW!s$VpW4?Kk`fw{-Elhs5W9=CFVg`rJiJeP54Gm zlPvw+b9*q{xs|-m7mj;K4;E}`@jK2(#fm&}KIH{h`^IX3?oKSG2T`O&8nG0gi%CWg zO1@M_lw}aRhB&FXipfEeCdd2N)_>tXZ4rcCvV9i8YsD0#E0Z{evx5q}cKNVr)6Yvy z&)sd-LS@HMwZTmGX?vP4@I73@pEl~_Q4Fm+DO`cU z^WbA*-`CMkP!ZCgLxClZg69Qy_WKU%*fTW>mJATHH zH^=aT{zhaehCHB^|G4jv0L!P^S|xu{^ln1&ng(pVGYuU^nZ;fD3}$jJVM%-5Yj&BCcHH=(4i*xy1jATSKR}WR25S>dyB~%n7%kMwJxCDI?nfI*RDVR zU$z_#u0f`t(S8+d#?Aj@U}Y4m;uwV$XH&7RK{#QnIqpz%a^DAQmrbL*rY5&i#ZXKS zq++@$#j{*_pFa&jx4oT^K*t?*qr3TS2%skA)*S*_qz}$95}K@;#-GS>UVL-7QrH2R zlyYvZa}(6bIPO&OhKowWPF!LIN=unQ2yR}&^GG0P@x@8&k8KK`+B}r1Z1m%N6LIL1 z3*=C6Wqkl2`Hc;$(J(4x;U$bgh8C-G9=m11QP~Aq|7BZ;;j6PPIumpe*85u4tSJbu zR5%ygw|qxI+-d;xOiogQ`V3oP^OO!+PoDCwt9B_v@+Xc6!xtS#AI$~OruH-EI!m_ZaK=DmUb`M z%Q05II4JR3Q>~oeDsjKM3|WK^iW#01mu~zg^aWWS9``|~+Y#|t95`|s_(djD&Mauv ziw{-ht?nrlT>QS?jU47d`jI}TRAE@f5DQwDXG zjX+n=M+{28Q1tBQok$hY?Cz@6C4_`Bt#(FLWD)ywkJw9}Jo56rxSMgkW9QFgT>9Y#av7qdAiq!okU2O6Dw!$mtY!icT34wc0@vC353`*0 zX!wrrTTpO#p=6GDn(G_;`WtK`y3&;}LNs3jaMuTNQ1|rXfKZEP`DTh$77GK}7j|AP z{W9T;s)}_VaIDZ~(`U(-TX^oIBk-3dVk>irU3B!C(|p{w-0XQM=$|YkSKTFh{>KJ+ zZ3Q25n+GL*1~0I#N(wpKk)hAv+NqaMB(v>ZMM23NU&6e*;PvRIlaDDIXpr;fbptEE z?c#0?tKX;&?TnEKJtUJmUDbV_H(Z`pCoBdy1ycN@}Gc! zo)psGcoZubWdQ_#MgtV_^7zNnv00tJb{OCs5AWu`(=$pQ{hR(6G@_ACqN27?({)!l z`T^n_k5IaQh6qb)fdFAHu(Drito?#{ZZ>?U@Quxy*uVH;dzqq=9)D3ounwKx8kCot z!r{|QZ**q$FPjOmqtk1!MGU_ky2KFXd#j{g{0gp(A*KE>iy!;Yo=X~~=VC z5uy6_)Z?J+jhx$6d`D*_H|!&I4GV9eEyYU_G!REcxEIgO;4S*YP`hDod!L&X92~}F zd;@3i$o?KCq}%xSVM2H66qldI%kK#Y(TOm=>$<-Eh>zQ7FpG5+D525LBoe|zSXs|_ zF}iL!7Lsc=JY#a8Dw*0?Cz_{C8*fK3X;G;TCp}s_%s_r^7o>*4$LGJ8!ey)K$$k-q&-5-) z?usbL7@Ixb#oV{wcgxySo!^D{bhmswIUw!!Rt1x}6mc^g6m1S=yPoRcgN-w2qmHL& zZ1J=v2PKUUUh9kVzxk2Ry5$RF?Sdr9Wk3d&_WK&7pjhJQxydnLWzeV2tbpySwf`u= zR`AHzK-;@AqjzrtT9-w8ck?)6$jB+ojh2+f*GaKE&-l`HW}jj@y##)}nd>z$#p1>X6DG^HQCqeaHjKkm?GX7yt=JLb#EF9H%YG-Yb%&6Vhc4|A$G1$2Y!~QS| zlq{8m?><9ytMLt#a{E_Rn#+feFR3mWTrL~#f?p9djy@um{o3E{N5reJ!VpmI&c@(C z2oXi+Tw?uQr1V5Yu_}P{!?_vG-~+b&AfD6L!+88a*lPtoA)bF}blIHXG%+4G5&{ zf{Q{J6sKm=wHQhukP^#1A$V6|{oW*tf{OILB|eKw6I*VZ5|``EveQc+=?RBEB$TJT zrb2iNaT68!3~Fv6%|o@^zLd<=N`Q&=JRj(#9d+PS;Ok>g)Vi3q1!&!C_alQ&= zh=@;RbDQVbN#OfoWSKw914C|D5}CDSk&7if9EfQro;4l+SHVPezv=w2jdIUjc9^A$ z-K|^X!6nR!yauj*4#SX1vk5fl>3&H-(;crV-x);aK8dLf=RPCNCWjfxgcjdnve)-RoA`o}VIeJO6}B!?7s0HF@1AMG%V~+R^q16RpMFWl zV>7`Fz96J9&a(n0r3zdl6HIYfy{Win=^~cY%tZ$>u19Yuf-tBqD z$u%AM!)phxxipT&(^w3}#>p^J#>%(y7MM;W&G_bnQ!iPhFZ5ZjAhzp(j_ z<{8!~OU?WFQSrm@Sw@$>%3UT_ypyq{!?D)m_ZGP&={iDOKN1I#_COKZcU@24M~t~U zzN$INktTGP6gew@x+!LPWhMJI4@&JiLoKsGxT;pu?I4VzO2YG6Gm#?8Y!l}55G#g@ z`=8xW2zWx@>{*1R4Z%qL&^crP1c!s%Q)FD9D`gVZs~Fdh$$XpjD$p1!Q}|b)Q8WnY zzXTf5sQv^RdG#Pdhts9oZEM~$;Gu6m5#5H0zI^V~9C`<$ktyLeBw=oQbj6&Fi`YOz z0qJCWFqotC&hpz+pl|7o8(~OStPt(gpR5q$hoV;o%KmyBr=L~sjVkkPKV};9AzAQ5 zSB&VsvK8l%&!FgOA|AjCxgcC_@vJH`3Gnrc^9g4}kUpr~1z&};n1tY&WT~RjImOkb zPKgA?T~Qx%a;b$k^lT818Iz!MEGL9zIcRxi=XA5LkpnuL1UH8a9mTS(9&NJu8s+6m zy-BuJhla1U2LDhx)$Ps^lft_jsuS2Ob9u1V!63vE#S)z4ZzaHWTGb$Ms}hn=)H23Y z-*k653NmjzArEP~E5WZi&-T0OPBTT5Dd=unE; zF14}gpndJn)g%@I1Rz;HHQ8}%mUXhb{D8{l%S*5QVUlFu|H&kg$?dZ#Ve0uwCGiRW zJC&sDbcpA_p^{vbB>fYWa><_*d<+To#Yy;0ACiEM#G6OI!f!@3Qffte|sHEkBh9P=S!Fwk?P zgZgStdOX$nNiT66V!i}efOF`M9Kqszgy!p7PLprAtA`^%md{rLf9#}4dxb5AW~?zI zE#FfQJ?e4<%Ahi;-=)aI?2$!`}eR1kqLWoZ@&Fh3Ixugq4X z!Ai@uSwUAh);=7RnRFD}X2K}z~b{S?4WD{HFxyoo}Es>}cmcS{3vV5?>eY7}GL zzZz7D0l@cR9==1hY5FR0!X&%xt1%J)6r`e?`H8D;yN#zTxf`?7v`J-=_GQjwd`~Z0 z=cL_xH_7VvuJf{$9O-A&(doZN9Y0kPw2J5diaPE*y2Sf?)KR?gCCVR;$$uAh1e6{B z%rSW$_b2KY{xj-WG#5f{A0~vbGBeYKnO)gW<5arB;vptd3@ruk8Kj5 zIxi|MKR;ag?rB-Jv#m)1p^WTTRJFt7=Fx39;bsf|M3cjr$Zd1W{LfJ6;Td$+e86Fq zPnOk*%NZ2vrEVJ*YSG% zM&sM&u*b)YHa#dL*(a}p{W^URtK=kw7e{M`0$b5l-SY=rF6i`6@U==~d!B2WDe|A( zVqPac2KW`i-xJK&LnZEQ!$g#O4AC>du?J659F;?9moF)bShEpy(%p#yuJ#T*?`p3N zriyAEN6N9W6fvKqn=PDBwl7%Fa+br8kh-50%Q|C!E*s)f(6B5WJU;zzX(&>@Y9;C) zL~I|sx)MJ}Rflegskf$#$!{CM$%B{U-Z>tZ{1DzKYd$A1J_<)VR^)mb)o3de?w zlRvxt#!_g(!1H0oaFwx0?kyt!MT`1N&ic~C>at{=&D+m>+J-}=T=6qm1FmtO$G_yK zq`SIIglOHQ@eCr`7g1S2AkC37(qErHUJ`*!VT_43sR1=1e3Ues$~Vh#%R-boG3b^Y z4zr2y*_zxadCwZ#^$P=jcz6}$eC*O=#glV3?b)x1T6{cmW6A4?_}1A^t|o9sKv~2; zhy)x94*rfp<#_)OQRvTGH^aZIAXAj-yR_QbzWNJ(mLvWH@Du*=f5M*WD(UTZF>ukk zwQoEvR~%Kp_M~TDty767Zd&Jn&slBfs;%z@@Fb{;G9f{76=!gR4 z8EZ8sYmANY_;(&kRs8Brnm*Rl`1V;t*?0?Ns zfnb1MCt*9i{%4ws8TJ2bnu=kE2ytVa<|&0n?Lj@@#bJfV2{ll^8!5j8Z96{sA+L(K zj)0Z$t_10DOV>GT{@4uq6FlDS^&?tiJ+8w5+1DaELn_Tq4puQ(7lmrKj(h9-n`Zs$ zoFs^4v-*SiEii9t)2~M!uL03w3&j?9WPkUlriYD}TAyS|(X>tdLbFr8=)XcIqTa_A zo@|Q8t`C8wqYzlfV>5KH67{t6xTNQ52#0fDum`Pr$1ArdrR5t36JL9`n?Ujr=%gUs z@P4z`q|ew~lt{;9NrG#)YUL%Qr^V^@!tnTy4!r&X>gTTXKFsHxb%kt7aC)Dp^caN= zFbTqvn->UQC$ym_lS00Kmt=01ezYj?x`8*&tzP&6daJ}?{Y+W6@1u#RpbE1FhIDnu zCfy_KP7W2g65nN!BD~9IEIGW?MB>@D-8HaR;4a$(n4s%ecoj9C)Rb_<6- zEZluC3)IoI67}NQn&IMDCFg)=C4Bt0`Ff#|_2NXUMaI+`aU*zZpOqctqfSUzg_qQX zGx(CgdCd6EqFMj^$>#0b5_r1rvK)Hhk9M=bSM4=&_F=kD-5(%Vp*NgK!i36~(EK=6 zWY4WN%RyLU5TD=+B&Sub}c3<>t(IQMDcV|4*enMX$!hRBaj&ID_BT#!_ ztOla(>?})u@m7@01WJX6;E@_qS}aeGDLAN-;Fn&vn#dlSKMCXhXru1ZZ%HahTZ4}h zYYXXFoA=?RwD67S>IE1YpH@y{5h@3F$4>PJC@U_OGYvDq_1*bhFspYeB4lC?9TiKCZ3 z^QM)6%wn*)=?9P*X*6_}^d`K6-)#j8A`0UWgS}ksF^uFr>muuJ6E#~u(O{m;F4PhA zEzYh<7X zbzC3Or5Qt(qUpRdz>ZMl3 z8TdP}L^gE=>U53KBJ>TU{ufyCN?~AB`i}|&YemN1&DU>F^Ee5dTUOIuWKfAGT|`3m zbiZo6W@{5_l|qt?C5pK-bt3EHb-OB-1ThpopuI5i`pq?gMZa4B8WjcrubL|!kJ=9I zd5Bun%|Z5y=xrJ#;icJUc57w48N-}+kK%<`otd8o_C(4A{yPc_8r45iSjr-$i95Q9 zk=H1T_qw5?*C>+fZJ|?n0^|F!kv-I_k4i@#ScBq2kKe`OTT;iYd_e{Cq+??sXWfko z&qzOCmI`H!6WU_s=95Z0(_o@$PAgf4aG2RJg} zJ6B@^NEyd3fEOx@AJr40b_wjzLOWv8+%#uA#^yxj(b4LDx8V~agY`tI(PNROE zti?_;xow=E7YH*)X4w(6DxjWDItUd*f5q`09(_k|DCAnSpv?n_7U=1QZLUQN&dH&L zprUAgG5%9h#UGVYaXs8!tHNK`7csA1RP+53fa>vxt#_K3o|uXE`xT#sWIKx~_lnOV zDVrdPVy`}g5(3mYCL}61eq?>Fo6HgLaqo7a=-Co4pSc=Gql{CK_uG2-@q1b)4LSx31N+8MASy&SMEdOF39J8H|N<6dW z3-zCvot8L4iu&|xc!Q9H2L;0^g|8o6r+Zadu-F;n)+8|hiNqo~_jeM@+rN=m8u|bd z%fE$_S0tAI@4-oS$NWn1+ITdu+GP}k29mXjeCI@4L3KTn?=njg5(fYRasHd@b+#F< zFN6*3@9;++Rk7Y9UCt&ty*3try+NMF<;Ab{!bQMV)~8WCZ)+W&{$QQ(L7xj&pWm+WXjA;)zkmX3){c7aS6&WX+<{3DM>Kh%kTV!|?#z9;iLP%#wiM{xn+r>%&fk3yTE_8(`~SBD}L+*D@8p zOnLqB7MhE3C=yY-UZ7M+Dj>k3xI)PiNa zJLPxLxrCsRsOUS0(V&+-M-LWL)hmh+a@!p`+&G>ic`Rv>s~cy}j0bL+ixxcc(h_Y* zUyEUlHjG~W-cpNQ2)Q)|AB@8PoY201jCx4bL-1_$A?kupGk? z-`j`NxxrhBMdn6ALh1O70s2t>6-UEvE4Dk_j4!Ta5bSW;2zSLySkN=Xt8DO%uW<6; z=#oKtp`t==@fzr*IQ^;tpoI%$8lh%EH5iFtMZFt)qAEra#<61g8{$B(iq>6@8FvCL zHJNEOSw_2Ck6ISiM6()$74QJnJa7p7D~ikM;6GDbEHQxM*jLAURdJ+9*83OI&vsf-$!6=PDlSk?#S9%aB%;BoB7qMcW#J(NIP{eNb*Hmj$kBas>=~ z1%$ZAi5-2dbp^Kiq$g=z=uXlW{-pbF%&~VNXR&1Gi0C;1Qg11M!}XW^KsdoOAZ2~` zw_*b*#Ve8aF&EGaNUeHTQhFcnr?02G|5lJ*jccO^$a8DKE}f^0zr+P;57|`AW<2Qj zd3&V1`bLZgo;|ZUIH(Bm9T?6Qg$8~&P|E&3gF)zTV^P+|Nf^H;{v4DMa%)U>Et~52 zq^!D66K$iT?EwSi(OIjse;o{|8&K&tIJm35Z2udF=k8->#t~!tVp&9ERjwcx;Ox(4 z`fPIax`i5SVnDQqR1rACJ+O7r`wAf!H3R8xRT!3|nu|FHYsNv!OKm+&!5yW$GI*4; z*W&0czI4yxSw4yR0^aQt=k1ibKHY56KFGkTf_9Jy+)pqu@VM^r@mhAl2p)7xJIPh{ z<;ve4C6+>82XF8q80eZ%Pl)E|F4Yn;fi2k=i`M6s&&Q)~cmS~3Gm}JO><&UX(TIud za>&u@t~w~pG~n@Ih=gOH9!){bd+bscqol56#-|fYlL>`rxgD7RM2LNFMg9CjFTD=i z?uASR@|IMR9FVBxqmkc%uM=7K?_|O?VhjEvJ=}O?U>7iL)Otxg7^j%rleXq{h9Z@2T zwdB&>SF~T#b2+yGS;tKZ?DWo^`FfmJa;oR)E{waQ%JvVK(ojNqg_P5$juF)Umzm!U z>gVZ(_pi~z^_TLB@tw}()-}gip{&RRJMGwhF;O~HY(lD?AxmWF6(E%&w1|SvZ=JS> zSY1etWv1J4uc!qExC6{B;2wAGwi%Z0IeM zwFLoJDL^xDg5O>Jh!nRRh)!kW5MEJ+F^Gxe;y)uyvk6(8F)`g2hyB}y*2~L7pO<~8 zH-0bQ8C6$EM;HRxczC#)vxP%B`}-Teaf6HLosNmAkdI*pjsm5DyNxNo?x!KDV}L>k zWv#A_uj+U$-lVT7gNf}98T&k5ILUgKtCo2l_6>$QiE`fl*L4CYzo96qTuQzKns6>$ z8ge*7gO*o`h0`TPfe-S~AoK_-+{ayGay*tv zd~!CTrt;Iai5~Q1$L@a1vp@F~umh^{0xK0AXC6g;6P23COtGwJ=#G*5Hs7Zw21S0Yo_Nteym@^zy>R zl4r87h~tm(1qOk*(BGwh{74Y(kdda~2ZLBKK#Q1UE5nm83WXpz ze?9yhvp;gyiZ}A5y%a+^A9X$0e-O#(xn1O>V=bqiu1Q4g9aL)fGlit}2U0-coj=DQ zP)TY%nM9;=m^s$yJR&(CL7^FjNS%0{$^sPen0Z9OOG@(8V`$6Lq$rW-2{B zJ;j0)f?;pV8V`+RTsZMt{H_Q)1o%81C#-qH=Ap%u{SAH5ORQboAfiJG@RPfsD6g6%xF6({YHa)N0VN5NVv^l4uTaqYskd@@W*Z24HhmxzSH?3> z#7mIpZVGTTaRt`9(}Y>w4m>ElGU_=$RN*f;^9Tf+1k)e3QKg0UTE|0{9fo6ld6t|$bh~s;|nJtf#TnvLC-b9CWE+I3YcP=lFey~>tZ}ekd%E~_m)`>KMU}+7W zHyZsWf=iQ5ip^No#%u%Mn4AQcl}B|SGJdqsx$~X8naz?U6;+#2Q|tt(=2kV`TQYYt z5*?PtI~M}t<(5HD)f1}1kPdN6k)65iA03P zl^id^r({mb_3r-j{3x+OjH+aTTv}*j_QJgG`` z6S_eA^*WpL`$?>WeNKu6>+Et|Bm>#>wC=bUtvT*$-(^!sidE1DNzprcC{3sHbtrma zSt~|Gg7dZC2IJ8sLith&oSsvE;Kn^2p1U=gt(B7N9Y4X6FW)m*5Fqve?dgFKI?elN z!*@wiX&^35Vi@HSTdw0)o*MD!9QzWM%IexLLfefJ^_u6Wqo*_#tXxY60e=fMEIc-VSue8g=#5PHt~PijxIdm%i8+t{X6a0juJ=76bHlgP>ZcUi4s>!JgBo& z37tBGp~5$YQ@2X7pX`CAi2Ln)Sr%ye@igv6VSXi?6)Ow+i0|p_VjjQE zH;_cvTu$~mqQ+B!I%$b}o|&KNo6S6HfB3o>iy+F$y$_{j(n*txl3nK*2>lxFr_9j= zLcC9*k4oI`tAks`ct7H&Q>r%TNo}ynlSyOWO5&xjNB% zz_@HH@Ul&OUCA=e{=VwT*fX}5w1Q7;L2PY^STJka*#~RTyORY z*F*4rH;w@;(XfkbFhu=FhD81EC!dQHLd!bYXTUXiG0Z`Jpjx(aYD4&uhUN8eIB$i* zZF1^3hQT+Zd?`<+l_QAb;%zs(o>YT!NtNk@9z+`JIr?U=7#oC8{7_yRz1i(RN*tqI zimoX|F&xF9EMEUUJS(EV3aTD$BeC}E7p?GyhiuYK3Ir=h*=y-Dm#CmQza;`A<7Ja> zg)eWPmlVm7C!`thg@8Cv5vFhZrX1!5&XSi3=dIqJ{`^(~jpzNS?2xC8 zOINAeE6rX=Efk9}Pd;Ry+8_KlSLJk%<%Mu}7J;W0_pE}cT0eDWv}tsxD3RDNk%31= zAxm?)DGGVP*W{y9v9+0(3Xuf+IviL=FBG38k%}3Q<|g8%Pp2h^s?%jh=p=CEDClP; z0q;pzGb?%dXtW16zWc)i7?g?S$&8Nl>k- zT{qk0Z$-k~d!wmJv(N*`pY^kmYw54zW;rBMRyeq#L)r z_wO~&HSb2}gWJk2OsW~NRjbsesL-@T6`u0x!s^{~YVC?K zmbl`8+Sk;x6$^Ijd@(ueFzNi4tQ(YQUAFN<;$Gm5>$B)5?Yg7rVr@oW@Z36+yLpQ0tkj)4wf*V)N=#@k*bqODdyP@?FS#oF&D ze0ZVX+J`awY&WV)E_Fuf!B5Yyxz_W>aQx>CKxvbIXVvE{KhiE=H{=bj|xVoE<6yxtk$Vm#nX|Wuq6CEpq(9m(8o*xQroDoGR@cKY(x;Va3N z!^&mh){dwL)iPiqN7tAd<@!UQk#l|MIK|57#-Sbxpf8i3I zrp@G!pKg*VHW9^F^Nut;ZQ)Jmr&v5~7p%6k8c`807U9%kxPy7Iy9>sWlHH-7nfJt- zy1@*CNJ^$fu6wI~<55%Y2BWOJMd@=_lr8mf%pB@ z`QKE!Qaid8Nuf+yeDm8sF{4eyG^8N;kYV#(&1pjoqPYu}eQ1>gx#Q9V)Sck3+V2W* zy)vC}Nki>DxB3Hfi?Bs(V2Up+1Jf(Bb*%P80kV4jBJQQ8OW!^NL1Sl|vO+^xY7iZ< z6IP0XUDI6Q}T^T{E2c~MU4UE?Nuh-5OX-LDb{@NPWb zsMfxYqJp(6pL!bRZr)~VGwk_bl!)J|rnBJD60)-4lIFlLd)FZ#)R<@H$pXQEcw+HV zUwU3-1!(Wh=T09n6CxM){R)t4k}TjGrP&~MT46A2gwMGqB5i$lF*_H_kL+!n-Fd2;dj`(hArQ}X1-{t2)odyLl{>*Qe@ zNx0LyBKY?l<>xOFva ztFv{D3d18xt2ZtZ$x|DVQU$b~dm5jY_uAN0TGwrvJrhD#Px>05br*$!?fr*q7kSj$#j`|GhaSunE>0P4zi+k9HGGY@k~mVKzz!_m)Q)ZvWZ;8Mmr z^#Z(GBjGM$!tBCucb2ypk`fQCw;QpeU)kUHfbvSY=mVU~X47I-}NJBk2Mm zu&AhRf<@v$U`1!{&WK&a%t*@hobsO5YWT#XRljxV7NQNzDL=5ONAB8yaH>^sQ~MM> z6?rxR>f0CHlGq6u>$e2^_F*pC)fpk>^q>vzy9}T^?pufb?~8>_*$%U-RxKL|5$Wme zx1`lBhE_qs<>q|}j-l>?o67DFnx<%qws>M~Wyx$BsvyVOu7eOtXMQkFee~>>1M3kA zjo#^P^z1LAnWC->D;BQs!4w;qBVP^)ZC+s_W!9_HyVgW^o^I?;af+69Exdm>yz;J%X{~} z&?!VMCsKz8U+!h`cUZJ+2B$Z^4zj_PM`Sdhbf|NI9g6uIXX|jw5ns1YU;Ka{8zLO| z-GII4nOo7#tX99O9v-p|G`0<;PSy7F{iOlX^L13jYnssIDYo1ldHxnhTgUv$|b^fTQ3kLo}uCWsCb>@BfO{i1Ls2})Dx>R#EPoj1>{ie;N% zPntY`@E>|+5^Y72*PN+;6;jO#a-n(4gK5i*b;cNVa=3L;NVmTI`5t!|DCJh^!snxq zx2DT33l)Hgx6KERP?})*)f=-_hl{({U(87jN-RMw73T*Oj*FMd{Bh~(8gH@n9BIll z4q9){x~E2cUomCtUVAY0%C3m)(Sn`eq7pVu@z!C!2FK1p2ApPU@`>y=InB>0!r5w- zYViy@Phx&obEW0>D?C_#VBw2VL#dC*S5JOU6xzN=6Jcm9=eH%-vzE}>CKg!pmn^3=fjl*y>$iuT^x!PjM@zB+ZBkaGpVhb@lmGm+6~JUib#1a{Y=b)cC#h zU$~X2%H*S}+}b82K}*A+ISHkTk(Wi3G>N*1WQyeyjrseue=Bg4Dy?QL)ndZMmU2NV z=qbW1qyJ!RWomKq%zrnAt;mFCmm+5NJvrCfw@!u>^HpV;q|egTQ<}XEF?bK)Yb;3{ ziYBvw9jX{3$|+jgzI@T%!ITytp%7=|Z9dPpJaf5i!iDf#f3<-VshCL`dGJFn@Xo>| zV35NrgSeorW;iM3tV|vwfwbQ>B$x26LM~S3UDEdHD%P919F%wxmKO(azqlj2g=%#U zH$axXQ?=CWw((@=jLQ7PO*?;f+YR#iYt>jD@AYS9_k%AM%jU&ke)7}VaU}*rqddfy zFAI{cSB`#~&>u(NB70U5%c8U)c%Qe|iLjB3zSrQ;JG{EtSQDD_AWOyd#Ge)SxEANl zBoEeCy)>T4mGuvfLz8g&6NcJzHXj(#!hDRvXF(8ZaN1{jWb+6{HUy)g0cn3e zoql|QnR)q^~(xA6PQ;?K-Twzx3lIRsQI)7N^_U- zRsk00)tf;^y(N`wb-Xc(YP_9`*{7&`H2wH4c?l1y!f%N=k{V(- z3K@`enu*Ci8rWNUP8Z6*NRv`=^gfk1WNNJChhckLEp9fkPYwTejoTqC0NAo5n#$u3 zTrZhMWA^Rjr`|`)rF)A|036~XbkN+R`-ZQF+u6_GPQLzCEA}ReUh zp0c)8%pdVX;uE3hSC-s+bt#ShLK+-7g%oXl74=3KNs< zLa8iqI(Gw_gm8R~2g5Z+y7VE%FX5XR6YHF%d=$Z+RdEqhWQ zWI{`tlogCd+K78N2@#1Rt@1ZOq_nvHTa(WNU=tD>g;JvvY$TQeum;xrvR*s2M=D~L zr4f5<;W|E2u`C>3P+Hrb8#0L+3c;B?fa+7wNgL%c2f1Fl8iHddq9@}WNW}qm5kp(v zDOhQ=Jwu?H-*a9X*5|B57PK2;Uh&Hud;S z6C17K9_fJAd-aqX>FYVq%=Vu&impdoM>JO#ODV-X<{vg+6tWV!yXX`IQ49XWt2GW@ zQsf!B?Y51kmoA%mURuB* zeKW-bQRlOLVjc&UzSpXMhCsf`AGq||{{b~c!Hp4YZ7Scd8@|JL8^)-8B~BY>t{G!= z+~Ws6SR)fPtic*(B)JG|GYWGjxD$Z!K5^g0VnS~E?I6U{-7PZM+Nk3|F*{6NtCRt= zs1^G?cOD}R6Zz&!l_OtTHGz6;44v%!1&XWilVKLaqdzKZwjRPMXdM|alP7Oie`c~wVb=#BgxhQ48rSHuQ3 z{KOwFt;j-I2DzsEIb=)a(*-R-`Jg17L`4>M4ffmi4pEKP#+dInO8CNz_Bzwq?xtzK zOt)=j85CYhypDJ{>-K&5;TafA&!^uob*C-In`$!{ZBY7~QVW(1tutQuqU{ zrI&y;%g&0c5@eAZd_Y*8s~XQUEUpb&fJb}TBjK&SH1+3i>+vzZbb1pv;Ij2Wf*Uwa zFM2lrPF!O;N5@P7A`*w_|9W$L-6A^qP62@hA8+s)2AfmUY`2)5ykQ%(`(kWl*hJ5* z)5Jo%BIqO8Mq|JiDYcGk9c$e`83P0QMGID0!faM8YM>{Y&_CTk2LBqh@xpPbiHigc zkUMW!;vaiw74p96Uag9jjw)f2XH=)MSIs{5&W7fIy@ryzqC?dEssTYtN@UKvg|qL# z?PhXGkJ#Z8)pUFVGZ>X$KiEn22MgwMP#N7TkH4Ip#<=?DqB*GEGH}@~cx!?NyV4c6 z5jfCX#)}`r6((rrVuen7T7{mQY%EJEP|I*4S8K# z$P@b$#0))*g5Rqokuvx!F34S&(!x~tAcDFlZH$jlBGcM+(AFKiCHDy}#cayd@s~+0 z^u$6AfxeCaZ=528Lf%qy)u7Q4h3^N@3^SBR{t@S)prCs*8Ik+>c}WFUlD9GuSJcFnS6^ zMncl)5}q*!tL9Yvx;P+maNQ@V5o3ghC*BLkxy(J?`M8LVhJtr2d|ivaq&C})(hzCm z4Svy3JOV$$1RPj|9>BtF#9Z7G;}632q(L}WH#>f@xz7VMU%y;xf^MUv2RN%E8@^E_ka~P_(zOGTcOW7$mTp68Qcvf@efTq+`L(27o zOOB3K9sGNzHL||rvKgfEX%aK1&^Ts4Tlk=F(DUN_Nn!ksbh}vI`=@)0+~HCl+5!=V zgY$-!EM1rQO?}q4)m9x*z#+hy6h1h>2S<=%#c{ z5)5RNa2t=DjE4<8+Wm~8tuKnd8(xe#RDylrG*U{>x92vS#TAH(T*sz)26~!ng&DLj z6Z;^Y77#~>C(I(RoRq4EzdzzLEV=Id2g8Oww)#n~-dioOC8@^r_>SIScEN*h(u(nA z$Nh}c&MIlfUAVlTNqzkfI%a>j2ux9)*xspG^a@s)T_1!d9^Mi2dnLZE5wKGw5ngax z>iJDzU9!u+=bPW_UMdiCeAP3DT_jbSw2+gks(mRp6IihwpWos*?x*jZr}xE?uIB>z z)p+L5K|zXU?Zrz$ubn?#=QGYy3)uYkaoM7k|&fK;@OVs>b`>ht_4h zWnZ<+l&2G*O#Rjw2Zda7kOj!Ugoa}$N2#){es=p=vUo!Ab5%~H5sqfqCjW{+|KX+y zM!6{VAoDb-?tFfzvpfEgFB46}y9twx?0X*KsW<9?F-9#fKtzqeO<*PJ z5`GjqZe`=SC6w~E%fucl1pe-qk@jVV^#`dP#`>cIGiPNHH`_&xjiLBeakl1nGfBpm zU@aExxUkPV6MA<`l3^B(x=DmF&*wdVd0PzTy?RO$$jA(tTMl28@$MGq6-MdRTy3tU z@ScB+o}ALrD^DrW)6xBX4hAG5l+cZ{`8p4Eo@`v38pov=4|+qY8D)KCmviq@EBR6DbBwBXB^~w1tcbaO(JMnrEr6=nK?*vQVTh+6buEO8r&;^ps1?7hybY*L zHVx({z6mD=BHx+z#(qQ_ZN^SOx)P;cpv9nvk;gHI8^OR*L7a=+@pHJTg{7HCPI+pM z&KW_f8$2iD_Z+myxGmZ{h@9p19Uzgx;$Dwn4lA<*B&LCC$(*zr&{xBh@=KrnB(^N} zPt#P3do$lR7<^XbtdX*Jy(2#CY2=MU9mkBH4-~btv>xi_){f*`+dqNp@mW8xi@r7e zpg6Ujm-o&y`aw;f=n+2$e(W8Z4OrPX%=egQno_mgccKIC?i%ekpT^EZOFv|S1NK*_u7M%7MxK0X9>W=!A8v432K^+{4XAuj>!#S5~_(NLQygE%q*3RTD z6g|MUT-KSZlUB@LJbntQhu2H*`inq9)R)&dEiq9N5x|SyHMg^b-opuEdC)2aA7&m< zIO?Y}Nwk;2skuF)PWe&*-iYc$q#66bldCeg_CrYZ%+WDnr*GHLje6uZ{^aC4R)6t| z4i#+jZzcP$Edq5eum+`LyIW*C6YN|?dOE0!mMTye|Mz^qG_D~j0~?j*z7!vRS3-Jy z`}N)R!pm*Ha`;syU50&X`&VrET9=?vgb2ute56hEXK61nf|kGzxLuR zb9(`^nd`)=MZ`&^0T&0Ep+$qFLWr6qdf)1}H281Xof+z@9~lIKnD0|mb4e*6G(c*J z0hNvX+duA~1?bV~<{?X6bVheDcKpY!H)?-BBC8I_rT9+)wYP7W{zf*yAFo|L`#<){ z`85h1lgkS0axCzQO3dRWC(Xs<6v839RMVr&36p>p@`%yd5uBX^&fV%_$bJqZ)$w3K zchPOAuPnF9*QAb#v@KnKAWiiv?{jHK4{iVO!6>_{mf3IAblUZj_Z}5Ff=WZS?w=CE z8Z$vR{y|;;8d{g~s1`lcDkm|j+%7rbxeFRZr@8RyO)*2C61q1NYaa-cGj2a(8yUhGpgat_ zm_H{14s5@&W?0K4Ey~=>v$`fl^9%tQGn4P*KS#HUzXP;IE@glKhR))<{)0@g{Hi)#Yf0?c}+>onPTy-iJ}gbXUt>W~Bd+FP(cS#k`bE&0L&5M`<~) z>_s0Q(Xd#&6}0@R2q2SvHrbkd!c%GjhJkkx@!PSwjNhShZb$R!WI3y7WN459%YN3|G;zYXGNmk>GW#y_NDq3upar@UUjwd>fmb6gpCu6?yar*s< z9TXSoIyHN`?;u|AID$$u+GgVeZL)e=>Q;A0Wj41W^BBVdYZnhBab^jVT%7{;z6G(l z>g6#!yPkmf-qN;pc;RQ&FC~DP(pUh@R6d>jTAs7HB8SiBXtM?)M;k)#V`*0fO?3yM zpQZDyN-V{`v~1H_DoSlc1|NJd2X&$SznfaH?3rr<_+0Q6?oc4J@u9Ry|8rB z^eSIvm_y65NG$;&b7ZMsPD*kK^8ovU{Y^-V{{=kh#F9q+CHB;R$My-Bxwq9Y<|$8b z?RBUjMkGIUc_f7k2P-cSycd+CG8;q?W54dzl()SUk}TN6%ij)6EVg(QyHq^Mxj#OL z?-sPhu`Q9ldVMpd;v0^_qVC~3$79i&KNP_Lk0nfT7T0PqH&pVsj%LW!wGAbvA+zMu z8+)Yg(Br>Oq*Drukl1+50%ICD{iJ+QA82yGoqoTdZ&5F;x4POH5g^>6bf4Y+L=#Bb zS=u{wb4wK0l(Xy`Z~o;pn7=fVgsr@VY4%w<=#0MKMEspN7-q?I zx!Cyk&Gbwhb9$qOR!vqs-jj709B(O zoI=$;0IJ%mo$zWK{gezzAXnNX#GI0RT`(C*0?oHp|zd(rGx zxP#Hc&_sKcc;adl!*C%^1AY9gzC0_=HJ94e^Xxo@_m9KWBVeX~y7BQ-rq)E(hE!EF zmIq1cME#K>^_;~XCJb`yqg)??8!CEkqJV?JTq8{0Z~yYpTpgUG&0}JUWSHGbffP)w z#0q-_ri~0(e`Szjf3b8TGUKv7;)Gz&qGlCm&R7*)3g6D|>IF5c+^srDbG(}W%|`cCAt3uINX+yW-uDgIf-Ftt5RUrMqU4P9Fy* zFOq#lsv0wU}^6tehSL%x)_Su=?s?S=zcWcKX04Af7~KxpJI1i7!oX5wulIBX4l-++df~=3%(T)cGr1Z zk*Lhtdo7lfXw%z8zM7?7Ju_j7Q}4p@?(RF7u6S6EqmM$Ho$VpAQc7_3BA*ICm?x;~C)GPasY@U5(I()ab@OjHfm+l{i#TlBZCO5{ zhnU)3f1iyn4J|t;atf29EX!4|Fc74U!Y--L9`~isd5a1JY3tG&okVpWNp?8oz??4n zogjS)y`5V~C)N?xXVQDqqS8%F@lf~p^5whdya)qN#|_UYx%= z%kySL=?@%z!+OMt(*n-R%q=SmfXA*yyYK8<-SAF`U7K>!Icnb;SMK6Ho4ufEpUcg> zm6DoOj6n%0t{_Diwv_BWqvkyn*bwzbGH;7|Ie+f9mFWC6-t2&hNy=2+DvGtu64d*F zhf0xYw&HH*lrXW#gDMjdUGrFG*Yl~O%o^66?41^1s1OXUeKL2YvN-XDE7hbAG2gcf zz0`L3#qSS!slWvD>t(8`$mTH2a+I@gCGge?u9~_JypRGr%dOc*E)+*kmG)zVoo|bl zii~(L%XLi%WYrdqdg@WlUM3TbMP+t6fhjvjr9pAaKLCvDa

yxUVE_E1a*-N~E8V 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�sdT|?=!Ni;wQ~k zViXS$@BX2aA;D3(E+);+RoXH922~-S&>n5Dlf2@`dJwO^XpW9Siq(AR$?h7F;BeA| zA~aXh^J(fR8Pf}4p1!3QdTKG#Vb@ap(dNhNpmx%3bTDX+ge{#txJ$CEybT*1Fa&ij z!Yh1soXFO-$qwPtTnx5>Dn5i#4hjU_A=6LpACbA_z~ujuQ#- z4%p~jVh9(Jm6%F!c;`-?+{INYLTzROvO1TQh1%zV|5SB5zT|UPERCl@T5!++mrF=; zd%1ZvKzS`Zf0*t@3Fz~Onv>RA=c=CxNvW5veIvb_7;uZr{3_-Vh?+G=V358iSEtQS zeYhyVhYLu2PQce;#eWL1OuY-VobU&^d%leKe@xgua*a8{*SXB)_8Axe-bN-_vpZLG z9hG0VFwxUkniM=36q7xc1S~dNjS)@1+|1tnunlVnCNzlrG1m$YE#2J(_Z(HSl|in~ zlB*%jPhRX%SF8jPg6@Ig!h?FiYg5>4KMdXZ9*reP+aK3M+fw7&V^OMYOhKQQi^(CIZ_7m{Df`rb)bTCWuME?_7J{0ZU_zM`GeIoBZViIV@zeQ!} zdNkHwtlT@Vs|dPYbN8}%`um_XO~Uc3;AoWv{Ag|kbH`q6>q(G_biD!*Dkw`ap{SKD zt}s*6YlRDIk#-Lfz11mY))dZ$z3;J06imbFB6nsF4~#*TePnsG;$N-h-Qk>GdQNK2 zFSBGQ<|>whIY^7>?6CHno7h<9Hk(aXKQ;fh+~U!=N4Sg@D#Tg`nw<;?aE2p2Rvet#n^;o zT@iECo1stms^twLa@o8Jg9M)lw~A>o{wC7%&r!BM&(CVtR<+&|rvbH?31Gxi`&v(+ z*Y+mp-<0{Uo*lOV4N+EnG+?ciky}_UUToc#3(2w{KJ0|hhxa&l&5E4aIZG_~C{f=uAuE$I75rE+M{K6`k9*p4cz4=Q#LEcE2< zM|_xK(~v+18|`6rWqY6@0ldt!R%GKlo_33Os01GEfeOBgk~KwJa4X0rB;XQo-l4A# z2NjNKN%%bj2dq}yxCl?k!jj~{{n(SAhIT)9aLkjHh~Ly2$3&9(r#7{l`T4G$SxRVv z7o)ttdY0Z4cTte<4%!;%B=aN zPD9edQUk%H?PNKvRSxwMa-Uuo!EVdZt4`s#O#<{D2+r@eObC$3D%B z7iE%bR`sNdW{})+jJ8tVGI5-K?d7@M;jDD(qJ{tgvIDUXO8RkVhd)N9td`E6{7hUv zyfcUgL8#|XtZ+OJkEKEW50~A*qe}d8$*ngtp6OOhg9=|Hw@xGDlP< zcKlyr+d6tmY_;mY04DF=$X4NYGya*bp=2Ob7q5dGpuT zHguFo%kA3uAj zQ`YAb4tP~QGq-Z{#gtP%;Y$+@%{z6ROO0;0?!~fRoJ-a$a6Cz_3<904&k8>GrOBbX zlBAX#r9MA5V>Fd|)S(rdLq@oMxYq-#PCUNy*|Cx+xG+NC5@BNC8anIX=#2WM2U8Jqe2U=BpWmVR!b zWMLskU%boMJaXkfEVO2)9uONueqytI#Y6jtq&;tS(tqOp7$A)(UIi^vO`Jr+Yv@{- z!h9<5X3a6>#))R)*El0e)n9u@oh>vf{!5U9$IQT)AkZNP@kB&}&VIs`w13v@ZYYx~ zG%F~CbvXMrhvpLDU`XoD@?k^+f|fLKjd$2B&mhiAJ8$?MCHk09efgY9{P@J}nqST) z=Ip3TJ}H8L%85crWOC@d)UsyBR#-IG*h|ArNliEZVUmzMqOFizAHQ$><^fmebQ!g@ zhif9(>?+@$Mt!3%yL&uuC9EM_xE=92D@T`F#JS6b9*(iacBKpo&2-RJk*NL5f=Vnd z-tS#fdq2X~`X;TEUQl@R_Ydoi!OXU-a%MVd9= z8C7+4bjMDYw+qnFhgLY<@#&l@i#Lu3`ju~QujOQoh1tXv$8ClWWb1Cp1ahT8%j0;{ zk|rnScCFzxg;56B08fYiFkr6*-G_DRFP?wMi3$$-VdHZE}NkU9DXBx<%WFl3MN zC}=Aksi*33>E%wD^*Iaik$PeqBns{)a`jJ7CN~2;>0%Fi(x?>HStc9+(S#gDZ4W7K zeVq{Za^HV4yboqeG!MUA9{Qmmu>R?syl&u%BHnPivua(n`Pnto+bJh+!0Kv#>#4?%Ko@COeVOeU2>jHQ3cXZyn?5(YQ2!1^!gL z>Y&R|@r;LgIG08G<(ZB;ax!!;ZcFrtwR@sfZ2#a48H?&4-#hT41U>VsPVE;_{p#ll z8?!i{QqLR z|8EQa|JnbOc>f<|2~OLD+{GJxJ$4uJa!e{0r|Y|oULcnOIt|$13d`i`%SW9ZrVRC@J0KJ6`r$gp9b|C1mI5qv zCb)GoW~umFq=a5taDhd&gs5-k?v~p);mYy5GXfDlm-nwjANc~doixo>=PQ#9N_A$W zAFkf><|)Mofv5n`Uw`F;PZYX(G?!FuqVp>zNaj>XZegZeT_94$*qq~zw0FEY>{H4cP_vl&Y}Gd8??^Un zqDWITFBpdqOgGhZCPy96)ASBsPJAe82$RxBVtbELNxt)_MCM5mMKmHihLINX@?nRX zdC~AF$uMb_3tUwK+eU@aX)DLEt#=GF7;JPDStm^3X!KohnPqysKK*k^>bmW0DUVV+ z*p@8v>f$+yd+@QNg5vtkn@*nnTUKVEhba!z;a-{wO(#M1A{y-GiuzHip3vt&;kOd3 z*t8m-T{(45%lgnk8?;=k8K@ADDGj8%F+qIIHH0ap2;W8QCnzXJGeltx9g(srGQs_& zYwAYT|1Xl%e>w8D#11ma^8!lsCOi6kTd2b|No_9q=7&Zcx z<(|w8p69wTpjRa#0si3Ou9yU=bs=laGCI?cYSF&i^|^SrY5%j5Gu_n^>OG8u-5c^- zUEZCKJ_yUlWjh=$7y8;Um4rs1KLCcEq5!4bwd+vi=G_b_wvgQ&s^2$R_xC1BWPP19||1IPrv&cL*Jq18*|X(*|AmIqp>#&RQ}(?e18qdI&?DZx6s*1>B z%%AC}JUIJI(H7?pd=&zd##?xAq^5lDt_Q*d65<}#t9;&)!B=Li`}H-rv>q4^h(3hnQkQu~2V7pP)?$veG>lorL5-;v!SF9m;g{R{ zG0Vm|vmKf^I-Q|C%AddRj0Lyykm)Ag0sA?s!bFjo-1x9lL*A(`qUf(Lg6geg!B)Fd z5aJqCsP&^Qh%t|QMrJhmWx!UF_+3{m!+?P{cMGc7MA?+C_(`KdaAgE`Xb7~wkgpoe z+QjDXir^}qm8O{V%S`uMgzr6W53vbw`O~(cW=f$BsL2pkAPuofa@dd%ELsT0NdWcd zU>#y`MrBWAakTWLw7(bLmsA?!*o=XVu6OLomL36vSX)XPJysaUC#5Oo+O3!LiH<=i zeiCpskgJ>~{W=Q+?#-{T-1RSf+xvL#9lIXceRZ%xVab>0uM}~Ym`3c(uzYX}WIL2_ zV8RSI0G_%$O1PMK%>qomVlJ!%DJaa0A3qFoyp_gy(t`^zJz(P%k+9k@0O_8&Wb#$n zbD)#0D1Ahxr-aIxm()Txgmfghb2oM43hrMy)vdG!+=fFS_w8ZN|5r2T{+3jp2jHeM zwOB265;ZU5G?IpR853`4YgS%XXLKzurD?90H54zn2qf${Q@WLzO<@{|<))8$D|95h zRu&E--fbF4%`_EB8Bq`rWxi;;&pi7V>@VjzKb>=)^E~G~=X}2J`y%*T49n@D#DB6W zIQA>XiQYDUmKaAe33loValYE7e43_vt9tvAE!omNg?;A7${|qsLjo1yYf)dlsatsr zXKK1g{+YJF=@O-eU2{~jWD!b4+4qQg=o{;)cAd)CutkYJj<{pW%qH(t2*#|X`65fp z#dUTp;`Q^}<16~}ZW;CwX!74E4dOq`ttVde8mV7zM9%2+sd7cFH%kGIv;}6xd;n%? z>UxmGU;fwX+X2;a3etr)cb_O(RZ~ojf>vcx)I$?`i?;FLC|Hc1`yvLwYj9Uwb_R3` zd+KwGMZxz?48IS#yED=eG-evR2)$LrTi_n*jDB3ZDrMhSHe@v3gJD9Ue}{&C3>HsZK0U;&r-a zPqProqVn@AN2_VQ!JwvIc|^(XIq(nX^k=w+eXj6&FptuK9HeKOYCj#@zCS4INrv&R zUs7b0uvnh(Qg8>V|E7B7zmGXO{kYIm2~mpUF>US z4gpop1HT@&$&R(BFdXylp=MP@vW)Pzd0kFlH+YiQ?ze89A{?AT%o`u=3s?QzxY@(9 zm$`|2NK9YydtfK*Uywh)DxFOJ(r!rowNnsDvrL4m{yTm0tH;X+%@6GPJiA3gCVxfS z4-+mYAKv*y4kl5laxBwoU7+G&u7&wH2Fh)`9M2_{Rb{sLpE#PASNo7V4+Gukl5aE{ zt8GhBH)KVUy48H#zxof|_JHKnd^l90pO(lsTgL2yXG3Y5k-djwvIZ zezOIvUHgs`TOE346~&Q~#IvN1(65&0>{Y4b5#KuA&cMI$y}DV6IcUzA2bbD5DtwC! zh{PRG)2ux+Kp>(`S@gtFNu1P)C^ys?VFH*2)oH%AYr=CsZTH)}LQ^NN>3s!3CLD(R zxAaC$JzegF_LHNTq`s~JhAwhIm?#TfyAe$q?r1Z5=7#Nu6M+!g2kz#Z@eO_cOr{{%1f3q&ygoJx&#E(o7cS0H-QD&k zOrADuL{F_QpyM^C8`~314v=Rpq8>a-`hlO&SjVv7b1Xc&tsRX@!^_s`vctR%I&B|TXLyKCsK!tF5xNxyF6@U3 z%@V78aZtYpHd^J~E#7=GA6rtpLzH53!BiY(NJOq6Aff8<%6i9&uJqa7R%tV{?PJQn zm&9Qz1}fa(W!jsJ)D23LN|7&+P2K-D%sd%mcN zaW%3JK5>O(m&vaS)S|aT=(BgiPf7~~(^a0{ak2h&#LV=c7OR4!3JYDuU^K0-qqAtH z526plknl5Q5Sx^V?(g!yh%Ciu6r&O7ae?2L~#3ucua) z>`^-k{hEg6jkmsO>cvyX#m3o24{+lI?{@M;R6xVs*iu);4-Y++FPVXhSq@K|ko0#U zP@n+_n-}gwa+g-9#@x4;`H0s-uGuk#51yr9yqBmxYdHLgDchBsscW^3%fuNRrOib< zVG}AcWBz_GebH2HssqGaOi&7-o4a6B?*2c#SWH^_Mum29Tfl$@Y@j1hvdr)Z!Vx_s zTMS*fiMoXzo=K$*%%t9#v2q@WKyB6h-WmQecX0XVPcsP6`}^Y%;{RY@%SYu^xS>6k TRBr{~w{6?}fCXOf9h3Vz-{jVF literal 0 HcmV?d00001 diff --git a/2024/day05/image/task 3-1.png b/2024/day05/image/task 3-1.png new file mode 100644 index 0000000000000000000000000000000000000000..14086027a727338c0c8696b2a7f2bbd6205a8275 GIT binary patch literal 12035 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 Date: Wed, 3 Jul 2024 15:23:23 +0530 Subject: [PATCH 200/394] solution added --- 2024/day05/solution.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 2024/day05/solution.md diff --git a/2024/day05/solution.md b/2024/day05/solution.md new file mode 100644 index 0000000000..0afff6f1de --- /dev/null +++ b/2024/day05/solution.md @@ -0,0 +1,31 @@ + +# Day 5 Answers: Advanced Linux Shell Scripting for DevOps Engineers with User Management + +### Tasks + +1. **Create Directories Using Shell Script:** + - Write a bash script `createDirectories.sh` that, when executed with three arguments (directory name, start number of directories, and end number of directories), creates a specified number of directories with a dynamic directory name. + - Example 1: When executed as `./createDirectories.sh day 1 90`, it creates 90 directories as `day1 day2 day3 ... day90`. + - Example 2: When executed as `./createDirectories.sh Movie 20 50`, it creates 31 directories as `Movie20 Movie21 Movie22 ... Movie50`. + Answer + ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/image/task%201.png) + ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/image/task%201-2.png) + ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/image/task%201-3.png) + +2. **Create a Script to Backup All Your Work:** + - Backups are an important part of a DevOps Engineer's day-to-day activities. The video in the references will help you understand how a DevOps Engineer takes backups (it can feel a bit difficult but keep trying, nothing is impossible). + Answer + ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/image/task%202.png) + ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/image/task%202-1.png) + +3. **Read About Cron and Crontab to Automate the Backup Script:** + - Cron is the system's main scheduler for running jobs or tasks unattended. A command called crontab allows the user to submit, edit, or delete entries to cron. A crontab file is a user file that holds the scheduling information. + Answer + ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/image/task%203.png) + ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/image/task%203-1.png) + +4. **Read About User Management:** + - A user is an entity in a Linux operating system that can manipulate files and perform several other operations. Each user is assigned an ID that is unique within the system. IDs 0 to 999 are assigned to system users, and local user IDs start from 1000 onwards. + - Create 2 users and display their usernames. + Answer + ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/image/task%204.png) \ No newline at end of file From 8a91c0a9f55ec8990efde4100198c1b1a668a255 Mon Sep 17 00:00:00 2001 From: Bhavin Savaliya <41487075+Bhavin213@users.noreply.github.com> Date: Wed, 3 Jul 2024 15:28:09 +0530 Subject: [PATCH 201/394] solution added --- 2024/day05/solution.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/2024/day05/solution.md b/2024/day05/solution.md index 0afff6f1de..89f955cc48 100644 --- a/2024/day05/solution.md +++ b/2024/day05/solution.md @@ -8,24 +8,24 @@ - Example 1: When executed as `./createDirectories.sh day 1 90`, it creates 90 directories as `day1 day2 day3 ... day90`. - Example 2: When executed as `./createDirectories.sh Movie 20 50`, it creates 31 directories as `Movie20 Movie21 Movie22 ... Movie50`. Answer - ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/image/task%201.png) - ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/image/task%201-2.png) - ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/image/task%201-3.png) + ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%201.png) + ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%201-2.png) + ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%201-3.png) 2. **Create a Script to Backup All Your Work:** - Backups are an important part of a DevOps Engineer's day-to-day activities. The video in the references will help you understand how a DevOps Engineer takes backups (it can feel a bit difficult but keep trying, nothing is impossible). Answer - ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/image/task%202.png) - ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/image/task%202-1.png) + ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%202.png) + ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%202-1.png) 3. **Read About Cron and Crontab to Automate the Backup Script:** - Cron is the system's main scheduler for running jobs or tasks unattended. A command called crontab allows the user to submit, edit, or delete entries to cron. A crontab file is a user file that holds the scheduling information. Answer - ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/image/task%203.png) - ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/image/task%203-1.png) + ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%203.png) + ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%203-1.png) 4. **Read About User Management:** - A user is an entity in a Linux operating system that can manipulate files and perform several other operations. Each user is assigned an ID that is unique within the system. IDs 0 to 999 are assigned to system users, and local user IDs start from 1000 onwards. - Create 2 users and display their usernames. Answer - ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/image/task%204.png) \ No newline at end of file + ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%204.png) From 5a79df7dbecc5094a6b12bb8ac6f1cbc8c4ed01c Mon Sep 17 00:00:00 2001 From: Bhavin Savaliya <41487075+Bhavin213@users.noreply.github.com> Date: Wed, 3 Jul 2024 15:29:16 +0530 Subject: [PATCH 202/394] solution added --- 2024/day05/solution.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/2024/day05/solution.md b/2024/day05/solution.md index 89f955cc48..bf6f55f78c 100644 --- a/2024/day05/solution.md +++ b/2024/day05/solution.md @@ -6,26 +6,26 @@ 1. **Create Directories Using Shell Script:** - Write a bash script `createDirectories.sh` that, when executed with three arguments (directory name, start number of directories, and end number of directories), creates a specified number of directories with a dynamic directory name. - Example 1: When executed as `./createDirectories.sh day 1 90`, it creates 90 directories as `day1 day2 day3 ... day90`. - - Example 2: When executed as `./createDirectories.sh Movie 20 50`, it creates 31 directories as `Movie20 Movie21 Movie22 ... Movie50`. + - Example 2: When executed as `./createDirectories.sh Movie 20 50`, it creates 31 directories as `Movie20 Movie21 Movie22 ... Movie50`.
Answer ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%201.png) ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%201-2.png) ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%201-3.png) 2. **Create a Script to Backup All Your Work:** - - Backups are an important part of a DevOps Engineer's day-to-day activities. The video in the references will help you understand how a DevOps Engineer takes backups (it can feel a bit difficult but keep trying, nothing is impossible). + - Backups are an important part of a DevOps Engineer's day-to-day activities. The video in the references will help you understand how a DevOps Engineer takes backups (it can feel a bit difficult but keep trying, nothing is impossible).
Answer ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%202.png) ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%202-1.png) 3. **Read About Cron and Crontab to Automate the Backup Script:** - - Cron is the system's main scheduler for running jobs or tasks unattended. A command called crontab allows the user to submit, edit, or delete entries to cron. A crontab file is a user file that holds the scheduling information. + - Cron is the system's main scheduler for running jobs or tasks unattended. A command called crontab allows the user to submit, edit, or delete entries to cron. A crontab file is a user file that holds the scheduling information.
Answer ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%203.png) ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%203-1.png) 4. **Read About User Management:** - A user is an entity in a Linux operating system that can manipulate files and perform several other operations. Each user is assigned an ID that is unique within the system. IDs 0 to 999 are assigned to system users, and local user IDs start from 1000 onwards. - - Create 2 users and display their usernames. + - Create 2 users and display their usernames.
Answer ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%204.png) From ed4df30b211ea5087e76d1ed188bd589692ec1fc Mon Sep 17 00:00:00 2001 From: Bhavin Savaliya <41487075+Bhavin213@users.noreply.github.com> Date: Wed, 3 Jul 2024 15:33:17 +0530 Subject: [PATCH 203/394] solution added --- 2024/day05/solution.md | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/2024/day05/solution.md b/2024/day05/solution.md index bf6f55f78c..61b88e1e7e 100644 --- a/2024/day05/solution.md +++ b/2024/day05/solution.md @@ -6,26 +6,30 @@ 1. **Create Directories Using Shell Script:** - Write a bash script `createDirectories.sh` that, when executed with three arguments (directory name, start number of directories, and end number of directories), creates a specified number of directories with a dynamic directory name. - Example 1: When executed as `./createDirectories.sh day 1 90`, it creates 90 directories as `day1 day2 day3 ... day90`. - - Example 2: When executed as `./createDirectories.sh Movie 20 50`, it creates 31 directories as `Movie20 Movie21 Movie22 ... Movie50`.
- Answer + - Example 2: When executed as `./createDirectories.sh Movie 20 50`, it creates 31 directories as `Movie20 Movie21 Movie22 ... Movie50`. +
+ **Answer** ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%201.png) ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%201-2.png) ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%201-3.png) 2. **Create a Script to Backup All Your Work:** - - Backups are an important part of a DevOps Engineer's day-to-day activities. The video in the references will help you understand how a DevOps Engineer takes backups (it can feel a bit difficult but keep trying, nothing is impossible).
- Answer + - Backups are an important part of a DevOps Engineer's day-to-day activities. The video in the references will help you understand how a DevOps Engineer takes backups (it can feel a bit difficult but keep trying, nothing is impossible). +
+ **Answer** ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%202.png) ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%202-1.png) 3. **Read About Cron and Crontab to Automate the Backup Script:** - - Cron is the system's main scheduler for running jobs or tasks unattended. A command called crontab allows the user to submit, edit, or delete entries to cron. A crontab file is a user file that holds the scheduling information.
- Answer + - Cron is the system's main scheduler for running jobs or tasks unattended. A command called crontab allows the user to submit, edit, or delete entries to cron. A crontab file is a user file that holds the scheduling information. +
+ **Answer** ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%203.png) ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%203-1.png) 4. **Read About User Management:** - A user is an entity in a Linux operating system that can manipulate files and perform several other operations. Each user is assigned an ID that is unique within the system. IDs 0 to 999 are assigned to system users, and local user IDs start from 1000 onwards. - - Create 2 users and display their usernames.
- Answer + - Create 2 users and display their usernames. +
+ **Answer** ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%204.png) From ecbfb251c9cf4999ace1a19a68b69aee2adcaa2d Mon Sep 17 00:00:00 2001 From: Bhavin Savaliya <41487075+Bhavin213@users.noreply.github.com> Date: Wed, 3 Jul 2024 15:34:09 +0530 Subject: [PATCH 204/394] solution added --- 2024/day05/solution.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/2024/day05/solution.md b/2024/day05/solution.md index 61b88e1e7e..26e6b1ed10 100644 --- a/2024/day05/solution.md +++ b/2024/day05/solution.md @@ -7,7 +7,6 @@ - Write a bash script `createDirectories.sh` that, when executed with three arguments (directory name, start number of directories, and end number of directories), creates a specified number of directories with a dynamic directory name. - Example 1: When executed as `./createDirectories.sh day 1 90`, it creates 90 directories as `day1 day2 day3 ... day90`. - Example 2: When executed as `./createDirectories.sh Movie 20 50`, it creates 31 directories as `Movie20 Movie21 Movie22 ... Movie50`. -
**Answer** ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%201.png) ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%201-2.png) @@ -15,14 +14,12 @@ 2. **Create a Script to Backup All Your Work:** - Backups are an important part of a DevOps Engineer's day-to-day activities. The video in the references will help you understand how a DevOps Engineer takes backups (it can feel a bit difficult but keep trying, nothing is impossible). -
**Answer** ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%202.png) ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%202-1.png) 3. **Read About Cron and Crontab to Automate the Backup Script:** - Cron is the system's main scheduler for running jobs or tasks unattended. A command called crontab allows the user to submit, edit, or delete entries to cron. A crontab file is a user file that holds the scheduling information. -
**Answer** ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%203.png) ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%203-1.png) @@ -30,6 +27,5 @@ 4. **Read About User Management:** - A user is an entity in a Linux operating system that can manipulate files and perform several other operations. Each user is assigned an ID that is unique within the system. IDs 0 to 999 are assigned to system users, and local user IDs start from 1000 onwards. - Create 2 users and display their usernames. -
**Answer** ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%204.png) From beea919b0547d6e0fe3ed9306440e6dd79227137 Mon Sep 17 00:00:00 2001 From: Bhavin Savaliya <41487075+Bhavin213@users.noreply.github.com> Date: Wed, 3 Jul 2024 15:35:28 +0530 Subject: [PATCH 205/394] solution added --- 2024/day05/solution.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/2024/day05/solution.md b/2024/day05/solution.md index 26e6b1ed10..02a3b85bf4 100644 --- a/2024/day05/solution.md +++ b/2024/day05/solution.md @@ -7,25 +7,25 @@ - Write a bash script `createDirectories.sh` that, when executed with three arguments (directory name, start number of directories, and end number of directories), creates a specified number of directories with a dynamic directory name. - Example 1: When executed as `./createDirectories.sh day 1 90`, it creates 90 directories as `day1 day2 day3 ... day90`. - Example 2: When executed as `./createDirectories.sh Movie 20 50`, it creates 31 directories as `Movie20 Movie21 Movie22 ... Movie50`. - **Answer** + - **Answer** ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%201.png) ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%201-2.png) ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%201-3.png) 2. **Create a Script to Backup All Your Work:** - Backups are an important part of a DevOps Engineer's day-to-day activities. The video in the references will help you understand how a DevOps Engineer takes backups (it can feel a bit difficult but keep trying, nothing is impossible). - **Answer** + - **Answer** ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%202.png) ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%202-1.png) 3. **Read About Cron and Crontab to Automate the Backup Script:** - Cron is the system's main scheduler for running jobs or tasks unattended. A command called crontab allows the user to submit, edit, or delete entries to cron. A crontab file is a user file that holds the scheduling information. - **Answer** + - **Answer** ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%203.png) ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%203-1.png) 4. **Read About User Management:** - A user is an entity in a Linux operating system that can manipulate files and perform several other operations. Each user is assigned an ID that is unique within the system. IDs 0 to 999 are assigned to system users, and local user IDs start from 1000 onwards. - Create 2 users and display their usernames. - **Answer** + - **Answer** ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%204.png) From 2970faf1e0e08bfdcb18aa11eca909854b454be7 Mon Sep 17 00:00:00 2001 From: Bhavin Savaliya <41487075+Bhavin213@users.noreply.github.com> Date: Wed, 3 Jul 2024 15:36:52 +0530 Subject: [PATCH 206/394] solution added --- 2024/day05/solution.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/2024/day05/solution.md b/2024/day05/solution.md index 02a3b85bf4..4f0e7374ba 100644 --- a/2024/day05/solution.md +++ b/2024/day05/solution.md @@ -7,25 +7,29 @@ - Write a bash script `createDirectories.sh` that, when executed with three arguments (directory name, start number of directories, and end number of directories), creates a specified number of directories with a dynamic directory name. - Example 1: When executed as `./createDirectories.sh day 1 90`, it creates 90 directories as `day1 day2 day3 ... day90`. - Example 2: When executed as `./createDirectories.sh Movie 20 50`, it creates 31 directories as `Movie20 Movie21 Movie22 ... Movie50`. - - **Answer** + + **Answer** ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%201.png) ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%201-2.png) ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%201-3.png) 2. **Create a Script to Backup All Your Work:** - Backups are an important part of a DevOps Engineer's day-to-day activities. The video in the references will help you understand how a DevOps Engineer takes backups (it can feel a bit difficult but keep trying, nothing is impossible). - - **Answer** + + **Answer** ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%202.png) ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%202-1.png) 3. **Read About Cron and Crontab to Automate the Backup Script:** - Cron is the system's main scheduler for running jobs or tasks unattended. A command called crontab allows the user to submit, edit, or delete entries to cron. A crontab file is a user file that holds the scheduling information. - - **Answer** + + **Answer** ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%203.png) ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%203-1.png) 4. **Read About User Management:** - A user is an entity in a Linux operating system that can manipulate files and perform several other operations. Each user is assigned an ID that is unique within the system. IDs 0 to 999 are assigned to system users, and local user IDs start from 1000 onwards. - Create 2 users and display their usernames. - - **Answer** + + **Answer** ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%204.png) From 6e6de0dcb6dec520f693cf30d91ba161dc77ba6a Mon Sep 17 00:00:00 2001 From: Bhavin Savaliya <41487075+Bhavin213@users.noreply.github.com> Date: Wed, 3 Jul 2024 15:42:09 +0530 Subject: [PATCH 207/394] solution added --- 2024/day05/solution.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/2024/day05/solution.md b/2024/day05/solution.md index 4f0e7374ba..aea6029950 100644 --- a/2024/day05/solution.md +++ b/2024/day05/solution.md @@ -9,6 +9,7 @@ - Example 2: When executed as `./createDirectories.sh Movie 20 50`, it creates 31 directories as `Movie20 Movie21 Movie22 ... Movie50`. **Answer** + ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%201.png) ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%201-2.png) ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%201-3.png) @@ -17,6 +18,7 @@ - Backups are an important part of a DevOps Engineer's day-to-day activities. The video in the references will help you understand how a DevOps Engineer takes backups (it can feel a bit difficult but keep trying, nothing is impossible). **Answer** + ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%202.png) ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%202-1.png) @@ -24,6 +26,7 @@ - Cron is the system's main scheduler for running jobs or tasks unattended. A command called crontab allows the user to submit, edit, or delete entries to cron. A crontab file is a user file that holds the scheduling information. **Answer** + ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%203.png) ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%203-1.png) @@ -32,4 +35,7 @@ - Create 2 users and display their usernames. **Answer** - ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%204.png) + + ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day05/image/task%204.png) + +[LinkedIn](https://www.linkedin.com/in/bhavin-savaliya/). From a37b0e12b6b64f8953b762baec7e2809b5be5e89 Mon Sep 17 00:00:00 2001 From: Shubham Londhe Date: Thu, 4 Jul 2024 08:57:48 +0530 Subject: [PATCH 208/394] Create README.md --- 2024/day06/README.md | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 2024/day06/README.md diff --git a/2024/day06/README.md b/2024/day06/README.md new file mode 100644 index 0000000000..f6e64a178d --- /dev/null +++ b/2024/day06/README.md @@ -0,0 +1,43 @@ +# Day 6 Task: File Permissions and Access Control Lists + +### Today is more on Reading, Learning, and Implementing File Permissions + +The concept of Linux file permission and ownership is important in Linux. Today, we will work on Linux permissions and ownership, and perform tasks related to both. + +## Tasks + +1. **Understanding File Permissions:** + - Create a simple file and run `ls -ltr` to see the details of the files. [Refer to Notes](https://github.com/LondheShubham153/90DaysOfDevOps/tree/master/2023/day06/notes) + - Each of the three permissions are assigned to three defined categories of users. The categories are: + - **Owner:** The owner of the file or application. + - Use `chown` to change the ownership permission of a file or directory. + - **Group:** The group that owns the file or application. + - Use `chgrp` to change the group permission of a file or directory. + - **Others:** All users with access to the system (outside the users in a group). + - Use `chmod` to change the other users' permissions of a file or directory. + - Task: Change the user permissions of the file and note the changes after running `ls -ltr`. + +2. **Writing an Article:** + - Write an article about file permissions based on your understanding from the notes. + +3. **Access Control Lists (ACL):** + - Read about ACL and try out the commands `getfacl` and `setfacl`. + - Task: Create a directory and set specific ACL permissions for different users and groups. Verify the permissions using `getfacl`. + +4. **Additional Tasks:** + - **Task:** Create a script that changes the permissions of multiple files in a directory based on user input. + - **Task:** Write a script that sets ACL permissions for a user on a given file, based on user input. + +5. **Understanding Sticky Bit, SUID, and SGID:** + - Read about sticky bit, SUID, and SGID. + - Task: Create examples demonstrating the use of sticky bit, SUID, and SGID, and explain their significance. + +6. **Backup and Restore Permissions:** + - Task: Create a script that backs up the current permissions of files in a directory to a file. + - Task: Create another script that restores the permissions from the backup file. + +In case of any doubts, post them on the [Discord Community](https://discord.gg/hs3Pmc5F). + +**Happy Learning!** + +[← Previous Day](../day05/README.md) | [Next Day →](../day07/README.md) From 709c67ce5fbaca3d2c20beee335b5300c289083b Mon Sep 17 00:00:00 2001 From: Bhavin Savaliya <41487075+Bhavin213@users.noreply.github.com> Date: Thu, 4 Jul 2024 12:36:12 +0530 Subject: [PATCH 209/394] image add --- 2024/day06/image/task1.png | 1 + 1 file changed, 1 insertion(+) create mode 100644 2024/day06/image/task1.png diff --git a/2024/day06/image/task1.png b/2024/day06/image/task1.png new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/2024/day06/image/task1.png @@ -0,0 +1 @@ + From bfdea848d683dfbf54116ccbd0caa7efe1a7f9cf Mon Sep 17 00:00:00 2001 From: Bhavin Savaliya <41487075+Bhavin213@users.noreply.github.com> Date: Thu, 4 Jul 2024 12:37:00 +0530 Subject: [PATCH 210/394] image add --- 2024/day06/image/task1.png | Bin 1 -> 122853 bytes 2024/day06/image/task3.png | Bin 0 -> 89083 bytes 2024/day06/image/task4-1.png | Bin 0 -> 110902 bytes 2024/day06/image/task4.png | Bin 0 -> 83396 bytes 2024/day06/image/task5-1.png | Bin 0 -> 24686 bytes 2024/day06/image/task5-2.png | Bin 0 -> 17896 bytes 2024/day06/image/task5.png | Bin 0 -> 39152 bytes 2024/day06/image/task6-1.png | Bin 0 -> 53076 bytes 2024/day06/image/task6.png | Bin 0 -> 98565 bytes 9 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 2024/day06/image/task3.png create mode 100644 2024/day06/image/task4-1.png create mode 100644 2024/day06/image/task4.png create mode 100644 2024/day06/image/task5-1.png create mode 100644 2024/day06/image/task5-2.png create mode 100644 2024/day06/image/task5.png create mode 100644 2024/day06/image/task6-1.png create mode 100644 2024/day06/image/task6.png diff --git a/2024/day06/image/task1.png b/2024/day06/image/task1.png index 8b137891791fe96927ad78e64b0aad7bded08bdc..9c1d5b2bb63a477edd6818a689846fb90b2c73bb 100644 GIT binary patch literal 122853 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

AIb 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 literal 1 Icmd-A000XB3jhEB diff --git a/2024/day06/image/task3.png b/2024/day06/image/task3.png new file mode 100644 index 0000000000000000000000000000000000000000..0e49d814905128f90aa8a563306eb847ed5a455d GIT binary patch literal 89083 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

9lje`M8b5!Cg`k^y$ab!5 zcVHt|a!cC8J%R=+N=ORPQ}#8z779gb5AuQ1c|Cu5P2Ln`{|E%ILk6k~jd~o-bCxLV< zd0Kht$-Bn0VnjY3yyg87|64~Puo$i@5t?85*;~m}72NCi8+3X3RER>s z(s;U|xP^L0{j$4WVRtCn02b|oMKONctf+P?&#j@`R9&UAwh!Z~EbH-9;9n*i&+K4? z2m`rb(f*Ft73?x#<2yd=IETfN+u3YEV}5=q>+$l()gSIXc`ue;LieSqo>^DGTdR31 z9uJqGwCt&J`f^Pg=b>0#R3oSC@rJ*Va5Kh>>dmNu;|<&MbGJf*+05Zx>gBdBihDqn z{L;FF9iwIU{1|gPG9^B029ZI~_o4GebNSN_q7+3(_qpj7b{+*+doGkFy@oA%rD))4 znKM3)uhrrzIcbkS?Z^}lm#wd4T3lyO``Iy+uAYvRZE?6@oAD}_zCsRsJdjHeC$aZqpt%)hHbd9gUvv z*pdklYt(-svvB3t9aW7x1u&`oOlOZNBvQtZ>S@WiOku9pqz_Zdh)f;v<@F6; z)iP`bbN4K!XCh%UZ$TuwW>I3^>En*OY^EtYS%1N2rNfun;of3V3oqOubLhARzh8d*?F~ka5S&(MyxE$K46#c13 z^vxGu^7Y1x+%;?c=3<5F>cUzyQz$cLx7yEqxyEWXQc}kR8-XYE3pNMQ5%Em(vtk>6 zADNJkk=XZ5*KDKTyh1|b`Vph)d5V?JhVre-U`~KcB4txuPk?G}mEFo1>+tMx5ue>O znU-5lf9yzAw9{>6!Zn6@qPXliv2EdZe$XW+Ijt2T7+hFqVf&f64ala@(4;w+)IXmN z+Q{Zyhdw%ev?V1@RxJAa#)R@<@tolYo#UC`z=Q}u$0tWVm zSFoT}4)hnSHVsYez%vYlnXMn?*Tr9--`)15iahk@DHov5@$6rCTTH@`&4uTdNu%`S zxPgCV!umL43=+01y9tnG`ApIB!Nja1CTSRhK$+Y$Q@*SaX^Xr8zlk-R4aapmAyL(>W+@vdWfn03B{ z4UX^O@P1O9)i@vBfY#fR)Z8XZXRKOUc#QmQ_pBEfw;!qvtj9|I$N`-LIiL~`Hwf=a zAIc`;fRmJ#M8eiAj1#YrLU!e9L*4pkz<0FlIk&6He8wCzdjNk>o-{O#a+k!SST@xW zamo}sVv;hoM9rGqKN9=5?e*aO?{j(6V+(Sxm+AhwGcE^FeXpr!BVj9r9Ud)5h$mq) zxhg0sZ`9JXtT<6~=yS%bzsHBj#eAW7yvLZZQ~AyCKwNk>%v2gmo^Ij}(0G$DtlI89 z>#$&RO++#~)LHBxtA?xzffw;4s_X_sb>Hx}(?|}vD#Zwn%hKA=n~ch#Q7D3JZNFa> zJ+X4-PS+Ln_W{AThJ2G|LhrG_C40&0Y}g2?c9KWeWB8H6eBr^x>JbZLGN_n|B3s86 z6$Q!d(;~_psdtPJ>3$1tjq)_tH&l+i_WPZWccjg~AU0%gqjArFH&e08olT{r$QeIy|H;c^0(*xc-55jOcNZZNPWp6uQFC58;n0H6`Lv* z>V|!n+>*}Ipgl+(`#qRzbJ26+7@5OwII}%gq|GKVUgm7j3EP5lyhwKEu+ue3R)8?} z!pU-lY-D>J744TFx=}&5oF~6OigF;XOvp&^xvh-9uH4Mb6->9@LV|TEQXO!;%lnv6 z4|MMOczAk}kfc{-_1g!}78#OqJI}ET{JZ0_)EZE)yB&aP0OH2qy*z-0`MdLPp@AQI zHwMu}VQb(1#VP$a1@j+P`+rl-|3(|Xaq<7nz5h317?f8=g&5nD!pq> zzi}OpRi}Lv&nXI>^`dSlg#d5@Y=j<+{pg-D(256F9u)ReIc!xI+O+cxGHb_AKm+QN;O>2F$f%64eTYWgial5NIDn3>FkfkMBI!Az{N1z(4WY)8P& zJubpRK(@B1ih(Ko!=mcL`{S)6hbyg33R*)Jf962@KJOs8$t^730c+={NF6#H6-S|PQ1}e;;nb4<)y<$kUTzMbulc*#@I!S2 z(Yt2JHpWaWapN=cI3jIvp@?OY*|pQdrA;rVQFxZNOL^HbzTj=W7Lzlb{zvt- z%-2QmX7yTZ2(Gqf{S8xzSa^i4V=s=@==}gZt~b7GLmmq+hKpYk4LXwB%g~wdan_R$ zdcNw(<=7re@W?0;<@kAA^>l25o+4$bv`dnuRRQnbA7H6}uQ#68ua8X`pcufA#v7Nm zqD2NFg<4)YDZhUW)u<)Py?8VUA)<&!|JfX%A=tNhMzuhTkIR&(ec{_3=jn=o*Cm8tY;$nb0{MH305JkLsW2i zsvk|9lH!GI-g;&M!hvB)b#ZvDh6SPDC^e}L=}uJ>Icg~6EPOTOvy-m|Zc*@7BdsB0 za}#e6>vN&)hSe3>@mKCvyI4myjF;cealoc;M&97P%uK9*TA${aakUS2*WGPqj#Vic zr|;3D2T+hTm%YqXgNPZQ^d?I!Iq%Z!8gA+2{D~{HwrEfQ1ZKL;7*!K-k}1tS5m61o z^oM!%w>c`0jwzXDS0;GY6ky`7efLN`VAEKLKg}n2LDzZq?p+VRm(aG&`;Xzsn_%h@ z2PD16hFU~;UZg_VbgsD?>j^|-#nW22tJ#lxO@k0yFqC+3A3kJEjM#(jpZlukW211Cff zfvw&#oT0JeE4Sx_R~-t@PNFNwbDS0xdsI+)Fh-v3l?9>RQ*7xhFQ-QP77*2FIG@5$ z|40^!@^-r+#Fjn#Aicq)fAfiLgN3KKZ1^3PyhJyP#hF>MnH+R}z=3l=MSsWXey4AI zT{n943-ZCHbweMk{#Uc6B?>i0d=8EIi7bZ8?|O${330th6BLpc)Dkn_suB|zOR=1G zs?)7r*Vx;=;c-vx5P1o;Ok}M52DNN-vP=#yvJEQ7ZXiCFAB|n+l zsNivO2j_Oxf}MPlcQVBD?xGFc9A#3Ub6~v8aeo6U*)e0NTx^mus#n@r z!atM&Q;UA63xIKlX#gfeL3^&QN;*Esm%^fahf2IGfjBOy`JLV^if67Fzn9a-SM0HTkF zc%b*h8D2bW>%0`JTn;kaIY6GGVavf80*Sc*Xpe;@Io&UAS$k98w9@RZBx)QYk)EL> z6BwqRh;FBmNqrOn)E<4g(PPy%-1<$|4hQm=VSJfw zR7s&p8yvjUZG)G$hi-{4*7nF_5#k`a)!s)->=QLS9UsKHKO{#9yo*U8G0}ANa5Dlj zf*_0L1nsd9f9*?)<7*>MOCE{GuWa}eQ-#~|omtv$(KPru9}VAQ-Tblg&R>%9b=Bss zmf9C|@x=%ARd7;L^v}so_z~)~v68Y^qg3zWyY;@1wHcS6voI1++@B~Jp``}- zQpwfXLeid|NyCkLrVTsb_5jlEqoon7CTvA19=g5SasOCOcNIr;NvrI)$A zfi{RA;4lP!Lg0oX2Q@MPMhU)#-$~52x_yQ!%h3WO|nu99ln!>%c%Z;#sEAgmB${{*?iycOK&Xil+#yC(xPps zmV#2&JO_1z%t}(P8j+uBr3Rcc`I87FdjcJ;UHgtPM6>9l^_`E;McqStXB)%z^({YO zOijZAY{(YBrXg{8ot{7R69&0O$dhDHTU>{K(=!qb62B^AZS`op!>nN_1!47*@CB~^ zpNx0JQF~BuJJzbad|{JTK`qD~|3a7tQav-0i^*|!QX*&=0lWh~2CzHu?7QthrFs}7 z(ne}Fg;KwEG=>=NF7hLy_g*!w3kE-*`xI6(j)qmK%Lxi$!()NJZYYJVE|#3*ve+b( z6i(#;SX`;`VcVgGt(OG`P?|6Q@PtL*AL&YHiqlS(O%)kbB!Xs_H7H2@Dpzepx3H|$ zdn*SwL|Kx>3pp~;?Jj|GVtr}HGEW*cb^2x@o%U}g03cJrlpb)jT(mEF@#p|SD+f{H z=kku4%0y2;1zHr#A4pqQ^~hAJG;_?|I9&ohv0INDtPFbT%)Jtf16YK# zF3f0*lBhc@yyFL;I>xKUS_J}Lcp*a8G@#40CHkqu$R{h-9r?vOMr6yx_SP&AC6T4E zv8dpdX)&vb$~@}Nk+(jUo+!uUUmg<~Yu;;hwR7MKNkXg~rpm;df?XCtIvP zn>_W8ESAe2CkiCykY|X_FQ@6YSPfU1Mau1*G;IUIYZLa$=yh{5GE1AMJ73pud!*Ud zccD~QQDr9DX3nV&a1R{wk&!vP=WnYk{<#v=dO8yTs!g=@SXh%dT)FX5OioK`52}c+ zc?1LU30Ychhv@$8Opc|siNDTqOOY8@Z1%kaKmOu?BJFNdT}Vfit9>ew+Nnbee};Ly zakPe2VYP?W4)*xd+F!oD#Z;xjES;n;7B_GQMbF2YNe+a!QbuU_BG#E|>W*+89-V`TYG;wKxCf;zkH#0u1|Xxm50v6(T|g$e(j z%!y1~Iy@TaMZBcNZ@v^1SlOTNzmtUQoqUo-fL_qM2hg6kqt5!Oj=2*SnVnE@i{d_; zmi3tk^q1YfTIY>oNUfIr#OxXs7_}D3Apj|jS8+L|m~ZA?7d~4!J7Uv@ni$W=07|^r z6IGS#pO(UOOFFBEcb47)sslepxpHcs@D%kDz#XYk;Dkr~B5lHTX(Rk%#MaoJ%e7$O zRi{Voo@1YZ56RTOqS)_|?fDcRQqX>)8!QxjmWDdi+UXt-ZH&;8VY((|5Hg=is@_WW% z6U}P0gyjpe7NgBR_e!dFC8_k-3bE>VNL8FGGL+dqa_R@Uo;2F9#$TByHs;7&CLJ|B z)hb+)^)chf+R_CG)!$htgV@U>%VuAF`&*{aT6Ow!L6d=m6^XMc4sf2q$J1%09Ox=H za>Da!DmCCXm+Ew2^O-k=*;4vaHU;aCa`?)s?fqN7w49}_@6Mb!DOs0AyBf;8W^s75LcIaW>AlM!g7d!>^?qw?)`z_xn@0@x(rbY>%0gudyWI@ofk zRqHD;Gs(E#sQ{L1aoC>92rEJmdsEQZjx5i=TVW&kXfb=iITO$#@xt0fMoIEc1)vDmbE-JaCwHd6aeVfvQRH5jG8a#qA9pILE+S^mfB# zyzVYv8f7&^ee>ZRV|7+Jb&31r>1LODHcU^ks|Cw#plm+m2qO!C2@dx|pW*1-e|&iT z)6kya7cm-I{aa&x=$)0Xpw&uize*mfN)OWaP;K8a=w)jxtEtM7NAQUp@r;bfEdA{T z{&tN|Lv!}Pr@8&S$Guvz=HvMHnYlQh0*d298d`^^gge{{Qrlq2&c1MXi%LFI@m}@t z#f1N4z1Yhf!#+7F{zXN%`xQ+>_OF7nhpXgNeGI+DeCK@VJ|Rpcsp4UZR~BRRZI@2H zpFD$vaW(}dPk3r38*%)f9qx`&yk5+5eDNOOeDnly{N>sK|CNf?(5T*F)8jrK%Q4~X z&>1?KKbLX7#@!&OZQ_h6^;?BT!Gk1lXQ)$mHZ6r+!L9LUVIizdxZuFLpj;&gp^pJr z3TJ!~KsO+=w|6bS?IQq9d?NWmSaJQY+_DyUqe)(JB}@ z(0mfs3npouL?+!RUY#yu2f6jn44?3a#x@K2P9rcRZ&C$mmM(-p-I|ZXjbJSAEGYpq z9La+E>g(7{*zj0%@_?D7gN(?CpB!kd=ayR+ z3FhB`Zl0llJ~Ks7-D6pX}q`bXVq=bwnhTmq5vX0 zybmQ&*UguB(~pLEqlC`>J|9O%U5)o1Gmzf=L~d^lrQW`)ASzNGelaICucX8y@n9M8 z(D};SiR`h4%=5aOSWMaiwS_+`&RjTo69wQx?~78?&Esq%Z)L!*XJkP(Ig zddoCOq6#)mVmR(nr{;4=am8JSV%7l`ey2?q{|+A~a6VN3Sk0`3vJ2qEV^}!9%zhrb z%TUv#?uc<$rzsh*^_G*5$QIRA*ZBnD&h+b?4~`OUiwRVN+I6-r{9F%R-WIh6Ty9U^ zX>8Mc6>A_kJULwc>+`y@pMy?AMCl%n)zi81s2$w%ZU04zgY;NK>0dard`$R07&l_6 z{7;e1=1wMl^_VyUonR{_((K@zWKrN{cvsSe*gh)0mK2DHs_Tsb>bF5ehu{BTzY(~= zV}SQ;P6q$M;KN;{x2rG_#(LY-PMAoNF>WXQ8z<7AERx^u0JH{~0b zCyE?hhk$m)Q_EA7Ir5#C7xEeS!e)1ezPUqYZibzm(+e1raN7#5XrAN^p*$QBAWV7 zriMa2x=SC=H$M1Fw~KZ>sZXOX9~7yV)7sb^fS!6Enp_Q>3oM_UwJ5=^N$`*rS4`4J zCs(G%28PeL%e1%hjK}W3z8eaDlfYN=@Ofa&XMgx8Zm$Th4oV#IZqEA9y)O__fRQgu zQyV)H2%%Z+5|oXf^}lWz-?f&6*s4=-IWhzPG%T^;RHu!BFSWc};%f2e+J?$**KDXX zAZYGiEdPSZS!n43NUH72!#>)Dt?p*EOYa(;DLGE-_>mL#nd}VRkNtOZx^y{!$a;olf+OHT0XI1zjjn-B-ca}s(m1?Q$V1&&( zEgVyH8w`m{HHJ=e`iVZA<}|SFOyPrt`ZAI{NuN{aNt!5+PhD=ULQgo^d)Ycm#4!2|H8GTtR6p>!oj$kV;Lolo3O%8yAYgc-Fn)e|)F84JdZ=D-adF@z zeEZ|%lZ&DAk9;69BArz{){Iu^^jv2)c_qK#xxMpqgMMFi-TXb$k|}{Dzks-BCL&7-P* zFi@;)@h*4Pzq#I6_&KQXRfl-)2|WxjY&<5ELaXBAv#*#?CR$N;@-egmS+>P{Ey)Je ztz$8ZjUSy8j7tY0zQV~$O&_-S_Q5J++Kt+y-vgG614o(py1)9x$rp5-*S}3#3f0mmI(=PWPNfNLT}*2o?44d zFNT+!SF79Bs}C%4`^J=fC2l|5k~UIP%2QL!M*3cV^HHs=Rj5Nj7*~r=hIZ>bTADe( zxLu1Q)RjWtY{&3Sz;J1(LmMFQU2g;DE8BVJ3{auKjw)X~&#_fVY60kS&uRk)1DmGIdnZX3=BNa2 z7C;RGK4q$7?j@0z3L&+wRp>6!N?99~;DDShG1U>+`5UflD3w4Z^S&YNM4ja;v( z?%HRYt6TD(7Yz5{ul^v6WGD7|w6isPuaMTzD{83?b|3Gj(jRlAXBGlL^&iW63Gcki zzaH!4p1|%i8;gl}p{P!gavrv0x+39=-RrVfk9jPktH;ycenf2aAK)tqCy#v(VJx+y zQJ3yHTM-^}L%RTk!3sxxTB-SNg8ARzC)zlUJ^*f%nkME@wg4wyFSItctJyeZu z-((C4?d&exG=w*sdx|##LW-rQ{CSyn*j(M6u%U#FX-t57pZ0W8Ff`1Y04mh*B37^- zP6SZ`0>l(9Hj9l2k6Stg_zYT~!B~FNIx6x*>(2B%?tNAu!l6W*J~8mfZ2`8Kk(|3}=1uGI;kX6_#9~ z)%xJQvqPnsmfOq8xF$dm(KmEB^6UB5(f7zdbC7VhN13|?w_ZF%?OULs|A@^-O&{>< zCY*CHb8$ampoi0d1?Q;r7FIReP&Yy9x3ZUir{Oa^z0w8R%OBfUm~O!rM=_J6*MJ$C zcK3nKzdNCsG~cs^`plos7=}RY$2LAf7kk7~6qXW`5hSc_QSf)T^V$$rk0LuK4ebw% z@zmh0`&8fJWuz#Tf6L;EKC{Z7dNJ-`Xeuio8vQ4%-sG z(Vl!R551E;UI?vQH<)XX6_1206I0O<^(Of~>SxTbiYS`7EfQM`Vd1t-j!-SmP#P2R;~DZ&p$Uom_=-b0h+jQXVDZiv~*1#dEegX15Cl@qeF7shbX8NI=My3JFnpww?c&%6ZzxT;A_Ue8;A14)I# zLr^W==l%m2h|`pE{rm##=;W*Qt%c)=0kfDbuRd|3=Nle>u8ZHeEncL$VjaYI4vp7i z=*B8ePi!9Kg&n1)6TPF~IxZ?t8kue5po0ua{dHRp(g-4SG=vLM!Wxjd1Xn-e*4zQi z^6V{necDa5L9$9``K{A=p_%J7PCxQo={k>Un{lo3G{y1{9 zO@jZ7)g%?wMo^EgiT>l$AAq+-I8k5qNI_hW*y zh2X{?Bl|{W*jSQbAXSS^X}0Z)0>PC)8A}G?PRbaGx-%Qk%kURy?@Mpo=YeFfFmY1r zt;+w+c+G=kS-zIXpLs#5scGJw7_p)jD{x=xBt`};$7;ruGCJfG_?LtsbmWrl$s0uT zi|3jjhX&S$Au*1DRn5}Av8bC=}8$;TQR8O(DHw0>st$3av7a-;SqJQys1*z#Ee zQ9)`=Ng}k{dhbKl)AnY8L!zBi46CHUU=ekWAi4+tFKWxTL5*yIHTVkm?lZo0yV#bZ z_RRkzzLafY7b{Dg5$$x}TRjd{1hOHL9uQSxh4As!`@%J_cutsi(ce~a^trq-;XeZd4~ zfho5afLc8zsS;JH6m4UdV@^As7T?Fz(Ei@`hvPX{OM!yg0zX;d9SPv!Bt`h}j4Nin z2o)a*T~9(${jb6cEsscA!8Qn>2pqdyhZAL&4F{uIuJBsJR@&UfRxX6oQ(W{@9ga?- z$qp{22BdX-Ze@o)3a?A?#{VO`*d(vAO@5I1m+Hb4bpAgDqnP=~`@VuZ1AJ8pTb2gY#za_wT<4T#yw5S8L9sY3&(L)SIJ?>=aj% zWdFSDRYAQ~b);C&;L78h`@gC=@3*GbH4UR|MMYtw0$V|_(u?#?M5H&RmzY>6O0QCa zAfnRTAP9sWKnPus-lK@LB!nUa2oQQGLg)|(WL9)vXJ%h>t}}Dyx8WZMYh|r`-}^oH z{Up&MarZ8fog}1+^bV>tw`7A=z31zU$K8Pad%DzUNk;f5h+C22(j+L0)&@ybfSlE@ zm$4?fbZSE)#KpIWvXY!>!AOk5JGsR)ZAU(iyU~GSsyUv&knG)` zeJ>9oj9_a3##i^vK`=8(I`B-~DA>k?Kkk#`TQ@zH8SgxxY+yfR^y|*C0l4pxTCj7y zW5!~m|C$!&A!AvYPTS?|pZAsRvU`YL%V4Okc008vla26`#i=KVFXHmg)2Hot0D!Jl z{%EtA=#61Lb8#*Cq;)uCi(}pm*vl|52m=GZSOjpd2{8+nillayxz+APCZH(?SfB6A zr_twrdLG07uPSK%n(2j~lL8xLa@4+F_1rTp^*LGLe9Q4!)SJ-bYgXrFUHb#hZS;R# zG=phV4qAFE^B5jMF?JKugQJ6ce?*yOdijKmmLQY!A>u7ZcojuI@h1mCF25rXgSexXfI?iMg*C)SKD>P;y0OyS>V1 zyBkL4doDmT&A87My>xLFt-~?Lo=gifUVtGKV5T?fz`MdzsxHbjTuae!In%=Tfp2-s zZ2q<>kjmTvjyEOM0G@1N*p|?k9&qB8&DjiIt&TKy!Ha<>=Xs$6i*;Mc${9*Wsf+9vY7Yar`PC@|fC5faM46m#e$$^F)T6jU^&Y}3rd5rMcq^c8$_wCdm#IxN;eG55OcpjMs zscQIKeL9-fJV?4TvI#si4%fCLqNw34IV~5cRrZNyS(*;F_Uo#7d)RlP7X=*6C5Fv` z$!LsV|LwdEX|BK6c(=W|@9xtL*X;DYTK$Z^Ed1ittcs$hZ|v6&JgFk!ufhPZBn-Zy za?$8lh#5Fzp%2p%f$p6NYB-T@ij~FdfeBPJxrHKU2v*r#<72i#h?PcC)PQ-== zt`P{JXNCorjg7ds{_rk0*KA+t{ZVLrDmfbcsy@cR$Q^(oA1$&D-1kiymv}vuc$$#v z?R4lcNRdz4^2C3Kmck1fCXDY%F-bS7G>JZx**-^Tj3Jbtp%e#|3N6_;Kpgx&Qjfp4 zfYra`!i=zC<`yi&JEhspT75xAwquZy4aGZMFJkiJLsE@u&=CVe>D{C_yi3|5 zlB-(Yd-uGN4IpSJ)9HHy+6i5aJ&zm(Mgu-+N8P;c#vn`~Ju9LzLYZCNB(vurph>2n zUT^jh9axQo+T64x(01^Q!$n_1%*=D?gdvUX*plD3#888hOX+N5(${NMh6ghWl)o*9 zy3cP~8m~Ga{0A&c`=(1OT;Jnu$6aHGbH@4b?&_k}w!95s57j)ZX{0Dfc8cM{uo)KK z5^NUz7|YBfoLX^}vo38a)li3jB_Xl3d>_6IySlWUs9Jhyktwy*L$v__}XQwYI?jV)0xyo7ri*=`@s(o|wAn{shZKoTYPrSl{?B-}d@x>x__ zJ5_&rjFbSX27aVZq`C^tsa%=hRT{9c&E$hCDPHWmYxWrfnga|-aR!~j-2nDinbHgP z=HHDir)qaUY?^kU)Ru^%f0h&%=WvTSp5C;5*=yI^J=8q>1(QygBP-;27enuhXe1)g zAB~IJgM*VkQM(`<$vfiHJ9pkJi#~@a@rUH`dCmBb9Y20Hc6y*xPTlAQ@H5|a8R>Nx zp0eb#n7ZAoiZ=bcPTmYs74ZO1DK0Q6&4Qx2T$bYE)l(uz>WtkfW-##DTe5z0nIv3; zXCK~HPEfJ{q_!O1)7Fkpt^()Bx#!Q-hSM1+M%P~qRJ6^Jia4!~`qgqCIFJrSq_3+- ziZNY~9b6twEo(ik(-hyB5uRXtZ?>Hs7kxnj9UDE?pFXqX%1ZVsm_I-RF;WH|4X$Y{ zRae>k^qc6kEd6~ID1G($#x2F!=z2%wYyb#Mfh7GE9SLbv_7~us0@&jD#;nFD`Y_-( zm|lg_YDkG#7YMt~%#CZL7AsqYhP?`=#|bazzlj`-|O>sf;E zW+P;;KHt4uxl zw&z^j)pW0b?UHSWOPmOz4nl~X%;JzZsmVzgm#EW_gyZ8yC;c))9-t7;*HF1bsO!Q3 zBky4p>}(7Kj#A!89%wv3@58S8!_Wx4poq_yZqJmVbmZJaV5_C7e@sj=IeA6dIZW6` zQmR5}N?+e$y+=Uzr{2JwF{CDKnN04v`OeVAjp$;?UiGA&s#)9>0Dei;{ZnFk1MTK^ z+ch@77jrxKx=>HNL9|0mjDz2YMqqc7pJs!4I}vUuSqJe>r6NZb?}>j}huhOysFTTD zl`y`h8D=pMxf}Lc(UW_?$)L;SiM<+#YZ(3Tq5ltP3OT~Ax@OZqU2|~BoUcP#Ez0p! zSSGL{cZdB|VNrFJ{iFZ2O>L$51-@fnl>8nVqKphbWCi_bU!KqL?p*j@z3XdbaC-re zAsq8me#sESF?x69asBNraP+qP6J<}~PBsrh1`4aKNG9uX!K6<0Vtjg)8jM3mcKDW} zK9KUX^UZQcLD2O&DW$QgNHI`yfy$cvdR4#bXlC?`!=mD;8J|()mWUFfj++Dily;Of zL(!(HW~7LS4l=a((D87|v1G*-HPcl}BFyYr6f<Zift5i{HZ>ihWU!r@9{2EsOd? z@=U2dz++l=5y-nHM2@X&Iy5z$VTd}Z?6H<{2wcYJx`aY6Rgr@FCAo7-r6xZ;KZat4 zqwwrkigr5-Y*WCS1+0ayued8b?(^852cnDPhuU}6q<$8FFx)!(o0x_tw|D$cXQPAR z-xK`)A?W>oGcD-%#2%vj&qOHyIfLzVQ0X1GKi+iEo8jq% za;nR4z!8QVfPFev=xUA;ws+|n)CdPNBuf6(d6IIiqR@2oR0rD`o7xA@(LC^SxKcdh zM-ama^$FuY{)>c>+G8szQ7WFL19x0ns&q}<9x6ugJJt8q&ddfu()Kq_1AYeZ<$tPq za_xL=hdR83xfe_qKY-SUEAE2fO;u`&t`|%QO?Gx;NToe?u(s^5toU4d3%O{Z5R!eb zC@>LT$8j*)VmwFpz#bg?XOc#c=-j{6r6O?bzpE4~rRPv9Lk=|oS>3T;uaqJ@ES-Uw zWc(e7l;_c3#gYGd1n?`~q^Z8!{^?h^&ptb4@yxCPqNpR~086tN24G3Z<{=j6z#+>^ zc!=4asl|*wdJ{NO^8DiI#z$S)w_>y10~-RO7sZFX z|A8Jh`HnLq-%INdDkvMo)oRs=z+|&idBJ2c()-X1R&1dev-CMG5EmOzVVD&S&Oggl zw<}9w^6kk_%9Ba4Gpm*C1id<$5K4DWBflY}mQL&7=TGmpi>whK2cKCL&lI{({YpRd zXJxxDTKLtK3ln6VazuovkKcbUFh02D0kN}D3!ugI+ucY=Rtt-{bU4hRQ0419X`gO6F? zQ|*U0u;lnqfNLQ&^l2aRZ03NV<>>W;I?Q3Gk0_y!JhQP6wj#n&xfTUJp-G^3d%kuj zHG*-RO)3lmgWePClj?h&)y)$`?m%6r8%jO+9=hF|dYd)`9zHxX7Fo~^B)g2PYjel) znn=jmS)M$QpCPU2Q06!j7k)wEQp3}g=ek7Hcbd1|zJ<2|Y7^YF&sFbwG?AVJ2q#2` zX3Tvp@YeHC5*)0b@fEyu&&0>t+0g8|3PAbro(MCHnWdczSkw}WNHC>5EL<&(>vuC5 zTjsU`$|LdD3;KF}yR&}^AoYl!MKD{kCA$3E?FA$KpjCQ}%TmaukB*zrCy!mG@+;Vh zQE4EuR4BhFVZ@X(bzR1mV+7QhH?C$_gX$R@dcC^6y8}MyX0%>dbD_cQ?{A(?)?sM35VG2hWlH%g5h4P;LQFy%L8tecPIVjj`?ce(r`@76 zol(Ncw!0APMS$vo-7F~vs?0jBpRFD8UgG4A(HI8nuhE!2TA<;u zxo%||!}1+eNUmqk4`W~HlYtSDC;!}K`f?zV`YTr{ni!zCt;&W5zaYM?2gfe+!J)x1 zsGPCjxnI#rFHjqkG-B@lGg&dI>u{TqA#nA%=*OrN9+$getuf8BaGZydyYo?7)7%N7 zH{-|g2~_SE*n>6i64@C9Ab%514sVdBC%!&kTp!1&ADDeS+;l)j z;JpHp|475Et{VmQOercz7(EfGpBe*!<*pxj0^dQKBJqY?_@ zcx#lmP})Fkjn<<cHswg)`D|{zqIe?`vD_9|?Dmx^fh7mPk*Kx(*&X z9Dfx!5uq4bPr+`^QsT^zWL)kJE_OeJIsEt&3hiU7&>k%47)qGoZsWhzPviHqpJw8% znOt4h^=v5e+PZ7_ji3lV+D&Y+<#q4+gm2H^^7xRdt;lI{j@ZORuNDw9^Lk3R)%SPN z#8?2ubFly50M704CV13*AiXs#1CHpi5(dsCiiS2%1Kf^ zt+M?)ncA>s+xUfjshES*a_yV%N!#}HZwjcO`K${Zs6us97-r6{rWCf0QZ{&JN%B!a zfPDDMu!dQ1KCIcVZ?4wxd4KnC%@cm&jT}Yf;r%anrP3EaK4lJmW27NwJIo1Qp)W5A z;uK{!u^&7947U`n|0V`>R4xC=sHEX>oe9NXO(53E*}$1H4x2Wi9x5_t$C^#wEn4}W?y<+Q?5L}{M;Xk(m6wc zZGfh+ucL6FC8Y@Cc&?0#DxS?SXTd|SbnB_&vTmb5xTtItd{yOydn}*|k)*SvsDY6F zVy+sTs=L)?1f;*pO!dh6$Y?hw5h-7{kx!Jq;vR-`N^FCU$}GH7JQ(;v4_Z!~zbS~6 zi!q2!f7~C}J@-pZ&-q)7=6G44$&tf0Hg0^wZ-Pn z*=D9AVz1pNJlD0{1SXeIqvk~%TYI=*Ay*)T$vgN*2=nOJ?TXpCce|L^nNEeTYbl_e?j&DmjP!3gWOt71F>>^wq}|1D#+hNijYisowI1Iq zpH4Oix|GYAV7YRoeP&Px4i7x|))lZ5w9s%EH6v9zE%{-TF@1jHfCmEw9_fT-s39TM zH)D3aDSk>By$tI?Iu>a)RV*?xG3Z77A1ZNN`2JprqhVVec;KkJ$|U}5rdK!Y&6f*s zJI#rMv6Ce|e84d!_=U~R)>Br8caL!ntqjj>D@`goh;ohc z5~CzUfA!x2z0>LRcKFeuzu>9d6rq|OqP9latWEC%8ZrOVWbvBV-s&ptOcb}NV>0Nt zl%$W{mk`GniPrF zmikIEI)k^3X59FU#s$oFertjUvm5h0ZQQT812x^&iWZhTF%)RP`@4o-@>neif00wP z-;++g;4x8M2>ZNkFAV>*g}2izal~x~1K{Q?v+47jEt4^LB;Q0_a_X2)4^sZQBd_Z! zT#}}Q`e;j|q6&`Xx8pqhUCmtajsQl6% z${Ll2zJU;o)@!89syZPmbI4zQ5cP(0X@{7~;1FV1wbGYKjL%%dbTlm)*eX6;=*ATj z^)li~!{r3#VDj;3euntlfCPs(Qtgw%qulj3#5qyHYpj0jD9Yuug%B}zd*MHHD*2T;|g888bT|*`xQuOer8^A%j9lk62n literal 1 Icmd-A000XB3jhEB diff --git a/2024/day04/image/task 11.png b/2024/day04/image/task 11.png new file mode 100644 index 0000000000000000000000000000000000000000..d4402482e1074c8b15ab6eb3ebf72a1786ac802f GIT binary patch literal 16899 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 literal 0 HcmV?d00001 diff --git a/2024/day04/image/task 3.png b/2024/day04/image/task 3.png new file mode 100644 index 0000000000000000000000000000000000000000..5baeb479a04d62039414f4821f86646cfd6319b4 GIT binary patch literal 11716 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 literal 0 HcmV?d00001 diff --git a/2024/day04/image/task 4.png b/2024/day04/image/task 4.png new file mode 100644 index 0000000000000000000000000000000000000000..ea366a253a2a9cf3c8bac984e284b6d75789864a GIT binary patch literal 32981 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 LPOL;k&*%RGNgvKf literal 0 HcmV?d00001 diff --git a/2024/day04/image/task 5.png b/2024/day04/image/task 5.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab2dc3eef7d39edb2a75fda91f109863e03e898 GIT binary patch literal 24098 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 U4ArX~M&D=^WK{2$Ntp!v17BIO1poj5 literal 0 HcmV?d00001 From 460c78bab7f6d2cc96157dc224691859d989b8e3 Mon Sep 17 00:00:00 2001 From: Bhavin Savaliya <41487075+Bhavin213@users.noreply.github.com> Date: Tue, 2 Jul 2024 15:33:41 +0530 Subject: [PATCH 194/394] Day 4 Solution --- 2024/day04/solution.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 2024/day04/solution.md diff --git a/2024/day04/solution.md b/2024/day04/solution.md new file mode 100644 index 0000000000..c0d5566096 --- /dev/null +++ b/2024/day04/solution.md @@ -0,0 +1,27 @@ + +# Day 4 Answers: Basic Linux Shell Scripting for DevOps Engineers + +Task 1: Explain in your own words and with examples what Shell Scripting means for DevOps. +'Shell Scripting is writing a series of commands in a script file to automate tasks in the Unix/Linux shell. For DevOps, shell scripting is crucial for automating repetitive tasks, managing system configurations, deploying applications, and integrating various tools and processes in a CI/CD pipeline. It enhances efficiency, reduces errors, and saves time.' + +Example: Automating server setup +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day04/image/task%201.png) + +Task 2: What is `#!/bin/bash`? Can we write `#!/bin/sh` as well? +- `#!/bin/bash` is called a "shebang" line. It indicates that the script should be run using the Bash shell. + - `#!/bin/bash`: Uses Bash as the interpreter. It supports advanced features like arrays, associative arrays, and functions. + - `#!/bin/sh`: Uses the Bourne shell. It’s more POSIX-compliant and is generally compatible with different Unix shells. + +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day04/image/task%202.png) + +Task 3: Write a Shell Script that prints "I will complete #90DaysOfDevOps challenge." + +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day04/image/task%203.png) + +Task 4: Write a Shell Script that takes user input, input from arguments, and prints the variables. + +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day04/image/task%204.png) + +Task 5: Provide an example of an If-Else statement in Shell Scripting by comparing two numbers. + +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day04/image/task%205.png) From 8b8ad97a5e20056d366c605b9fc4fddbf80bc8d3 Mon Sep 17 00:00:00 2001 From: Bhavin Savaliya <41487075+Bhavin213@users.noreply.github.com> Date: Tue, 2 Jul 2024 15:37:11 +0530 Subject: [PATCH 195/394] solution.md --- 2024/day04/solution.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/2024/day04/solution.md b/2024/day04/solution.md index c0d5566096..cec443973b 100644 --- a/2024/day04/solution.md +++ b/2024/day04/solution.md @@ -2,10 +2,11 @@ # Day 4 Answers: Basic Linux Shell Scripting for DevOps Engineers Task 1: Explain in your own words and with examples what Shell Scripting means for DevOps. -'Shell Scripting is writing a series of commands in a script file to automate tasks in the Unix/Linux shell. For DevOps, shell scripting is crucial for automating repetitive tasks, managing system configurations, deploying applications, and integrating various tools and processes in a CI/CD pipeline. It enhances efficiency, reduces errors, and saves time.' +- 'Shell Scripting is writing a series of commands in a script file to automate tasks in the Unix/Linux shell. For DevOps, shell scripting is crucial for automating repetitive tasks, managing system configurations, deploying applications, and integrating various tools and processes in a CI/CD pipeline. It enhances efficiency, reduces errors, and saves time.' Example: Automating server setup ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day04/image/task%201.png) +![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day04/image/task%2011.png) Task 2: What is `#!/bin/bash`? Can we write `#!/bin/sh` as well? - `#!/bin/bash` is called a "shebang" line. It indicates that the script should be run using the Bash shell. From bc775ca5b1d0428eb6b0b4762b948eecb202b759 Mon Sep 17 00:00:00 2001 From: Bhavin Savaliya <41487075+Bhavin213@users.noreply.github.com> Date: Tue, 2 Jul 2024 15:39:58 +0530 Subject: [PATCH 196/394] solution.md --- 2024/day04/solution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2024/day04/solution.md b/2024/day04/solution.md index cec443973b..b9020734eb 100644 --- a/2024/day04/solution.md +++ b/2024/day04/solution.md @@ -15,7 +15,7 @@ Task 2: What is `#!/bin/bash`? Can we write `#!/bin/sh` as well? ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day04/image/task%202.png) -Task 3: Write a Shell Script that prints "I will complete #90DaysOfDevOps challenge." +Task 3: Write a Shell Script that prints `I will complete #90DaysOfDevOps challenge`. ![image](https://github.com/Bhavin213/90DaysOfDevOps/blob/master/2024/day04/image/task%203.png) From d6cbb32d54c53bf309525e26987199b84e8b7cec Mon Sep 17 00:00:00 2001 From: Shubham Londhe Date: Wed, 3 Jul 2024 11:32:15 +0530 Subject: [PATCH 197/394] Create README.md --- 2024/day05/README.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 2024/day05/README.md diff --git a/2024/day05/README.md b/2024/day05/README.md new file mode 100644 index 0000000000..471ab91986 --- /dev/null +++ b/2024/day05/README.md @@ -0,0 +1,40 @@ +# Day 5 Task: Advanced Linux Shell Scripting for DevOps Engineers with User Management + +If you noticed that there are a total of 90 sub-directories in the directory '2023' of this repository, what did you think? How did I create 90 directories? Manually one by one, using a script, or a command? + +All 90 directories were created within seconds using a simple command: + +`mkdir day{1..90}` + +### Tasks + +1. **Create Directories Using Shell Script:** + - Write a bash script `createDirectories.sh` that, when executed with three arguments (directory name, start number of directories, and end number of directories), creates a specified number of directories with a dynamic directory name. + - Example 1: When executed as `./createDirectories.sh day 1 90`, it creates 90 directories as `day1 day2 day3 ... day90`. + - Example 2: When executed as `./createDirectories.sh Movie 20 50`, it creates 31 directories as `Movie20 Movie21 Movie22 ... Movie50`. + + Notes: You may need to use loops or commands (or both), based on your preference. [Check out this reference: Bash Scripting For Loop](https://www.geeksforgeeks.org/bash-scripting-for-loop/) + +2. **Create a Script to Backup All Your Work:** + - Backups are an important part of a DevOps Engineer's day-to-day activities. The video in the references will help you understand how a DevOps Engineer takes backups (it can feel a bit difficult but keep trying, nothing is impossible). + - Watch [this video](https://youtu.be/aolKiws4Joc) for guidance. + + In case of doubts, post them in the [Discord Channel for #90DaysOfDevOps](https://discord.gg/hs3Pmc5F). + +3. **Read About Cron and Crontab to Automate the Backup Script:** + - Cron is the system's main scheduler for running jobs or tasks unattended. A command called crontab allows the user to submit, edit, or delete entries to cron. A crontab file is a user file that holds the scheduling information. + - Watch this video for reference: [Cron and Crontab](https://youtu.be/aolKiws4Joc). + +4. **Read About User Management:** + - A user is an entity in a Linux operating system that can manipulate files and perform several other operations. Each user is assigned an ID that is unique within the system. IDs 0 to 999 are assigned to system users, and local user IDs start from 1000 onwards. + - Create 2 users and display their usernames. + - [Check out this reference: User Management in Linux](https://www.geeksforgeeks.org/user-management-in-linux/). + +5. **Post Your Progress:** + - Post your daily work on LinkedIn and let me know how it went! Writing an article about your experience is highly encouraged. + +**Were the tasks challenging?** + +These tasks are designed to push your skills and introduce you to advanced concepts in Linux shell scripting and user management. Share your experience and solutions on LinkedIn and let me know how it went! + +[← Previous Day](../day04/README.md) | [Next Day →](../day06/README.md) From 3723e9ee5e740117b660b8a5986fa97fc6c3e3a3 Mon Sep 17 00:00:00 2001 From: Bhavin Savaliya <41487075+Bhavin213@users.noreply.github.com> Date: Wed, 3 Jul 2024 15:22:06 +0530 Subject: [PATCH 198/394] solution added --- 2024/day05/image/task 1.png | 1 + 1 file changed, 1 insertion(+) create mode 100644 2024/day05/image/task 1.png diff --git a/2024/day05/image/task 1.png b/2024/day05/image/task 1.png new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/2024/day05/image/task 1.png @@ -0,0 +1 @@ + From f0beb518a98d2d09d2e24460f10995a92f3a5205 Mon Sep 17 00:00:00 2001 From: Bhavin Savaliya <41487075+Bhavin213@users.noreply.github.com> Date: Wed, 3 Jul 2024 15:22:38 +0530 Subject: [PATCH 199/394] solution added --- 2024/day05/image/task 1-2.png | Bin 0 -> 38569 bytes 2024/day05/image/task 1-3.png | Bin 0 -> 43690 bytes 2024/day05/image/task 1.png | Bin 1 -> 13543 bytes 2024/day05/image/task 2-1.png | Bin 0 -> 61140 bytes 2024/day05/image/task 2.png | Bin 0 -> 78865 bytes 2024/day05/image/task 3-1.png | Bin 0 -> 12035 bytes 2024/day05/image/task 3.png | Bin 0 -> 21230 bytes 2024/day05/image/task 4.png | Bin 0 -> 23262 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 2024/day05/image/task 1-2.png create mode 100644 2024/day05/image/task 1-3.png create mode 100644 2024/day05/image/task 2-1.png create mode 100644 2024/day05/image/task 2.png create mode 100644 2024/day05/image/task 3-1.png create mode 100644 2024/day05/image/task 3.png create mode 100644 2024/day05/image/task 4.png diff --git a/2024/day05/image/task 1-2.png b/2024/day05/image/task 1-2.png new file mode 100644 index 0000000000000000000000000000000000000000..66d467cf1d91b1b417d3290e82306e2dcb405246 GIT binary patch literal 38569 zcmdqIcTm$^*DegAVg-8x1VuoKpduhGQBkUZbm>Ty8tGC(P*f~P?*W3+Yv`c_f;UR< z5CQ~$r~g zLt`#3o^CF#ecXo*a-O98liJHExc!Z_9&l9-3KBRs``zyA-{<10jyt;h>;UKf@C$8A ze=aV*j=g{GE>N*E7gs7k=iz@K0edgf8wV?)e}*^^#k*dh@TPMYx@&^df(me)#>T* zD*pYIqhsCLGe<)rk?EKD?>+TLCrXo?PpF+APEtyB)|>DjEHQCTD8E{^Q^bw{zOa