├── Project 25 └── readme.md ├── Project 1 ├── images │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png └── readme.md ├── Project 10 ├── images │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ ├── 9.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ └── 20.png └── readme.md ├── Project 11 ├── images │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ ├── 9.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── 20.png │ ├── 21.png │ ├── 22.png │ ├── 23.png │ ├── 24.png │ ├── 25.png │ ├── 26.png │ ├── 27.png │ ├── 28.png │ ├── 29.png │ ├── 30.png │ ├── 31.png │ ├── 32.png │ ├── 33.png │ └── 34.png └── readme.md ├── Project 12 └── images │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ ├── 9.png │ ├── a.png │ ├── b.png │ ├── c.png │ ├── d.png │ ├── e.png │ ├── f.png │ ├── g.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── 20.png │ ├── 21.png │ ├── 22.png │ ├── 23.png │ ├── 24.png │ ├── 25.png │ ├── 26.png │ ├── 27.png │ ├── 28.png │ ├── 29.png │ └── 30.png ├── Project 13 ├── images │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ └── 8.png └── readme.md ├── Project 14 └── images │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ ├── 9.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── 20.png │ ├── 21.png │ ├── 22.png │ ├── 23.png │ ├── 24.png │ ├── 25.png │ ├── 26.png │ ├── 27.png │ ├── 28.png │ ├── 29.png │ ├── 30.png │ ├── 31.png │ ├── 32.png │ ├── 33.png │ ├── 34.png │ ├── 35.png │ ├── 36.png │ ├── 37.png │ ├── 38.png │ ├── 40.png │ ├── 41.png │ ├── 42.png │ ├── 43.png │ ├── 44.png │ ├── 45.png │ ├── 46.png │ ├── 47.png │ ├── 48.png │ └── 49.png ├── Project 15 ├── images │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ ├── 9.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── 20.png │ ├── 21.png │ ├── 22.png │ └── 23.png └── installations.md ├── Project 16 └── images │ ├── 0.png │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ └── 8.png ├── Project 17 └── images │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ ├── 9.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ └── 16.png ├── Project 18 └── images │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ └── 7.png ├── Project 19 ├── images │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png └── readme.md ├── Project 2 ├── images │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ ├── 9.png │ └── Screenshot 2022-09-02 at 8.16.44 PM.png └── readme.md ├── Project 20 └── images │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ ├── 9.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── 20.png │ ├── 21.png │ ├── 22.png │ ├── 23.png │ ├── 24.png │ └── 25.png ├── Project 21 └── images │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ ├── 9.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── k8s_network.png │ └── k8s_network (1).png ├── Project 22 └── images │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ ├── 9.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── 20.png │ ├── 21.png │ ├── 22_i.png │ ├── OMOR.png │ └── k8s_workloads.png ├── Project 23 └── images │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ ├── 9.png │ ├── 231.png │ ├── 232.png │ ├── 233.png │ ├── 234.png │ └── volumeID.png ├── Project 3 └── images │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 18.png │ ├── 19.png │ ├── 2.png │ ├── 20.png │ ├── 21.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png ├── Project 4 ├── images │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png └── readme.md ├── Project 5 ├── images │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png └── readme.md ├── Project 6 ├── images │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── 2.png │ ├── 20.png │ ├── 21.png │ ├── 22.png │ ├── 23.png │ ├── 24.png │ ├── 25.png │ ├── 26.png │ ├── 27.png │ ├── 28.png │ ├── 29.png │ ├── 3.png │ ├── 30.png │ ├── 31.png │ ├── 32.png │ ├── 33.png │ ├── 34.png │ ├── 35.png │ ├── 36.png │ ├── 37.png │ ├── 38.png │ ├── 39.png │ ├── 4.png │ ├── 40.png │ ├── 41.png │ ├── 42.png │ ├── 43.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png └── readme.md ├── Project 7 ├── images │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── 2.png │ ├── 20.png │ ├── 21.png │ ├── 22.png │ ├── 23.png │ ├── 28.png │ ├── 29.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png └── readme.md ├── Project 8 ├── images │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png └── readme.md ├── Project 9 ├── images │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ ├── 9.png │ └── Screenshot 2022-10-10 at 5.46.14 AM.png └── readme.md ├── misc └── tasks-17.md ├── README.md └── Project 24 └── readme.md /Project 25/readme.md: -------------------------------------------------------------------------------- 1 | # PROJECT 25 - DEPLOYING AND PACKAGING APPLICATIONS INTO KUBERNETES -------------------------------------------------------------------------------- /Project 1/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 1/images/1.png -------------------------------------------------------------------------------- /Project 1/images/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 1/images/10.png -------------------------------------------------------------------------------- /Project 1/images/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 1/images/11.png -------------------------------------------------------------------------------- /Project 1/images/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 1/images/12.png -------------------------------------------------------------------------------- /Project 1/images/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 1/images/13.png -------------------------------------------------------------------------------- /Project 1/images/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 1/images/14.png -------------------------------------------------------------------------------- /Project 1/images/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 1/images/15.png -------------------------------------------------------------------------------- /Project 1/images/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 1/images/16.png -------------------------------------------------------------------------------- /Project 1/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 1/images/2.png -------------------------------------------------------------------------------- /Project 1/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 1/images/3.png -------------------------------------------------------------------------------- /Project 1/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 1/images/4.png -------------------------------------------------------------------------------- /Project 1/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 1/images/5.png -------------------------------------------------------------------------------- /Project 1/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 1/images/6.png -------------------------------------------------------------------------------- /Project 1/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 1/images/7.png -------------------------------------------------------------------------------- /Project 1/images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 1/images/8.png -------------------------------------------------------------------------------- /Project 1/images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 1/images/9.png -------------------------------------------------------------------------------- /Project 10/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 10/images/1.png -------------------------------------------------------------------------------- /Project 10/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 10/images/2.png -------------------------------------------------------------------------------- /Project 10/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 10/images/3.png -------------------------------------------------------------------------------- /Project 10/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 10/images/4.png -------------------------------------------------------------------------------- /Project 10/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 10/images/5.png -------------------------------------------------------------------------------- /Project 10/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 10/images/6.png -------------------------------------------------------------------------------- /Project 10/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 10/images/7.png -------------------------------------------------------------------------------- /Project 10/images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 10/images/8.png -------------------------------------------------------------------------------- /Project 10/images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 10/images/9.png -------------------------------------------------------------------------------- /Project 11/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/1.png -------------------------------------------------------------------------------- /Project 11/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/2.png -------------------------------------------------------------------------------- /Project 11/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/3.png -------------------------------------------------------------------------------- /Project 11/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/4.png -------------------------------------------------------------------------------- /Project 11/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/5.png -------------------------------------------------------------------------------- /Project 11/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/6.png -------------------------------------------------------------------------------- /Project 11/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/7.png -------------------------------------------------------------------------------- /Project 11/images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/8.png -------------------------------------------------------------------------------- /Project 11/images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/9.png -------------------------------------------------------------------------------- /Project 12/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/1.png -------------------------------------------------------------------------------- /Project 12/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/2.png -------------------------------------------------------------------------------- /Project 12/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/3.png -------------------------------------------------------------------------------- /Project 12/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/4.png -------------------------------------------------------------------------------- /Project 12/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/5.png -------------------------------------------------------------------------------- /Project 12/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/6.png -------------------------------------------------------------------------------- /Project 12/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/7.png -------------------------------------------------------------------------------- /Project 12/images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/8.png -------------------------------------------------------------------------------- /Project 12/images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/9.png -------------------------------------------------------------------------------- /Project 12/images/a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/a.png -------------------------------------------------------------------------------- /Project 12/images/b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/b.png -------------------------------------------------------------------------------- /Project 12/images/c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/c.png -------------------------------------------------------------------------------- /Project 12/images/d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/d.png -------------------------------------------------------------------------------- /Project 12/images/e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/e.png -------------------------------------------------------------------------------- /Project 12/images/f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/f.png -------------------------------------------------------------------------------- /Project 12/images/g.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/g.png -------------------------------------------------------------------------------- /Project 13/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 13/images/1.png -------------------------------------------------------------------------------- /Project 13/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 13/images/2.png -------------------------------------------------------------------------------- /Project 13/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 13/images/3.png -------------------------------------------------------------------------------- /Project 13/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 13/images/4.png -------------------------------------------------------------------------------- /Project 13/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 13/images/5.png -------------------------------------------------------------------------------- /Project 13/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 13/images/6.png -------------------------------------------------------------------------------- /Project 13/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 13/images/7.png -------------------------------------------------------------------------------- /Project 13/images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 13/images/8.png -------------------------------------------------------------------------------- /Project 14/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/1.png -------------------------------------------------------------------------------- /Project 14/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/2.png -------------------------------------------------------------------------------- /Project 14/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/3.png -------------------------------------------------------------------------------- /Project 14/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/4.png -------------------------------------------------------------------------------- /Project 14/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/5.png -------------------------------------------------------------------------------- /Project 14/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/6.png -------------------------------------------------------------------------------- /Project 14/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/7.png -------------------------------------------------------------------------------- /Project 14/images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/8.png -------------------------------------------------------------------------------- /Project 14/images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/9.png -------------------------------------------------------------------------------- /Project 15/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 15/images/1.png -------------------------------------------------------------------------------- /Project 15/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 15/images/2.png -------------------------------------------------------------------------------- /Project 15/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 15/images/3.png -------------------------------------------------------------------------------- /Project 15/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 15/images/4.png -------------------------------------------------------------------------------- /Project 15/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 15/images/5.png -------------------------------------------------------------------------------- /Project 15/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 15/images/6.png -------------------------------------------------------------------------------- /Project 15/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 15/images/7.png -------------------------------------------------------------------------------- /Project 15/images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 15/images/8.png -------------------------------------------------------------------------------- /Project 15/images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 15/images/9.png -------------------------------------------------------------------------------- /Project 16/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 16/images/0.png -------------------------------------------------------------------------------- /Project 16/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 16/images/1.png -------------------------------------------------------------------------------- /Project 16/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 16/images/2.png -------------------------------------------------------------------------------- /Project 16/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 16/images/3.png -------------------------------------------------------------------------------- /Project 16/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 16/images/4.png -------------------------------------------------------------------------------- /Project 16/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 16/images/5.png -------------------------------------------------------------------------------- /Project 16/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 16/images/6.png -------------------------------------------------------------------------------- /Project 16/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 16/images/7.png -------------------------------------------------------------------------------- /Project 16/images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 16/images/8.png -------------------------------------------------------------------------------- /Project 17/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 17/images/1.png -------------------------------------------------------------------------------- /Project 17/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 17/images/2.png -------------------------------------------------------------------------------- /Project 17/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 17/images/3.png -------------------------------------------------------------------------------- /Project 17/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 17/images/4.png -------------------------------------------------------------------------------- /Project 17/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 17/images/5.png -------------------------------------------------------------------------------- /Project 17/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 17/images/6.png -------------------------------------------------------------------------------- /Project 17/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 17/images/7.png -------------------------------------------------------------------------------- /Project 17/images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 17/images/8.png -------------------------------------------------------------------------------- /Project 17/images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 17/images/9.png -------------------------------------------------------------------------------- /Project 18/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 18/images/1.png -------------------------------------------------------------------------------- /Project 18/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 18/images/2.png -------------------------------------------------------------------------------- /Project 18/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 18/images/3.png -------------------------------------------------------------------------------- /Project 18/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 18/images/4.png -------------------------------------------------------------------------------- /Project 18/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 18/images/5.png -------------------------------------------------------------------------------- /Project 18/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 18/images/6.png -------------------------------------------------------------------------------- /Project 18/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 18/images/7.png -------------------------------------------------------------------------------- /Project 19/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 19/images/1.png -------------------------------------------------------------------------------- /Project 19/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 19/images/2.png -------------------------------------------------------------------------------- /Project 19/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 19/images/3.png -------------------------------------------------------------------------------- /Project 19/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 19/images/4.png -------------------------------------------------------------------------------- /Project 19/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 19/images/5.png -------------------------------------------------------------------------------- /Project 19/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 19/images/6.png -------------------------------------------------------------------------------- /Project 19/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 19/images/7.png -------------------------------------------------------------------------------- /Project 19/images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 19/images/8.png -------------------------------------------------------------------------------- /Project 19/images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 19/images/9.png -------------------------------------------------------------------------------- /Project 2/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 2/images/1.png -------------------------------------------------------------------------------- /Project 2/images/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 2/images/10.png -------------------------------------------------------------------------------- /Project 2/images/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 2/images/11.png -------------------------------------------------------------------------------- /Project 2/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 2/images/2.png -------------------------------------------------------------------------------- /Project 2/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 2/images/3.png -------------------------------------------------------------------------------- /Project 2/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 2/images/4.png -------------------------------------------------------------------------------- /Project 2/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 2/images/5.png -------------------------------------------------------------------------------- /Project 2/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 2/images/6.png -------------------------------------------------------------------------------- /Project 2/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 2/images/7.png -------------------------------------------------------------------------------- /Project 2/images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 2/images/8.png -------------------------------------------------------------------------------- /Project 2/images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 2/images/9.png -------------------------------------------------------------------------------- /Project 20/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 20/images/1.png -------------------------------------------------------------------------------- /Project 20/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 20/images/2.png -------------------------------------------------------------------------------- /Project 20/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 20/images/3.png -------------------------------------------------------------------------------- /Project 20/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 20/images/4.png -------------------------------------------------------------------------------- /Project 20/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 20/images/5.png -------------------------------------------------------------------------------- /Project 20/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 20/images/6.png -------------------------------------------------------------------------------- /Project 20/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 20/images/7.png -------------------------------------------------------------------------------- /Project 20/images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 20/images/8.png -------------------------------------------------------------------------------- /Project 20/images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 20/images/9.png -------------------------------------------------------------------------------- /Project 21/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 21/images/1.png -------------------------------------------------------------------------------- /Project 21/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 21/images/2.png -------------------------------------------------------------------------------- /Project 21/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 21/images/3.png -------------------------------------------------------------------------------- /Project 21/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 21/images/4.png -------------------------------------------------------------------------------- /Project 21/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 21/images/5.png -------------------------------------------------------------------------------- /Project 21/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 21/images/6.png -------------------------------------------------------------------------------- /Project 21/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 21/images/7.png -------------------------------------------------------------------------------- /Project 21/images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 21/images/8.png -------------------------------------------------------------------------------- /Project 21/images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 21/images/9.png -------------------------------------------------------------------------------- /Project 22/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 22/images/1.png -------------------------------------------------------------------------------- /Project 22/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 22/images/2.png -------------------------------------------------------------------------------- /Project 22/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 22/images/3.png -------------------------------------------------------------------------------- /Project 22/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 22/images/4.png -------------------------------------------------------------------------------- /Project 22/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 22/images/5.png -------------------------------------------------------------------------------- /Project 22/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 22/images/6.png -------------------------------------------------------------------------------- /Project 22/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 22/images/7.png -------------------------------------------------------------------------------- /Project 22/images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 22/images/8.png -------------------------------------------------------------------------------- /Project 22/images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 22/images/9.png -------------------------------------------------------------------------------- /Project 23/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 23/images/1.png -------------------------------------------------------------------------------- /Project 23/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 23/images/2.png -------------------------------------------------------------------------------- /Project 23/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 23/images/3.png -------------------------------------------------------------------------------- /Project 23/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 23/images/4.png -------------------------------------------------------------------------------- /Project 23/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 23/images/5.png -------------------------------------------------------------------------------- /Project 23/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 23/images/6.png -------------------------------------------------------------------------------- /Project 23/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 23/images/7.png -------------------------------------------------------------------------------- /Project 23/images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 23/images/8.png -------------------------------------------------------------------------------- /Project 23/images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 23/images/9.png -------------------------------------------------------------------------------- /Project 3/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 3/images/1.png -------------------------------------------------------------------------------- /Project 3/images/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 3/images/10.png -------------------------------------------------------------------------------- /Project 3/images/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 3/images/11.png -------------------------------------------------------------------------------- /Project 3/images/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 3/images/12.png -------------------------------------------------------------------------------- /Project 3/images/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 3/images/13.png -------------------------------------------------------------------------------- /Project 3/images/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 3/images/14.png -------------------------------------------------------------------------------- /Project 3/images/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 3/images/15.png -------------------------------------------------------------------------------- /Project 3/images/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 3/images/16.png -------------------------------------------------------------------------------- /Project 3/images/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 3/images/18.png -------------------------------------------------------------------------------- /Project 3/images/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 3/images/19.png -------------------------------------------------------------------------------- /Project 3/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 3/images/2.png -------------------------------------------------------------------------------- /Project 3/images/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 3/images/20.png -------------------------------------------------------------------------------- /Project 3/images/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 3/images/21.png -------------------------------------------------------------------------------- /Project 3/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 3/images/3.png -------------------------------------------------------------------------------- /Project 3/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 3/images/4.png -------------------------------------------------------------------------------- /Project 3/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 3/images/5.png -------------------------------------------------------------------------------- /Project 3/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 3/images/6.png -------------------------------------------------------------------------------- /Project 3/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 3/images/7.png -------------------------------------------------------------------------------- /Project 3/images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 3/images/8.png -------------------------------------------------------------------------------- /Project 3/images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 3/images/9.png -------------------------------------------------------------------------------- /Project 4/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 4/images/1.png -------------------------------------------------------------------------------- /Project 4/images/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 4/images/10.png -------------------------------------------------------------------------------- /Project 4/images/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 4/images/11.png -------------------------------------------------------------------------------- /Project 4/images/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 4/images/12.png -------------------------------------------------------------------------------- /Project 4/images/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 4/images/13.png -------------------------------------------------------------------------------- /Project 4/images/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 4/images/14.png -------------------------------------------------------------------------------- /Project 4/images/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 4/images/15.png -------------------------------------------------------------------------------- /Project 4/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 4/images/2.png -------------------------------------------------------------------------------- /Project 4/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 4/images/3.png -------------------------------------------------------------------------------- /Project 4/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 4/images/4.png -------------------------------------------------------------------------------- /Project 4/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 4/images/5.png -------------------------------------------------------------------------------- /Project 4/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 4/images/6.png -------------------------------------------------------------------------------- /Project 4/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 4/images/7.png -------------------------------------------------------------------------------- /Project 4/images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 4/images/8.png -------------------------------------------------------------------------------- /Project 4/images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 4/images/9.png -------------------------------------------------------------------------------- /Project 5/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 5/images/1.png -------------------------------------------------------------------------------- /Project 5/images/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 5/images/10.png -------------------------------------------------------------------------------- /Project 5/images/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 5/images/11.png -------------------------------------------------------------------------------- /Project 5/images/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 5/images/12.png -------------------------------------------------------------------------------- /Project 5/images/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 5/images/13.png -------------------------------------------------------------------------------- /Project 5/images/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 5/images/14.png -------------------------------------------------------------------------------- /Project 5/images/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 5/images/15.png -------------------------------------------------------------------------------- /Project 5/images/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 5/images/16.png -------------------------------------------------------------------------------- /Project 5/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 5/images/2.png -------------------------------------------------------------------------------- /Project 5/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 5/images/3.png -------------------------------------------------------------------------------- /Project 5/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 5/images/4.png -------------------------------------------------------------------------------- /Project 5/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 5/images/5.png -------------------------------------------------------------------------------- /Project 5/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 5/images/6.png -------------------------------------------------------------------------------- /Project 5/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 5/images/7.png -------------------------------------------------------------------------------- /Project 5/images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 5/images/8.png -------------------------------------------------------------------------------- /Project 5/images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 5/images/9.png -------------------------------------------------------------------------------- /Project 6/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/1.png -------------------------------------------------------------------------------- /Project 6/images/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/10.png -------------------------------------------------------------------------------- /Project 6/images/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/11.png -------------------------------------------------------------------------------- /Project 6/images/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/12.png -------------------------------------------------------------------------------- /Project 6/images/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/13.png -------------------------------------------------------------------------------- /Project 6/images/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/14.png -------------------------------------------------------------------------------- /Project 6/images/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/15.png -------------------------------------------------------------------------------- /Project 6/images/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/16.png -------------------------------------------------------------------------------- /Project 6/images/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/17.png -------------------------------------------------------------------------------- /Project 6/images/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/18.png -------------------------------------------------------------------------------- /Project 6/images/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/19.png -------------------------------------------------------------------------------- /Project 6/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/2.png -------------------------------------------------------------------------------- /Project 6/images/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/20.png -------------------------------------------------------------------------------- /Project 6/images/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/21.png -------------------------------------------------------------------------------- /Project 6/images/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/22.png -------------------------------------------------------------------------------- /Project 6/images/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/23.png -------------------------------------------------------------------------------- /Project 6/images/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/24.png -------------------------------------------------------------------------------- /Project 6/images/25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/25.png -------------------------------------------------------------------------------- /Project 6/images/26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/26.png -------------------------------------------------------------------------------- /Project 6/images/27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/27.png -------------------------------------------------------------------------------- /Project 6/images/28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/28.png -------------------------------------------------------------------------------- /Project 6/images/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/29.png -------------------------------------------------------------------------------- /Project 6/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/3.png -------------------------------------------------------------------------------- /Project 6/images/30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/30.png -------------------------------------------------------------------------------- /Project 6/images/31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/31.png -------------------------------------------------------------------------------- /Project 6/images/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/32.png -------------------------------------------------------------------------------- /Project 6/images/33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/33.png -------------------------------------------------------------------------------- /Project 6/images/34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/34.png -------------------------------------------------------------------------------- /Project 6/images/35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/35.png -------------------------------------------------------------------------------- /Project 6/images/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/36.png -------------------------------------------------------------------------------- /Project 6/images/37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/37.png -------------------------------------------------------------------------------- /Project 6/images/38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/38.png -------------------------------------------------------------------------------- /Project 6/images/39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/39.png -------------------------------------------------------------------------------- /Project 6/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/4.png -------------------------------------------------------------------------------- /Project 6/images/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/40.png -------------------------------------------------------------------------------- /Project 6/images/41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/41.png -------------------------------------------------------------------------------- /Project 6/images/42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/42.png -------------------------------------------------------------------------------- /Project 6/images/43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/43.png -------------------------------------------------------------------------------- /Project 6/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/5.png -------------------------------------------------------------------------------- /Project 6/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/6.png -------------------------------------------------------------------------------- /Project 6/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/7.png -------------------------------------------------------------------------------- /Project 6/images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/8.png -------------------------------------------------------------------------------- /Project 6/images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 6/images/9.png -------------------------------------------------------------------------------- /Project 7/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 7/images/1.png -------------------------------------------------------------------------------- /Project 7/images/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 7/images/10.png -------------------------------------------------------------------------------- /Project 7/images/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 7/images/11.png -------------------------------------------------------------------------------- /Project 7/images/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 7/images/12.png -------------------------------------------------------------------------------- /Project 7/images/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 7/images/13.png -------------------------------------------------------------------------------- /Project 7/images/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 7/images/14.png -------------------------------------------------------------------------------- /Project 7/images/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 7/images/15.png -------------------------------------------------------------------------------- /Project 7/images/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 7/images/17.png -------------------------------------------------------------------------------- /Project 7/images/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 7/images/18.png -------------------------------------------------------------------------------- /Project 7/images/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 7/images/19.png -------------------------------------------------------------------------------- /Project 7/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 7/images/2.png -------------------------------------------------------------------------------- /Project 7/images/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 7/images/20.png -------------------------------------------------------------------------------- /Project 7/images/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 7/images/21.png -------------------------------------------------------------------------------- /Project 7/images/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 7/images/22.png -------------------------------------------------------------------------------- /Project 7/images/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 7/images/23.png -------------------------------------------------------------------------------- /Project 7/images/28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 7/images/28.png -------------------------------------------------------------------------------- /Project 7/images/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 7/images/29.png -------------------------------------------------------------------------------- /Project 7/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 7/images/3.png -------------------------------------------------------------------------------- /Project 7/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 7/images/4.png -------------------------------------------------------------------------------- /Project 7/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 7/images/5.png -------------------------------------------------------------------------------- /Project 7/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 7/images/6.png -------------------------------------------------------------------------------- /Project 7/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 7/images/7.png -------------------------------------------------------------------------------- /Project 7/images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 7/images/8.png -------------------------------------------------------------------------------- /Project 7/images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 7/images/9.png -------------------------------------------------------------------------------- /Project 8/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 8/images/1.png -------------------------------------------------------------------------------- /Project 8/images/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 8/images/10.png -------------------------------------------------------------------------------- /Project 8/images/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 8/images/11.png -------------------------------------------------------------------------------- /Project 8/images/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 8/images/12.png -------------------------------------------------------------------------------- /Project 8/images/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 8/images/13.png -------------------------------------------------------------------------------- /Project 8/images/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 8/images/14.png -------------------------------------------------------------------------------- /Project 8/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 8/images/3.png -------------------------------------------------------------------------------- /Project 8/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 8/images/4.png -------------------------------------------------------------------------------- /Project 8/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 8/images/5.png -------------------------------------------------------------------------------- /Project 8/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 8/images/6.png -------------------------------------------------------------------------------- /Project 8/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 8/images/7.png -------------------------------------------------------------------------------- /Project 8/images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 8/images/8.png -------------------------------------------------------------------------------- /Project 8/images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 8/images/9.png -------------------------------------------------------------------------------- /Project 9/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 9/images/1.png -------------------------------------------------------------------------------- /Project 9/images/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 9/images/10.png -------------------------------------------------------------------------------- /Project 9/images/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 9/images/11.png -------------------------------------------------------------------------------- /Project 9/images/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 9/images/12.png -------------------------------------------------------------------------------- /Project 9/images/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 9/images/13.png -------------------------------------------------------------------------------- /Project 9/images/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 9/images/14.png -------------------------------------------------------------------------------- /Project 9/images/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 9/images/15.png -------------------------------------------------------------------------------- /Project 9/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 9/images/2.png -------------------------------------------------------------------------------- /Project 9/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 9/images/3.png -------------------------------------------------------------------------------- /Project 9/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 9/images/4.png -------------------------------------------------------------------------------- /Project 9/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 9/images/5.png -------------------------------------------------------------------------------- /Project 9/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 9/images/6.png -------------------------------------------------------------------------------- /Project 9/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 9/images/7.png -------------------------------------------------------------------------------- /Project 9/images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 9/images/8.png -------------------------------------------------------------------------------- /Project 9/images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 9/images/9.png -------------------------------------------------------------------------------- /Project 10/images/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 10/images/10.png -------------------------------------------------------------------------------- /Project 10/images/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 10/images/11.png -------------------------------------------------------------------------------- /Project 10/images/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 10/images/12.png -------------------------------------------------------------------------------- /Project 10/images/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 10/images/13.png -------------------------------------------------------------------------------- /Project 10/images/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 10/images/14.png -------------------------------------------------------------------------------- /Project 10/images/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 10/images/15.png -------------------------------------------------------------------------------- /Project 10/images/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 10/images/16.png -------------------------------------------------------------------------------- /Project 10/images/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 10/images/17.png -------------------------------------------------------------------------------- /Project 10/images/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 10/images/18.png -------------------------------------------------------------------------------- /Project 10/images/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 10/images/19.png -------------------------------------------------------------------------------- /Project 10/images/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 10/images/20.png -------------------------------------------------------------------------------- /Project 11/images/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/10.png -------------------------------------------------------------------------------- /Project 11/images/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/11.png -------------------------------------------------------------------------------- /Project 11/images/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/12.png -------------------------------------------------------------------------------- /Project 11/images/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/13.png -------------------------------------------------------------------------------- /Project 11/images/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/14.png -------------------------------------------------------------------------------- /Project 11/images/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/15.png -------------------------------------------------------------------------------- /Project 11/images/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/16.png -------------------------------------------------------------------------------- /Project 11/images/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/17.png -------------------------------------------------------------------------------- /Project 11/images/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/18.png -------------------------------------------------------------------------------- /Project 11/images/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/19.png -------------------------------------------------------------------------------- /Project 11/images/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/20.png -------------------------------------------------------------------------------- /Project 11/images/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/21.png -------------------------------------------------------------------------------- /Project 11/images/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/22.png -------------------------------------------------------------------------------- /Project 11/images/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/23.png -------------------------------------------------------------------------------- /Project 11/images/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/24.png -------------------------------------------------------------------------------- /Project 11/images/25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/25.png -------------------------------------------------------------------------------- /Project 11/images/26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/26.png -------------------------------------------------------------------------------- /Project 11/images/27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/27.png -------------------------------------------------------------------------------- /Project 11/images/28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/28.png -------------------------------------------------------------------------------- /Project 11/images/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/29.png -------------------------------------------------------------------------------- /Project 11/images/30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/30.png -------------------------------------------------------------------------------- /Project 11/images/31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/31.png -------------------------------------------------------------------------------- /Project 11/images/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/32.png -------------------------------------------------------------------------------- /Project 11/images/33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/33.png -------------------------------------------------------------------------------- /Project 11/images/34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 11/images/34.png -------------------------------------------------------------------------------- /Project 12/images/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/10.png -------------------------------------------------------------------------------- /Project 12/images/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/11.png -------------------------------------------------------------------------------- /Project 12/images/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/12.png -------------------------------------------------------------------------------- /Project 12/images/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/13.png -------------------------------------------------------------------------------- /Project 12/images/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/14.png -------------------------------------------------------------------------------- /Project 12/images/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/15.png -------------------------------------------------------------------------------- /Project 12/images/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/16.png -------------------------------------------------------------------------------- /Project 12/images/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/17.png -------------------------------------------------------------------------------- /Project 12/images/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/18.png -------------------------------------------------------------------------------- /Project 12/images/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/19.png -------------------------------------------------------------------------------- /Project 12/images/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/20.png -------------------------------------------------------------------------------- /Project 12/images/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/21.png -------------------------------------------------------------------------------- /Project 12/images/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/22.png -------------------------------------------------------------------------------- /Project 12/images/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/23.png -------------------------------------------------------------------------------- /Project 12/images/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/24.png -------------------------------------------------------------------------------- /Project 12/images/25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/25.png -------------------------------------------------------------------------------- /Project 12/images/26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/26.png -------------------------------------------------------------------------------- /Project 12/images/27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/27.png -------------------------------------------------------------------------------- /Project 12/images/28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/28.png -------------------------------------------------------------------------------- /Project 12/images/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/29.png -------------------------------------------------------------------------------- /Project 12/images/30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 12/images/30.png -------------------------------------------------------------------------------- /Project 14/images/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/10.png -------------------------------------------------------------------------------- /Project 14/images/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/11.png -------------------------------------------------------------------------------- /Project 14/images/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/12.png -------------------------------------------------------------------------------- /Project 14/images/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/13.png -------------------------------------------------------------------------------- /Project 14/images/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/14.png -------------------------------------------------------------------------------- /Project 14/images/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/15.png -------------------------------------------------------------------------------- /Project 14/images/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/16.png -------------------------------------------------------------------------------- /Project 14/images/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/17.png -------------------------------------------------------------------------------- /Project 14/images/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/18.png -------------------------------------------------------------------------------- /Project 14/images/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/19.png -------------------------------------------------------------------------------- /Project 14/images/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/20.png -------------------------------------------------------------------------------- /Project 14/images/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/21.png -------------------------------------------------------------------------------- /Project 14/images/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/22.png -------------------------------------------------------------------------------- /Project 14/images/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/23.png -------------------------------------------------------------------------------- /Project 14/images/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/24.png -------------------------------------------------------------------------------- /Project 14/images/25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/25.png -------------------------------------------------------------------------------- /Project 14/images/26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/26.png -------------------------------------------------------------------------------- /Project 14/images/27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/27.png -------------------------------------------------------------------------------- /Project 14/images/28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/28.png -------------------------------------------------------------------------------- /Project 14/images/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/29.png -------------------------------------------------------------------------------- /Project 14/images/30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/30.png -------------------------------------------------------------------------------- /Project 14/images/31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/31.png -------------------------------------------------------------------------------- /Project 14/images/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/32.png -------------------------------------------------------------------------------- /Project 14/images/33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/33.png -------------------------------------------------------------------------------- /Project 14/images/34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/34.png -------------------------------------------------------------------------------- /Project 14/images/35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/35.png -------------------------------------------------------------------------------- /Project 14/images/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/36.png -------------------------------------------------------------------------------- /Project 14/images/37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/37.png -------------------------------------------------------------------------------- /Project 14/images/38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/38.png -------------------------------------------------------------------------------- /Project 14/images/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/40.png -------------------------------------------------------------------------------- /Project 14/images/41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/41.png -------------------------------------------------------------------------------- /Project 14/images/42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/42.png -------------------------------------------------------------------------------- /Project 14/images/43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/43.png -------------------------------------------------------------------------------- /Project 14/images/44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/44.png -------------------------------------------------------------------------------- /Project 14/images/45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/45.png -------------------------------------------------------------------------------- /Project 14/images/46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/46.png -------------------------------------------------------------------------------- /Project 14/images/47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/47.png -------------------------------------------------------------------------------- /Project 14/images/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/48.png -------------------------------------------------------------------------------- /Project 14/images/49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 14/images/49.png -------------------------------------------------------------------------------- /Project 15/images/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 15/images/10.png -------------------------------------------------------------------------------- /Project 15/images/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 15/images/11.png -------------------------------------------------------------------------------- /Project 15/images/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 15/images/12.png -------------------------------------------------------------------------------- /Project 15/images/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 15/images/13.png -------------------------------------------------------------------------------- /Project 15/images/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 15/images/14.png -------------------------------------------------------------------------------- /Project 15/images/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 15/images/15.png -------------------------------------------------------------------------------- /Project 15/images/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 15/images/16.png -------------------------------------------------------------------------------- /Project 15/images/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 15/images/17.png -------------------------------------------------------------------------------- /Project 15/images/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 15/images/18.png -------------------------------------------------------------------------------- /Project 15/images/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 15/images/19.png -------------------------------------------------------------------------------- /Project 15/images/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 15/images/20.png -------------------------------------------------------------------------------- /Project 15/images/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 15/images/21.png -------------------------------------------------------------------------------- /Project 15/images/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 15/images/22.png -------------------------------------------------------------------------------- /Project 15/images/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 15/images/23.png -------------------------------------------------------------------------------- /Project 17/images/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 17/images/10.png -------------------------------------------------------------------------------- /Project 17/images/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 17/images/11.png -------------------------------------------------------------------------------- /Project 17/images/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 17/images/12.png -------------------------------------------------------------------------------- /Project 17/images/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 17/images/13.png -------------------------------------------------------------------------------- /Project 17/images/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 17/images/14.png -------------------------------------------------------------------------------- /Project 17/images/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 17/images/15.png -------------------------------------------------------------------------------- /Project 17/images/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 17/images/16.png -------------------------------------------------------------------------------- /Project 20/images/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 20/images/10.png -------------------------------------------------------------------------------- /Project 20/images/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 20/images/11.png -------------------------------------------------------------------------------- /Project 20/images/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 20/images/12.png -------------------------------------------------------------------------------- /Project 20/images/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 20/images/13.png -------------------------------------------------------------------------------- /Project 20/images/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 20/images/14.png -------------------------------------------------------------------------------- /Project 20/images/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 20/images/15.png -------------------------------------------------------------------------------- /Project 20/images/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 20/images/16.png -------------------------------------------------------------------------------- /Project 20/images/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 20/images/17.png -------------------------------------------------------------------------------- /Project 20/images/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 20/images/18.png -------------------------------------------------------------------------------- /Project 20/images/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 20/images/19.png -------------------------------------------------------------------------------- /Project 20/images/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 20/images/20.png -------------------------------------------------------------------------------- /Project 20/images/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 20/images/21.png -------------------------------------------------------------------------------- /Project 20/images/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 20/images/22.png -------------------------------------------------------------------------------- /Project 20/images/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 20/images/23.png -------------------------------------------------------------------------------- /Project 20/images/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 20/images/24.png -------------------------------------------------------------------------------- /Project 20/images/25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 20/images/25.png -------------------------------------------------------------------------------- /Project 21/images/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 21/images/10.png -------------------------------------------------------------------------------- /Project 21/images/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 21/images/11.png -------------------------------------------------------------------------------- /Project 21/images/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 21/images/12.png -------------------------------------------------------------------------------- /Project 21/images/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 21/images/13.png -------------------------------------------------------------------------------- /Project 21/images/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 21/images/14.png -------------------------------------------------------------------------------- /Project 21/images/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 21/images/15.png -------------------------------------------------------------------------------- /Project 21/images/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 21/images/16.png -------------------------------------------------------------------------------- /Project 21/images/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 21/images/17.png -------------------------------------------------------------------------------- /Project 21/images/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 21/images/18.png -------------------------------------------------------------------------------- /Project 21/images/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 21/images/19.png -------------------------------------------------------------------------------- /Project 22/images/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 22/images/10.png -------------------------------------------------------------------------------- /Project 22/images/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 22/images/11.png -------------------------------------------------------------------------------- /Project 22/images/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 22/images/12.png -------------------------------------------------------------------------------- /Project 22/images/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 22/images/13.png -------------------------------------------------------------------------------- /Project 22/images/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 22/images/14.png -------------------------------------------------------------------------------- /Project 22/images/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 22/images/15.png -------------------------------------------------------------------------------- /Project 22/images/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 22/images/16.png -------------------------------------------------------------------------------- /Project 22/images/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 22/images/17.png -------------------------------------------------------------------------------- /Project 22/images/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 22/images/18.png -------------------------------------------------------------------------------- /Project 22/images/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 22/images/19.png -------------------------------------------------------------------------------- /Project 22/images/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 22/images/20.png -------------------------------------------------------------------------------- /Project 22/images/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 22/images/21.png -------------------------------------------------------------------------------- /Project 23/images/231.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 23/images/231.png -------------------------------------------------------------------------------- /Project 23/images/232.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 23/images/232.png -------------------------------------------------------------------------------- /Project 23/images/233.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 23/images/233.png -------------------------------------------------------------------------------- /Project 23/images/234.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 23/images/234.png -------------------------------------------------------------------------------- /Project 22/images/22_i.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 22/images/22_i.png -------------------------------------------------------------------------------- /Project 22/images/OMOR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 22/images/OMOR.png -------------------------------------------------------------------------------- /Project 23/images/volumeID.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 23/images/volumeID.png -------------------------------------------------------------------------------- /Project 21/images/k8s_network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 21/images/k8s_network.png -------------------------------------------------------------------------------- /Project 22/images/k8s_workloads.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 22/images/k8s_workloads.png -------------------------------------------------------------------------------- /Project 21/images/k8s_network (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 21/images/k8s_network (1).png -------------------------------------------------------------------------------- /Project 2/images/Screenshot 2022-09-02 at 8.16.44 PM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 2/images/Screenshot 2022-09-02 at 8.16.44 PM.png -------------------------------------------------------------------------------- /Project 9/images/Screenshot 2022-10-10 at 5.46.14 AM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hack-Light/devops-projects/HEAD/Project 9/images/Screenshot 2022-10-10 at 5.46.14 AM.png -------------------------------------------------------------------------------- /Project 15/installations.md: -------------------------------------------------------------------------------- 1 | subscription-manager repos --enable codeready-builder-for-rhel-9-$(arch)-rpms 2 | dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm 3 | yum install -y dnf-utils http://rpms.remirepo.net/enterprise/remi-release-9.rpm -------------------------------------------------------------------------------- /misc/tasks-17.md: -------------------------------------------------------------------------------- 1 | # Additional tasks 2 | 3 | In addition to regular project submission include following: 4 | 5 | - Summarise your understanding on Networking concepts like IP Address, Subnets, CIDR Notation, IP Routing, Internet Gateways, NAT 6 | 7 | - Summarise your understanding of the OSI Model, TCP/IP suite and how they are connected – research beyond the provided articles, watch different YouTube videos to fully understand the concept around OSI and how it is related to the Internet and end-to-end Web Solutions. You don not need to memorise the layers – just understand the idea around it. 8 | 9 | - Explain the difference between assume role policy and role policy 10 | -------------------------------------------------------------------------------- /Project 5/readme.md: -------------------------------------------------------------------------------- 1 | # PROJECT 5 - CLIENT/SERVER ARCHITECTURE USING A MYSQL RELATIONAL DATABASE MANAGEMENT SYSTEM 2 | 3 | ![project5](./images/1.png) 4 | 5 | > On the server `mysql server` Don't turn off remote access while installing mysql. 6 | 7 | ### SETUP MYSQL SERVER 8 | 9 | > The steps to take are outlined in Project 1 and 2 10 | 11 | ![project5](./images/2.png) 12 | 13 | ![project5](./images/3.png) 14 | 15 | ![project5](./images/5.png) 16 | 17 | ![project5](./images/6.png) 18 | 19 | ![project5](./images/7.png) 20 | 21 | ### SETUP MYSQL CLIENT 22 | 23 | On the `client server` run 24 | 25 | ```bash 26 | sudo apt update 27 | sudo apt-get install mysql-client 28 | ``` 29 | 30 | ![project5](./images/8.png) 31 | 32 | ### ACTUAL CONFIGURATION 33 | 34 | > By default, both of your EC2 virtual servers are located in the same local virtual network, so they can communicate to each other using local IP addresses. Use mysql server's local IP address to connect from mysql client. 35 | > MySQL server uses `TCP port 3306` by default, so you will have to open it by creating a new entry in ‘Inbound rules’ in `mysql server` Security Groups. For extra security, do not allow all IP addresses to reach your `mysql server` – allow access only to the specific local IP address of your ‘mysql client’. 36 | 37 | - You might need to configure MySQL server to allow connections from remote hosts. 38 | 39 | ```bash 40 | sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf 41 | ``` 42 | 43 | - Replace ‘127.0.0.1’ to ‘0.0.0.0’ like this: 44 | 45 | ![project5](./images/11.png) 46 | 47 | ![project5](./images/9.png) 48 | 49 | ![project5](./images/10.png) 50 | 51 | - Restart the server 52 | 53 | `sudo systemctl restart mysql.service` 54 | 55 | ![project5](./images/12.png) 56 | 57 | - Create Remote MySQL user and grant remote access to databases 58 | 59 | ```mysql 60 | CREATE USER 'username'@'%' IDENTIFIED BY 'new-password'; 61 | FLUSH PRIVILEGES; 62 | ``` 63 | 64 | - Then you can grant access to databases using the `GRANT ALL` command: \ 65 | 66 | `GRANT ALL PRIVILEGES ON dbname.* TO 'username'@'%';` 67 | 68 | - If you want to grant access to all databases on the server, run:\ 69 | `GRANT ALL PRIVILEGES ON *.* TO 'user'@'%';` 70 | 71 | - Once connected run\ 72 | `Show databases;` 73 | 74 | - On the mysql client run the command `mysql -h -u -p` 75 | ![project5](./images/14.png) 76 | 77 | ![project5](./images/15.png) 78 | 79 | ![project5](./images/16.png) 80 | -------------------------------------------------------------------------------- /Project 1/readme.md: -------------------------------------------------------------------------------- 1 | # PROJECT 1 - LAMP STACK IMPLEMENTATION 2 | 3 | ### CREATING AN AWS ACCOUNT AND SPINNING UP YOUR FIRST LINUX SERVER 4 | 5 | - Create an AWS Account 6 | - Create an IAM user with programmatic access 7 | - Create a key pair certificate and download it 8 | - Spin up an ec2 instance 9 | - run `chmod 400` on The key pair downloaded 10 | - Connect to your ec2 instance over the ssh network. 11 | 12 | ![connect to aws ec2 instance](./images/1.png) 13 | 14 | ## THE ACTUAL WORK 15 | 16 | --- 17 | 18 | ### INSTALLING APACHE AND UPDATING THE FIREWALL 19 | 20 | - `sudo apt update` - Always run this command when starting a new server 21 | 22 | ![sudo apt update](./images/2.png) 23 | 24 | - `sudo apt install apache2` - Install apache on your server 25 | 26 | ![project1](./images/3.png) 27 | 28 | - `sudo systemctl status apache2` - to check if your apache server is running without any errors. 29 | 30 | ![project1](./images/4.png) 31 | 32 | - Try visiting your site using `http://:80` 33 | 34 | ![project1](./images/5.png) 35 | 36 | - Site cannot be reached - this is because I have not opened port 80 in my security group (firewall) 37 | 38 | ### STEPS TO OPEN A NEW PORT IN THE SECURITY GROUPS 39 | 40 | - In the sidebar scroll down and find security groups 41 | - Select launch-wizard-1 - which was created when creating the server or the security group attached to the server. 42 | - Select the inbound rules tab and click on edit 43 | 44 | ![project1](./images/6.png) 45 | 46 | - Click on add rule 47 | 48 | - Change custom tcp to http and port to 80 49 | bv e my first apache server running 50 | 51 | ![project1](./images/9.png) 52 | 53 | ### INSTALLING MYSQL 54 | 55 | - sudo apt install mysql-server 56 | ![project1](./images/10.png) 57 | 58 | - Sudo mysql 59 | ![project1](./images/11.png) 60 | 61 | - run `ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'PassWord.1';` - This set the password for the root user. 62 | 63 | - run `sudo mysql_secure_installation` 64 | ![project1](./images/12.png) 65 | 66 | ### INSTALLING PHP 67 | 68 | - run `sudo apt install php libapache2-mod-php php-mysql` 69 | 70 | - php - display dynamic content 71 | 72 | - hp-mysql - Allow php to communicate with mysql server 73 | 74 | - libapache2-mod-php - will enable apache to handle php files 75 | 76 | ![project1](./images/13.png) 77 | 78 | - run `php -v` to checkthe version 79 | 80 | ![project1](./images/14.png) 81 | 82 | ### CREATING VIRTUAL HOSTS FOR WEBSITES 83 | 84 | - run the following commands 85 | 86 | ```bash 87 | sudo mkdir /var/www/projectlamp 88 | sudo chown -R $USER:$USER /var/www/projectlamp #assign the ownership of the directory to the current user of the system. 89 | sudo vi /etc/apache2/sites-available/projectlamp.conf 90 | ``` 91 | 92 | - paste this in side the file editor 93 | 94 | ```conf 95 | 96 | ServerName projectlamp 97 | ServerAlias www.projectlamp 98 | ServerAdmin webmaster@localhost 99 | DocumentRoot /var/www/projectlamp 100 | ErrorLog ${APACHE_LOG_DIR}/error.log 101 | CustomLog ${APACHE_LOG_DIR}/access.log combined 102 | 103 | ``` 104 | 105 | - Save the file and quit 106 | 107 | - run the following commands 108 | 109 | ```bash 110 | sudo a2ensite projectlamp #to enable the virtualhost created 111 | sudo a2dissite 000-default #to disable the default site 112 | sudo apache2ctl configtest #check syntax error in config files 113 | sudo systemctl reload apache2 #to reload the apache server 114 | ``` 115 | 116 | ![project1](./images/15.png) 117 | 118 | - But the `/var/www/projectlamp` is empty so we create an html file to display 119 | 120 | ```bash 121 | sudo echo 'Hello LAMP from hostname' $(curl -s http://169.254.169.254/latest/meta-data/public-hostname) 'with public IP' $(curl -s http://169.254.169.254/latest/meta-data/public-ipv4) > /var/www/projectlamp/index.html 122 | ``` 123 | 124 | ### ENABLE PHP ON THE WEBSITE 125 | 126 | - run `sudo vim /etc/apache2/mods-enabled/dir.conf` 127 | 128 | - Paste in 129 | 130 | ```conf 131 | 132 | #Change this: 133 | #DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm 134 | #To this: 135 | DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm 136 | 137 | ``` 138 | 139 | - run `sudo systemctl reload apache2` - this restarts the apache server 140 | 141 | ![project1](./images/16.png) 142 | 143 | - ` vim /var/www/projectlamp/index.php` - this creates and opens a php file in vim editor 144 | 145 | - paste in 146 | 147 | ```php 148 | 48 | 49 | 50 | BalancerMember http://:80 loadfactor=5 timeout=1 51 | BalancerMember http://:80 loadfactor=5 timeout=1 52 | ProxySet lbmethod=bytraffic 53 | # ProxySet lbmethod=byrequests 54 | 55 | 56 | ProxyPreserveHost On 57 | ProxyPass / balancer://mycluster/ 58 | ProxyPassReverse / balancer://mycluster/ 59 | ``` 60 | 61 | ![project8](./images/9.png) 62 | 63 | - Restart apache server `sudo systemctl restart apache2` 64 | 65 | ![project8](./images/10.png) 66 | 67 | > Bytraffic balancing method will distribute incoming load between your Web Servers according to current traffic load. We can control in which proportion the traffic must be distributed by loadfactor parameter. 68 | 69 | > Other methods, include: bybusyness, byrequests, heartbeat 70 | 71 | - Verify that our configuration works – try to access your LB’s public IP address or Public DNS name from your browser: 72 | `http:///index.php` 73 | 74 | ![project8](./images/11.png) 75 | 76 | > Note: If in the Project 7 you mounted `/var/log/httpd/` from your Web Servers to the `NFS server` – unmount them and make sure that each Web Server has its own log directory. 77 | 78 | - Open two ssh/Putty consoles for both Web Servers and run following command: 79 | 80 | `sudo tail -f /var/log/httpd/access_log` 81 | 82 | - Try to refresh your browser page `http:///index.php` several times and make sure that both servers receive HTTP GET requests from your LB – new records must appear in each server’s log file. The number of requests to each server will be approximately the same since we set `loadfactor` to the same value for both servers – it means that traffic will be disctributed evenly between them. 83 | 84 | ![project8](./images/12.png) 85 | 86 | ![project8](./images/13.png) 87 | 88 | > If you have configured everything correctly – your users will not even notice that their requests are served by more than one server. 89 | 90 | ## OPTIONAL STEP – CONFIGURE LOCAL DNS NAMES RESOLUTION 91 | 92 | > Sometimes it is tedious to remember and switch between IP addresses, especially if you have a lot of servers under your management. 93 | > What we can do, is to configure local domain name resolution. The easiest way is to use `/etc/hosts file`, although this approach is not very > scalable, but it is very easy to configure and shows the concept well. So let us configure IP address to domain name mapping for our LB. 94 | 95 | - Open this file on your LB server 96 | 97 | `sudo vi /etc/hosts` 98 | 99 | - Add 2 records into this file with Local IP address and arbitrary name for both of your Web Servers 100 | 101 | ```config 102 | Web1 103 | Web2 104 | ``` 105 | 106 | - Now you can update your LB config file with those names instead of IP addresses. 107 | 108 | ```config 109 | BalancerMember http://Web1:80 loadfactor=5 timeout=1 110 | BalancerMember http://Web2:80 loadfactor=5 timeout=1 111 | ``` 112 | 113 | - You can try to `curl` your Web Servers from LB locally `curl http://Web1` or `curl http://Web2` – it will work. 114 | 115 | > Remember, this is only internal configuration and it is also local to your LB server, these names will neither be ‘resolvable’ from other servers internally nor from the Internet. 116 | 117 | - #### THIS VIDEO CONTAINS ALL COMMANDS USED TO FINISH THIS PROJECT - [Project 8 Video](https://drive.google.com/file/d/1sNyUN7UwtxJ9nCjMQrLJfjAjxSZTKdKZ/view?usp=sharing) 118 | 119 | - Now your set up looks like this: 120 | 121 | ![project8](./images/14.png) 122 | 123 | Congratulations! 124 | You have just implemented a Load balancing Web Solution for your DevOps team. 125 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DEVOPS PROJECTS 2 | 3 | > PROJECT BASED DEVOPS TRAINING FROM [DAREY.IO](https://darey.io) 4 | 5 | ### [PROJECT 1](./Project%201/) - LAMP STACK IMPLEMENTATION 6 | 7 | Deployed a simple website using the technology stack - Linux, Apache, MySQL and PHP 8 | 9 | --- 10 | 11 | ### [PROJECT 2](./Project%202/) - LEMP STACK IMPLEMENTATION 12 | 13 | Deployed a simple website using the technology stack - Linux, NGINX, MySQL and PHP 14 | 15 | --- 16 | 17 | ### [PROJECT 3](./Project%203/) - SIMPLE TO-DO APPLICATION ON MERN WEB STACK 18 | 19 | Deployed a todo aplication that was built on the following stack - MongoDB, Express, React, Node. 20 | 21 | --- 22 | 23 | ### [PROJECT 4](./Project%204/) - MEAN STACK DEPLOYMENT TO UBUNTU IN AWS 24 | 25 | Deployed a simple aplication that was built on the following stack - MongoDB, Express, Angular, Node. 26 | 27 | --- 28 | 29 | ### [PROJECT 5](./Project%205/) - CLIENT/SERVER ARCHITECTURE USING A MYSQL RELATIONAL DATABASE MANAGEMENT SYSTEM 30 | 31 | Worked with 2 servers to simulate MySLQ server and MySQL client and how to connect the 2. 32 | 33 | > **Interesting fact:** `MySQL` is an open-source relational database management system. **Its name is a combination of `My`, the name of co-founder Michael Widenius’s daughter**, and `SQL`, the abbreviation for Structured Query Language. 34 | 35 | --- 36 | 37 | ### [PROJECT 6](./Project%206/) - WEB SOLUTION WITH WORDPRESS 38 | 39 | In this project I prepared a storage infrastructure on two Linux servers and implemented a basic web solution using `WordPress`. WordPress is a free and open-source content management system written in PHP and paired with MySQL or MariaDB as its backend Relational Database Management System (RDBMS). 40 | 41 | #### This project consists of two parts: 42 | 43 | 1. Configure storage subsystem for Web and Database servers based on Linux OS. The focus of this part is to give you practical experience of working with disks, partitions and volumes in Linux. 44 | 45 | 2. Install WordPress and connect it to a remote MySQL database server. This part of the project will solidify your skills of deploying Web and DB tiers of Web solution. 46 | 47 | --- 48 | 49 | ### [PROJECT 7](./Project%207/) - DEVOPS TOOLING WEBSITE SOLUTION 50 | 51 | In this project you will implement a solution that consists of the following components: 52 | 53 | - Infrastructure: AWS 54 | 55 | - Webserver Linux: Red Hat Enterprise Linux 8 56 | 57 | - Database Server: Ubuntu 20.04 + MySQL 58 | 59 | - Storage Server: Red Hat Enterprise Linux 8 + NFS Server (LVM) 60 | 61 | - Programming Language: PHP 62 | 63 | - Code Repository: GitHub 64 | 65 | --- 66 | 67 | ### [PROJECT 8](./Project%208/) - LOAD BALANCER SOLUTION WITH APACHE 68 | 69 | Deployed and configured an Apache Load Balancer for Tooling Website solution on a separate Ubuntu EC2 intance. Made sure that users can be served by Web servers through the Load Balancer. 70 | 71 | --- 72 | 73 | ### [PROJECT 9](./Project%209/) - CONTINOUS INTEGRATION PIPELINE FOR TOOLING WEBSITE 74 | 75 | In this project I utilized Jenkins CI capabilities to make sure that every change made to the source code in GitHub `https://github.com/Hack-Light/tooling` will be automatically be updated to the Tooling Website. 76 | 77 | --- 78 | 79 | ### [PROJECT 10](./Project%2010/) - LOAD BALANCER SOLUTION WITH NGINX AND SSL/TLS 80 | 81 | In this project I registered a website with LetsEnrcypt Certificate Authority, and automated certificate issuance using a shell client recommended by LetsEncrypt – `cetrbot`. 82 | 83 | #### This project consists of two parts: 84 | 85 | 1. Configure Nginx as a Load Balancer 86 | 2. Register a new domain name and configure secured connection using SSL/TLS certificates 87 | 88 | --- 89 | 90 | ### [PROJECT 11](./Project%2011/) - ANSIBLE (AUTOMATE PROJECT 7 TO 10) 91 | 92 | This Project made me appreciate DevOps tools even more by making most of the routine tasks automated with Ansible Configuration Management, at the same time I become confident at writing code using declarative language such as YAML. 93 | 94 | #### Task 95 | 96 | - Installed and configured Ansible client to act as a Jump Server/Bastion Host 97 | - Created a simple Ansible playbook to automate servers configuration 98 | 99 | --- 100 | 101 | ### [PROJECT 12](./Project%2012/) - ANSIBLE REFACTORING AND STATIC ASSIGNMENTS (IMPORTS AND ROLES) 102 | 103 | In this project, I continued working with `https://github.com/Hack-Lightansible-config-mgt` repository and made some improvements on the code. I refactored the Ansible code, created assignments, and learned how to use the imports functionality. Imports allow to effectively re-use previously created playbooks in a new playbook – it allows you to organize your tasks and reuse them when needed. 104 | 105 | --- 106 | 107 | ### [PROJECT 13](./Project%2013/) - ANSIBLE DYNAMIC ASSIGNMENTS (INCLUDE) AND COMMUNITY ROLES 108 | 109 | I continued configuring my UAT servers, learning and practicing new Ansible concepts and modules. 110 | 111 | --- 112 | 113 | ### [PROJECT 14](./Project%2013/) - EXPERIENCE CONTINUOUS INTEGRATION WITH JENKINS | ANSIBLE | ARTIFACTORY | SONARQUBE | PHP 114 | 115 | In this project, I understood and got hands on experience around the entire concept around CI/CD from applications perspective. 116 | 117 | > To fully gain real expertise around this idea, it is best to see it in action across different programming languages and from the platform perspective too. 118 | 119 | > From the application perspective, we will be focusing on PHP here. 120 | -------------------------------------------------------------------------------- /Project 19/readme.md: -------------------------------------------------------------------------------- 1 | # PROJECT 19 - AUTOMATE INFRASTRUCTURE WITH IAC USING TERRAFORM. PART 4 – TERRAFORM CLOUD 2 | 3 | ## What Terraform Cloud is and why use it 4 | 5 | By now, you should be pretty comfortable writing Terraform code to provision Cloud infrastructure using Configuration Language (HCL). Terraform is an open-source system, that you installed and ran a Virtual Machine (VM) that you had to create, maintain and keep up to date. In Cloud world it is quite common to provide a managed version of an open-source software. Managed means that you do not have to install, configure and maintain it yourself – you just create an account and use it "as A Service". 6 | 7 | Terraform Cloud is a managed service that provides you with Terraform CLI to provision infrastructure, either on demand or in response to various events. 8 | 9 | By default, Terraform CLI performs operation on the server whene it is invoked, it is perfectly fine if you have a dedicated role who can launch it, but if you have a team who works with Terraform – you need a consistent remote environment with remote workflow and shared state to run Terraform commands. 10 | 11 | Terraform Cloud executes Terraform commands on disposable virtual machines, this remote execution is also called remote operations. 12 | 13 | ## Migrate your .tf codes to Terraform Cloud 14 | 15 | Le us explore how we can migrate our codes to Terraform Cloud and manage our AWS infrastructure from there: 16 | 17 | - Create a Terraform Cloud account 18 | - Create an organization 19 | - Select "Start from scratch", choose a name for your organization and create it. 20 | - Configure a workspace 21 | 22 | ![project19](./images/1.png) 23 | 24 | We will use version control workflow as the most common and recommended way to run Terraform commands triggered from our git repository. 25 | 26 | Create a new repository in your GitHub and call it terraform-cloud, push your Terraform codes developed in the previous projects to the repository. 27 | 28 | Choose version control workflow and you will be promped to connect your GitHub account to your workspace – follow the prompt and add your newly created repository to the workspace. 29 | 30 | Move on to "Configure settings", provide a description for your workspace and leave all the rest settings default, click "Create workspace". 31 | 32 | ### Configure variables 33 | 34 | Terraform Cloud supports two types of variables: `environment variables` and `Terraform variables`. Either type can be marked as sensitive, which prevents them from being displayed in the Terraform Cloud web UI and makes them write-only. 35 | 36 | Set two environment variables: `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`, set the values that you used in Project 16. These credentials will be used to privision your AWS infrastructure by Terraform Cloud. 37 | 38 | After you have set these 2 environment variables – yout Terraform Cloud is all set to apply the codes from GitHub and create all necessary AWS resources. 39 | 40 | Now it is time to run our Terrafrom scripts, but in our previous project which was project 18, we talked about using Packer to build our images, and Ansible to configure the infrastructure, so for that we are going to make few changes to our our existing respository from Project 18. 41 | 42 | The files that would be Addedd is; 43 | 44 | - AMI: for building packer images 45 | - Ansible: for Ansible scripts to configure the infrastucture 46 | 47 | Before you proceed ensure you have the following tools installed on your local machine; 48 | 49 | - packer 50 | - Ansible 51 | 52 | ![project19](./images/2.png) 53 | 54 | Refer to this repository for guidiance on how to refactor your enviroment to meet the new changes above and ensure you go through the README.md file. 55 | 56 | Run terraform plan and terraform apply from web console 57 | 58 | Switch to "Runs" tab and click on "Queue plan manualy" button. If planning has been successfull, you can proceed and confirm Apply – press "Confirm and apply", provide a comment and "Confirm plan" 59 | 60 | Check the logs and verify that everything has run correctly. Note that Terraform Cloud has generated a unique state version that you can open and see the codes applied and the changes made since the last run. 61 | 62 | ![project19](./images/3.png) 63 | 64 | ![project19](./images/4.png) 65 | 66 | ![project19](./images/5.png) 67 | 68 | ![project19](./images/6.png) 69 | 70 | ![project19](./images/7.png) 71 | 72 | ![project19](./images/8.png) 73 | 74 | ## Test automated terraform plan 75 | 76 | By now, you have tried to launch plan and apply manually from Terraform Cloud web console. But since we have an integration with GitHub, the process can be triggered automatically. Try to change something in any of .tf files and look at "Runs" tab again – plan must be launched automatically, but to apply you still need to approve manually. Since provisioning of new Cloud resources might incur significant costs. Even though you can configure "Auto apply", it is always a good idea to verify your plan results before pushing it to apply to avoid any misconfigurations that can cause ‘bill shock’. 77 | 78 | ![project19](./images/9.png) 79 | 80 | ## Practice Task 1 81 | 82 | - Configure 3 branches in your terraform-cloud repository for dev, test, prod environments 83 | - Make necessary configuration to trigger runs automatically only for dev environment 84 | - Create an Email and Slack notifications for certain events (e.g. started plan or errored run) and test it 85 | - Apply destroy from Terraform Cloud web console 86 | 87 | ## Public Module Registry vs Private Module Registry 88 | 89 | Terraform has a quite strong community of contributors (individual developers and 3rd party companies) that along with HashiCorp maintain a Public Registry, where you can find reusable configuration packages (modules). We strongly encourage you to explore modules shared to the public registry, specifically for this project – you can check out this AWS provider registy page. 90 | 91 | As your Terraform code base grows, your DevOps team might want to create you own library of reusable components – Private Registry can help with that. 92 | 93 | ## Practice Task 2 Working with Private repository 94 | 95 | - Create a simple Terraform repository (you can clone one from here) that will be your module 96 | - Import the module into your private registry 97 | - Create a configuration that uses the module 98 | - Create a workspace for the configuration 99 | - Deploy the infrastructure 100 | - Destroy your deployment 101 | -------------------------------------------------------------------------------- /Project 10/readme.md: -------------------------------------------------------------------------------- 1 | # PROJECT 10 - LOAD BALANCER SOLUTION WITH NGINX AND SSL/TLS 2 | 3 | ![project10](./images/1.png) 4 | 5 | > You can either uninstall Apache from the existing Load Balancer server or create a fresh installation of Linux for Nginx. `sudo apt-get remove –purge apache2 apache2-utils` 6 | 7 | OR 8 | 9 | > Create an EC2 VM based on Ubuntu Server 20.04 LTS and name it `Nginx LB` (do not forget to open TCP port 80 for HTTP connections, also open TCP port 443 – this port is used for secured HTTPS connections) 10 | 11 | - Update `/etc/hosts`file for local DNS with Web Servers’ names (e.g. `Web1` and `Web2`) and their local IP addresses 12 | 13 | - Install and configure Nginx as a load balancer to point traffic to the resolvable DNS names of the webservers 14 | 15 | - Update the instance and Install Nginx 16 | 17 | ```bash 18 | sudo apt update 19 | sudo apt install nginx 20 | ``` 21 | 22 | ![project10](./images/2.png) 23 | 24 | ![project10](./images/3.png) 25 | 26 | ![project10](./images/4.png) 27 | 28 | - Configure Nginx LB using Web Servers’ names defined in /etc/hosts 29 | 30 | > Hint: Read this blog to read about [/etc/host](https://linuxize.com/post/how-to-edit-your-hosts-file/) 31 | 32 | - Open the default nginx configuration file `sudo vi /etc/nginx/nginx.conf` 33 | 34 | - insert following configuration into http section 35 | 36 | ```config 37 | upstream myproject { 38 | server Web1 weight=5; 39 | server Web2 weight=5; 40 | } 41 | 42 | server { 43 | listen 80; 44 | server_name www.domain.com; 45 | location / { 46 | proxy_pass http://myproject; 47 | } 48 | } 49 | 50 | #comment out this line 51 | # include /etc/nginx/sites-enabled/*; 52 | ``` 53 | 54 | ![project10](./images/5.png) 55 | 56 | - Restart Nginx and make sure the service is up and running 57 | 58 | ```bash 59 | sudo systemctl restart nginx 60 | sudo systemctl status nginx 61 | ``` 62 | 63 | ![project10](./images/6.png) 64 | 65 | > Side Self Study: Read more about HTTP load balancing methods and features supported by Nginx on this page 66 | 67 | ## REGISTER A NEW DOMAIN NAME AND CONFIGURE SECURED CONNECTION USING SSL/TLS CERTIFICATES 68 | 69 | Let us make necessary configurations to make connections to our Tooling Web Solution secured! 70 | 71 | > In order to get a valid SSL certificate – you need to register a new domain name, you can do it using any Domain name registrar – a company that manages reservation of domain names. The most popular ones are: Godaddy.com, Domain.com, Bluehost.com. 72 | 73 | > Register a new domain name with any registrar of your choice in any domain zone (e.g. .com, .net, .org, .edu, .info, .xyz or any other) 74 | 75 | ![project10](./images/7.png) 76 | 77 | ## ASSIGN AN ELASTIC IP TO YOUR NGINX LB SERVER AND ASSOCIATE YOUR DOMAIN NAME WITH THIS ELASTIC IP 78 | 79 | > You might have noticed, that every time you restart or stop/start your EC2 instance – you get a new public IP address. When you want to associate your domain name – it is better to have a static IP address that does not change after reboot. Elastic IP is the solution for this problem, learn how to allocate an Elastic IP and associate it with an EC2 server on this page. 80 | 81 | ![project10](./images/8.png) 82 | 83 | ![project10](./images/9.png) 84 | 85 | ![project10](./images/10.png) 86 | 87 | ![project10](./images/11.png) 88 | 89 | - Update `A` record in your registrar to point to Nginx LB using Elastic IP address 90 | 91 | ![project10](./images/12.png) 92 | 93 | ![project10](./images/13.png) 94 | 95 | > Learn how associate your domain name to your Elastic IP on this page. 96 | 97 | > Side Self Study: Read about different DNS record types and learn what they are used for. 98 | 99 | - Check that your Web Servers can be reached from your browser using new domain name using HTTP protocol – `http://` 100 | 101 | ![project10](./images/14.png) 102 | 103 | - Configure Nginx to recognize your new domain name 104 | 105 | - Update your `nginx.conf` with 106 | 107 | ```config 108 | server_name www. 109 | 110 | # instead of 111 | 112 | server_name www.domain.com 113 | ``` 114 | 115 | ![project10](./images/15.png) 116 | 117 | ![project10](./images/16.png) 118 | 119 | ## INSTALL CERTBOT AND REQUEST FOR AN SSL/TLS CERTIFICATE 120 | 121 | - Make sure snapd service is active and running `sudo systemctl status snapd` 122 | 123 | ![project10](./images/17.png) 124 | 125 | - Install certbot `sudo snap install --classic certbot` 126 | 127 | ![project10](./images/18.png) 128 | 129 | - Request your certificate (just follow the certbot instructions – you will need to choose which domain you want your certificate to be issued for, domain name will be looked up from nginx.conf file so make sure you have updated it on the previous step). 130 | 131 | ```bash 132 | sudo ln -s /snap/bin/certbot /usr/bin/certbot 133 | sudo certbot --nginx 134 | ``` 135 | 136 | ![project10](./images/19.png) 137 | 138 | - Test secured access to your Web Solution by trying to reach `https://` 139 | 140 | ![project10](./images/20.png) 141 | 142 | - You shall be able to access your website by using HTTPS protocol (that uses `TCP port 443`) and see a padlock pictogram in your browser’s search string. 143 | 144 | - Click on the padlock icon and you can see the details of the certificate issued for your website. 145 | 146 | ## SET UP PERIODICAL RENEWAL OF YOUR SSL/TLS CERTIFICATE 147 | 148 | > By default, LetsEncrypt certificate is valid for 90 days, so it is recommended to renew it at least every 60 days or more frequently. 149 | 150 | - You can test renewal command in dry-run mode `sudo certbot renew --dry-run` 151 | 152 | - Best pracice is to have a scheduled job that to run renew command periodically. Let us configure a cronjob to run the command twice a day. 153 | 154 | - To do so, lets edit the crontab file with the following command: 155 | 156 | ```bash 157 | crontab -e 158 | # Add following line: 159 | * */12 * * * root /usr/bin/certbot renew > /dev/null 2>&1 160 | ``` 161 | 162 | > You can always change the interval of this cronjob if twice a day is too often by adjusting schedule expression. 163 | 164 | > Side Self Study: Refresh your cron configuration knowledge by watching this [video](https://youtu.be/4g1i0ylvx3A). 165 | 166 | > You can also use this handy online cron [expression editor](https://crontab.guru/). 167 | 168 | **Congratulations!** 169 | 170 | _You have just implemented an Nginx Load Balancing Web Solution with secured HTTPS connection with periodically updated SSL/TLS certificates._ 171 | -------------------------------------------------------------------------------- /Project 24/readme.md: -------------------------------------------------------------------------------- 1 | # PROJECT 24 - BUILDING ELASTIC KUBERNETES SERVICE (EKS) WITH TERRAFORM 2 | 3 | Since project 21 and 22, you have had some fragmented experience around kubernetes bootstraping and deployment of containerised applications. This project seeks to solidify your skills by focusing more on real world set up. 4 | 5 | - You will use Terraform to create a Kubernetes EKS cluster and dynamically add scalable worker nodes 6 | - You will deploy multiple applications using HELM 7 | - You will experience more kubernetes objects and how to use them with Helm. Such as Dynamic provisioning of volumes to make pods stateful 8 | - You will improve upon your CI/CD skills with Jenkins 9 | 10 | In Project 21, you created a k8s cluster from Ground-Up. That was quite painful, but very necessary to help you master kubernetes. Going forward, you will not have to do that. Even in the real world, you will hardly ever have to do that. given that cloud providers such as AWS have managed services for kubernetes, they have done all the hard work, and with a few API calls to AWS, you can have a production grade cluster ready to go in minutes. Therefore, in this project, you begin by focusing on EKS, and how to get it up and running using Terraform. Before moving on to other things. 11 | 12 | Building EKS with Terraform 13 | At this point you already have some Terraform experience. So, you have some work to do. But, you can get started with the steps below. If you have terraform code from Project 16, simply update the code and include EKS starting from number 6 below. Otherwise, follow the steps from number 1 14 | 15 | Note: Use Terraform version v1.0.2 and kubectl version v1.23.6 16 | 17 | Open up a new directory on your laptop, and name it eks 18 | Use AWS CLI to create an S3 bucket 19 | Create a file – backend.tf Task for you, ensure the backend is configured for remote state in S3 20 | terraform { 21 | } 22 | Create a file – network.tf and provision Elastic IP for Nat Gateway, VPC, Private and public subnets. 23 | 24 | # reserve Elastic IP to be used in our NAT gateway 25 | 26 | resource "aws_eip" "nat_gw_elastic_ip" { 27 | vpc = true 28 | 29 | tags = { 30 | Name = "${var.cluster_name}-nat-eip" 31 | iac_environment = var.iac_environment_tag 32 | } 33 | } 34 | Create VPC using the official AWS module 35 | module "vpc" { 36 | source = "terraform-aws-modules/vpc/aws" 37 | 38 | name = "${var.name_prefix}-vpc" 39 | cidr = var.main_network_block 40 | azs = data.aws_availability_zones.available_azs.names 41 | 42 | private_subnets = [ 43 | 44 | # this loop will create a one-line list as ["10.0.0.0/20", "10.0.16.0/20", "10.0.32.0/20", ...] 45 | 46 | # with a length depending on how many Zones are available 47 | 48 | for zone_id in data.aws_availability_zones.available_azs.zone_ids : 49 | cidrsubnet(var.main_network_block, var.subnet_prefix_extension, tonumber(substr(zone_id, length(zone_id) - 1, 1)) - 1) 50 | ] 51 | 52 | public_subnets = [ 53 | 54 | # this loop will create a one-line list as ["10.0.128.0/20", "10.0.144.0/20", "10.0.160.0/20", ...] 55 | 56 | # with a length depending on how many Zones are available 57 | 58 | # there is a zone Offset variable, to make sure no collisions are present with private subnet blocks 59 | 60 | for zone_id in data.aws_availability_zones.available_azs.zone_ids : 61 | cidrsubnet(var.main_network_block, var.subnet_prefix_extension, tonumber(substr(zone_id, length(zone_id) - 1, 1)) + var.zone_offset - 1) 62 | ] 63 | 64 | # Enable single NAT Gateway to save some money 65 | 66 | # WARNING: this could create a single point of failure, since we are creating a NAT Gateway in one AZ only 67 | 68 | # feel free to change these options if you need to ensure full Availability without the need of running 'terraform apply' 69 | 70 | # reference: https://registry.terraform.io/modules/terraform-aws-modules/vpc/aws/2.44.0#nat-gateway-scenarios 71 | 72 | enable_nat_gateway = true 73 | single_nat_gateway = true 74 | one_nat_gateway_per_az = false 75 | enable_dns_hostnames = true 76 | reuse_nat_ips = true 77 | external_nat_ip_ids = [aws_eip.nat_gw_elastic_ip.id] 78 | 79 | # Add VPC/Subnet tags required by EKS 80 | 81 | tags = { 82 | "kubernetes.io/cluster/${var.cluster_name}" = "shared" 83 | iac_environment = var.iac_environment_tag 84 | } 85 | public_subnet_tags = { 86 | "kubernetes.io/cluster/${var.cluster_name}" = "shared" 87 | "kubernetes.io/role/elb" = "1" 88 | iac_environment = var.iac_environment_tag 89 | } 90 | private_subnet_tags = { 91 | "kubernetes.io/cluster/${var.cluster_name}" = "shared" 92 | "kubernetes.io/role/internal-elb" = "1" 93 | iac_environment = var.iac_environment_tag 94 | } 95 | } 96 | Note: The tags added to the subnets is very important. The Kubernetes Cloud Controller Manager (cloud-controller-manager) and AWS Load Balancer Controller (aws-load-balancer-controller) needs to identify the cluster’s. To do that, it querries the cluster’s subnets by using the tags as a filter. 97 | 98 | For public and private subnets that use load balancer resources: each subnet must be tagged 99 | 100 | Key: kubernetes.io/cluster/cluster-name 101 | Value: shared 102 | For private subnets that use internal load balancer resources: each subnet must be tagged 103 | 104 | Key: kubernetes.io/role/internal-elb 105 | Value: 1 106 | For public subnets that use internal load balancer resources: each subnet must be tagged 107 | 108 | Key: kubernetes.io/role/elb 109 | Value: 1 110 | Create a file – variables.tf 111 | 112 | # create some variables 113 | 114 | variable "cluster_name" { 115 | type = string 116 | description = "EKS cluster name." 117 | } 118 | variable "iac_environment_tag" { 119 | type = string 120 | description = "AWS tag to indicate environment name of each infrastructure object." 121 | } 122 | variable "name_prefix" { 123 | type = string 124 | description = "Prefix to be used on each infrastructure object Name created in AWS." 125 | } 126 | variable "main_network_block" { 127 | type = string 128 | description = "Base CIDR block to be used in our VPC." 129 | } 130 | variable "subnet_prefix_extension" { 131 | type = number 132 | description = "CIDR block bits extension to calculate CIDR blocks of each subnetwork." 133 | } 134 | variable "zone_offset" { 135 | type = number 136 | description = "CIDR block bits extension offset to calculate Public subnets, avoiding collisions with Private subnets." 137 | } 138 | Create a file – data.tf – This will pull the available AZs for use. 139 | 140 | # get all available AZs in our region 141 | 142 | data "aws_availability_zones" "available_azs" { 143 | state = "available" 144 | } 145 | data "aws_caller_identity" "current" {} # used for accesing Account ID and ARN 146 | -------------------------------------------------------------------------------- /Project 9/readme.md: -------------------------------------------------------------------------------- 1 | # PROJECT 9 - CONTINOUS INTEGRATION PIPELINE FOR TOOLING WEBSITE 2 | 3 | ## TOOLING WEBSITE DEPLOYMENT AUTOMATION WITH CONTINUOUS INTEGRATION. INTRODUCTION TO JENKINS 4 | 5 | ![project9](./images/14.png) 6 | 7 | ### INSTALL AND CONFIGURE JENKINS SERVER 8 | 9 | #### Step 1 – Install Jenkins server 10 | 11 | - Create an AWS EC2 server based on Ubuntu Server 20.04 LTS and name it `Jenkins` 12 | 13 | - Install JDK (since Jenkins is a Java-based application) 14 | 15 | ```bash 16 | sudo apt update 17 | sudo apt install default-jdk-headless 18 | # Install Jenkins 19 | wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add - 20 | sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > \ 21 | /etc/apt/sources.list.d/jenkins.list' 22 | sudo apt update 23 | sudo apt-get install jenkins 24 | ``` 25 | 26 | ![project9](./images/1.png) 27 | 28 | - Make sure Jenkins is up and running `sudo systemctl status jenkins` 29 | 30 | ![project9](./images/2.png) 31 | 32 | > By default Jenkins server uses TCP port 8080 – open it by creating a new Inbound Rule in your EC2 Security Group 33 | 34 | - Perform initial Jenkins setup. 35 | 36 | - From your browser access `http://:8080` 37 | 38 | - You will be prompted to provide a default admin password 39 | 40 | - Retrieve it from your server by running `sudo cat /var/lib/jenkins/secrets/initialAdminPassword` 41 | 42 | ![project9](./images/3.png) 43 | 44 | - Then you will be asked which plugings to install – choose suggested plugins. 45 | 46 | ![project9](./images/4.png) 47 | 48 | ![project9](./images/5.png) 49 | 50 | - Once plugins installation is done – create an admin user and you will get your Jenkins server address. 51 | 52 | ![project9](./images/6.png) 53 | 54 | > **The installation is completed!** 55 | 56 | #### Step 2 – Configure Jenkins to retrieve source codes from GitHub using Webhooks 57 | 58 | > In this part, you will learn how to configure a simple Jenkins job/project (these two terms can be used interchangeably). This job will will be triggered by GitHub webhooks and will execute a `build` task to retrieve codes from GitHub and store it locally on Jenkins server. 59 | 60 | - Enable webhooks in your GitHub repository settings 61 | 62 | ![project9](./images/15.png) 63 | 64 | - Go to Jenkins web console, click "New Item" and create a "Freestyle project" 65 | 66 | - To connect your GitHub repository, you will need to provide its URL, you can copy from the repository itself 67 | 68 | - In configuration of your Jenkins freestyle project choose Git repository, provide there the link to your Tooling GitHub repository and credentials (user/password) so Jenkins could access files in the repository. 69 | 70 | ![project9](./images/7.png) 71 | 72 | - Save the configuration and let us try to run the build. For now we can only do it manually. 73 | 74 | - Click "Build Now" button, if you have configured everything correctly, the build will be successfull and you will see it under `#1` 75 | 76 | - You can open the build and check in `Console Output` if it has run successfully. 77 | 78 | ![project9](./images/8.png) 79 | 80 | - If so – congratulations! You have just made your very first Jenkins build! 81 | 82 | > But this build does not produce anything and it runs only when we trigger it manually. **Let us fix it**. 83 | 84 | - Click `Configure` your job/project and add these two configurations 85 | 86 | **Configure triggering the job from GitHub webhook:** 87 | 88 | > Now, go ahead and make some change in any file in your GitHub repository (e.g. README.MD file) and push the changes to the master branch. 89 | > You will see that a new build has been launched automatically (by webhook) and you can see its results – artifacts, saved on Jenkins server. 90 | > You have now configured an automated Jenkins job that receives files from GitHub by webhook trigger (this method is considered as ‘push’ because the changes are being ‘pushed’ and files transfer is initiated by GitHub). There are also other methods: trigger one job (downstreadm) from another (upstream), poll GitHub periodically and others. 91 | 92 | ![project9](./images/9.png) 93 | 94 | > By default, the artifacts are stored on Jenkins server locally `ls /var/lib/jenkins/jobs/tooling_github/builds//archive/` 95 | 96 | ### CONFIGURE JENKINS TO COPY FILES TO NFS SERVER VIA SSH 97 | 98 | #### Step 3 – Configure Jenkins to copy files to NFS server via SSH 99 | 100 | - Now we have our artifacts saved locally on Jenkins server, the next step is to copy them to our NFS server to `/mnt/apps` directory. 101 | 102 | > Jenkins is a highly extendable application and there are 1400+ plugins available. We will need a plugin that is called "Publish Over SSH". 103 | 104 | - Install `Publish Over SSH` plugin. 105 | 106 | - On main dashboard select `Manage Jenkins` and choose `Manage Plugins` menu item. 107 | 108 | - On `Available` tab search for `Publish Over SSH` plugin and install it 109 | 110 | - Configure the job/project to copy artifacts over to NFS server. 111 | 112 | - On main dashboard select `Manage Jenkins` and choose `Configure System` menu item. 113 | 114 | - Scroll down to Publish over SSH plugin configuration section and configure it to be able to connect to your NFS server: 115 | 116 | - Provide a private key (content of .pem file that you use to connect to NFS server via SSH/Putty) 117 | - Arbitrary name 118 | - Hostname – can be private IP address of your NFS server 119 | - Username – ec2-user (since NFS server is based on EC2 with RHEL 8) 120 | - Remote directory – `/mnt/apps`since our Web Servers use it as a mointing point to retrieve files from the NFS server Test the configuration and make sure the connection returns `Success`. Remember, that `TCP port 22` on NFS server must be open to receive SSH connections. 121 | 122 | ![project9](./images/10.png) 123 | 124 | - Save the configuration, open your Jenkins job/project configuration page and add another one "Post-build Action" 125 | 126 | - Configure it to send all files probuced by the build into our previously define remote directory. In our case we want to copy all files and directories – so we use `\*\*`. If you want to apply some particular pattern to define which files to send – [use this syntax](http://ant.apache.org/manual/dirtasks.html#patterns). 127 | 128 | ![project9](./images/11.png) 129 | 130 | - Save this configuration and go ahead, change something in `README.MD` file in your GitHub Tooling repository. 131 | 132 | - Webhook will trigger a new job and in the `Console Output` of the job you will find something like this: 133 | 134 | ```bash 135 | SSH: Transferred 25 file(s) 136 | Finished: SUCCESS 137 | ``` 138 | 139 | ![project9](./images/12.png) 140 | 141 | ![project9](./images/13.png) 142 | 143 | > To make sure that the files in `/mnt/apps` have been udated – connect via SSH/Putty to your NFS server and check README.MD file 144 | > `cat /mnt/apps/README.md` 145 | 146 | > If you see the changes you had previously made in your GitHub – the job works as expected. 147 | 148 | **Congratulations** 149 | -------------------------------------------------------------------------------- /Project 7/readme.md: -------------------------------------------------------------------------------- 1 | # PROJECT 7 - DEVOPS TOOLING WEBSITE SOLUTION 2 | 3 | In this project you will implement a solution that consists of the following components: 4 | 5 | - Infrastructure: AWS 6 | 7 | - Webserver Linux: Red Hat Enterprise Linux 8 8 | 9 | - Database Server: Ubuntu 20.04 + MySQL 10 | 11 | - Storage Server: Red Hat Enterprise Linux 8 + NFS Server 12 | 13 | - Programming Language: PHP 14 | 15 | - Code Repository: GitHub 16 | 17 | ## STEP 1 – PREPARE NFS SERVER 18 | 19 | - Spin up a new EC2 instance with RHEL Linux 8 Operating System. 20 | 21 | > - Based on your LVM experience from `Project 6`, Configure LVM on the Server. 22 | 23 | > - Instead of formatting the disks as `ext4` you will have to format them as `xfs` 24 | 25 | > - Ensure there are 3 Logical Volumes. `lv-opt`, `lv-apps`, and `lv-logs` 26 | 27 | > - Create mount points on /mnt directory for the logical volumes as follow: 28 | 29 | > - Mount `lv-apps` on `/mnt/apps` – To be used by webservers 30 | 31 | > - Mount `lv-logs` on `/mnt/logs` – To be used by webserver logs 32 | 33 | > - Mount `lv-opt` on `/mnt/opt` – To be used by Jenkins server in Project 8 34 | 35 | ![project7](./images/1.png) 36 | 37 | ![project7](./images/2.png) 38 | 39 | ![project7](./images/3.png) 40 | 41 | ![project7](./images/4.png) 42 | 43 | ![project7](./images/5.png) 44 | 45 | - Install NFS server, configure it to start on reboot, and make sure it is up and running 46 | 47 | ```bash 48 | sudo yum -y update 49 | sudo yum install nfs-utils -y 50 | sudo systemctl start nfs-server.service 51 | sudo systemctl enable nfs-server.service 52 | sudo systemctl status nfs-server.service 53 | ``` 54 | 55 | ![project7](./images/6.png) 56 | 57 | - Export the mounts for webservers’ subnet cidr to connect as clients. For simplicity, you will install your all three Web Servers inside the same subnet, but in production set up you would probably want to separate each tier inside its own subnet for higher level of security. 58 | 59 | - To check your subnet cidr – open your EC2 details in AWS web console and locate `Networking` tab and open a Subnet link: 60 | 61 | - Make sure we set up permission that will allow our Web servers to read, write and execute files on NFS: 62 | 63 | ```bash 64 | sudo chown -R nobody: /mnt/apps 65 | sudo chown -R nobody: /mnt/logs 66 | sudo chown -R nobody: /mnt/opt 67 | 68 | sudo chmod -R 777 /mnt/apps 69 | sudo chmod -R 777 /mnt/logs 70 | sudo chmod -R 777 /mnt/opt 71 | 72 | sudo systemctl restart nfs-server.service 73 | ``` 74 | 75 | ![project7](./images/7.png) 76 | 77 | - Configure access to NFS for clients within the same subnet (example of Subnet CIDR – 172.31.32.0/20): 78 | 79 | - Open `/etc/exports` file with `sudo vi /etc/exports` and paste this into it. 80 | 81 | ```config 82 | /mnt/apps (rw,sync,no_all_squash,no_root_squash) 83 | /mnt/logs (rw,sync,no_all_squash,no_root_squash) 84 | /mnt/opt (rw,sync,no_all_squash,no_root_squash) 85 | ``` 86 | 87 | - run `sudo exportfs -arv` 88 | 89 | - Check which port is used by NFS and open it using Security Groups (add new Inbound Rule) by running `rpcinfo -p | grep nfs` 90 | 91 | > _Important note:_ In order for NFS server to be accessible from your client, you must also open following ports: TCP 111, UDP 111, UDP 2049 92 | 93 | ![project7](./images/8.png) 94 | 95 | ## STEP 2 — CONFIGURE THE DATABASE SERVER 96 | 97 | > I won't repeat this section of the documentatio as I have done it in previous projects but images are provided 98 | 99 | - Install MySQL server 100 | 101 | - Create a database and name it `tooling` 102 | 103 | - Create a database user and name it `webaccess` 104 | 105 | - Grant permission to `webaccessuser` on `tooling` database to do anything only from the `webservers subnet cidr` 106 | 107 | ![project7](./images/9.png) 108 | 109 | ![project7](./images/10.png) 110 | 111 | ![project7](./images/11.png) 112 | 113 | ## STEP 3 — PREPARE THE WEB SERVERS 114 | 115 | > We need to make sure that our Web Servers can serve the same content from shared storage solutions, in our case – `NFS Server` and `MySQL database`. 116 | 117 | > You already know that one DB can be accessed for `reads` and `writes` by multiple clients. For storing shared files that our Web Servers will use – we will utilize NFS and mount previously created Logical Volume lv-apps to the folder where Apache stores files to be served to the users `(/var/www)`. 118 | 119 | > This approach will make our Web Servers `stateless`, which means we will be able to add new ones or remove them whenever we need, and the integrity of the data (in the database and on NFS) will be preserved. 120 | 121 | - **During the next steps we will do following:** 122 | 123 | > - Configure NFS client (this step must be done on all three servers) 124 | 125 | > - Deploy a Tooling application to our Web Servers into a shared NFS folder 126 | 127 | > - Configure the Web Servers to work with a single MySQL database 128 | 129 | 1. Launch a new EC2 instance with RHEL 8 Operating System 130 | 131 | 2. Install NFS client `sudo yum install nfs-utils nfs4-acl-tools -y` 132 | 133 | 3. Mount `/var/www/` and target the NFS server’s export for apps 134 | 135 | ```bash 136 | sudo mkdir /var/www 137 | sudo mount -t nfs -o rw,nosuid :/mnt/apps /var/www 138 | ``` 139 | 140 | 4. Verify that NFS was mounted successfully by running df -h. To make sure that the changes will persist on Web Server after reboot in `sudo vi /etc/fstab` file add following line `:/mnt/apps /var/www nfs defaults 0 0` 141 | 142 | ![project7](./images/12.png) 143 | 144 | 5. Install Remi’s repository, Apache and PHP 145 | 146 | ```bash 147 | sudo yum install httpd -y 148 | 149 | sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm 150 | 151 | sudo dnf install dnf-utils http://rpms.remirepo.net/enterprise/remi-release-8.rpm 152 | 153 | sudo dnf module reset php 154 | 155 | sudo dnf module enable php:remi-7.4 156 | 157 | sudo dnf install php php-opcache php-gd php-curl php-mysqlnd 158 | 159 | sudo systemctl start php-fpm 160 | 161 | sudo systemctl enable php-fpm 162 | 163 | setsebool -P httpd_execmem 1 164 | ``` 165 | 166 | ![project7](./images/13.png) 167 | 168 | > Repeat steps 1-5 for another 2 Web Servers. 169 | 170 | ![project7](./images/14.png) 171 | 172 | ![project7](./images/15.png) 173 | 174 | 6. Verify that Apache files and directories are available on the Web Server in `/var/www` and also on the NFS server in `/mnt/apps`. If you see the same files – it means NFS is mounted correctly. You can try to create a new file `touch test.txt` from one server and check if the same file is accessible from other Web Servers. 175 | 176 | 7. Locate the log folder for Apache on the Web Server and mount it to NFS server’s export for logs. Repeat step №4 to make sure the mount point will persist after reboot. 177 | 178 | 8. Fork the tooling source code from Darey.io Github Account to your Github account. [(Learn how to fork a repo here)](https://github.com/darey-io/tooling.git) 179 | 180 | 9. Deploy the tooling website’s code to the Webserver. Ensure that the html folder from the repository is deployed to `/var/www/html` 181 | 182 | ![project7](./images/17.png) 183 | 184 | > - **Note 1:** Do not forget to open TCP port 80 on the Web Server. 185 | > - **Note 2:** If you encounter 403 Error – check permissions to your `/var/www/html` folder and also disable SELinux `sudo setenforce 0` 186 | > To make this change permanent – open following config file `sudo vi /etc/sysconfig/selinux` and set `SELINUX=disabled`then restrt httpd. 187 | 188 | ![project7](./images/18.png) 189 | 190 | ![project7](./images/19.png) 191 | 192 | ![project7](./images/20.png) 193 | 194 | ![project7](./images/21.png) 195 | 196 | 10. Update the website’s configuration to connect to the database (in `/var/www/html/functions.php` file). Apply `tooling-db.sql` script to your database using this command 197 | 198 | `mysql -h -u -p < tooling-db.sql` 199 | 200 | ![project7](./images/22.png) 201 | 202 | 11. Create in MySQL a new admin user in the `USER TABLE` with username: `myuser` and password: `password` 203 | 204 | ```sql 205 | INSERT INTO ‘users’ (‘id’, ‘username’, ‘password’, ’email’, ‘user_type’, ‘status’) VALUES (1, ‘myuser’, ‘password’, ‘user@mail.com’, ‘admin’, ‘1’); 206 | ``` 207 | 208 | ![project7](./images/23.png) 209 | 210 | ![project7](./images/29.png) 211 | 212 | 12. Open the website in your browser `http:///index.php` and make sure you can login into the websute with myuser user. 213 | 214 | ![project7](./images/28.png) 215 | 216 | **Congratulations!** 217 | 218 | _You have just implemented a web solution for a DevOps team using LAMP stack with remote Database and NFS servers._ 219 | -------------------------------------------------------------------------------- /Project 4/readme.md: -------------------------------------------------------------------------------- 1 | # PROJECT 4 - MEAN STACK DEPLOYMENT TO UBUNTU IN AWS 2 | 3 | ## INITIAL SETUP 4 | 5 | - Setup AWS EC2 instance 6 | - Connect to it via CLI 7 | ![project4](./images/1.png) 8 | - run : 9 | 10 | ```bash 11 | sudo apt update && sudo apt upgrade 12 | ``` 13 | 14 | ![project4](./images/2.png) 15 | 16 | - Add certificates 17 | 18 | ```bash 19 | sudo apt -y install curl dirmngr apt-transport-https lsb-release ca-certificates 20 | ``` 21 | 22 | ![project4](./images/4.png) 23 | 24 | - Install Node.js 25 | 26 | ```bash 27 | curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash - 28 | sudo apt install -y nodejs 29 | ``` 30 | 31 | ![project4](./images/5.png) 32 | 33 | ## INSTALL MONGODB 34 | 35 | ### OPTION 1 - I didn't use this 36 | 37 | - run the following commands 38 | 39 | ```bash 40 | # Apt-key is deprecated on ubuntu 22 41 | sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6 42 | 43 | echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list 44 | 45 | sudo apt install -y mongodb 46 | 47 | # Start The server 48 | 49 | sudo service mongodb start 50 | 51 | # Verify that the service is up and running 52 | 53 | sudo systemctl status mongodb 54 | ``` 55 | 56 | ### OPTION 2 57 | 58 | - Install the required packages 59 | 60 | ```bash 61 | sudo apt install wget curl gnupg2 software-properties-common apt-transport-https ca-certificates lsb-release 62 | ``` 63 | ![project4](./images/7.png) 64 | 65 | - Run the following command to import the MongoDB public GPG Key: 66 | 67 | ```bash 68 | curl -fsSL https://www.mongodb.org/static/pgp/server-6.0.asc|sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/mongodb-6.gpg 69 | ``` 70 | 71 | ![project4](./images/8.png) 72 | 73 | - Using the following commands, add the mongodb repository to your system right away: 74 | 75 | ```bash 76 | echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list 77 | ``` 78 | 79 | - Once the appropriate repository has been added, use the following command to install MongoDB 6.0 on Ubuntu. 80 | 81 | ```bash 82 | wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2.16_amd64.deb sudo dpkg -i ./libssl1.1_1.1.1f-1ubuntu2.16_amd64.deb sudo apt update sudo apt install mongodb-org 83 | ``` 84 | 85 | ![project4](./images/9.png) 86 | 87 | - After installation run 88 | 89 | ```bash 90 | sudo systemctl enable --now mongod 91 | systemctl status mongod 92 | ``` 93 | ![project4](./images/10.png) 94 | 95 | ## INSTALL EXPRESS AND SET UP ROUTES TO THE SERVER 96 | 97 | - run `mkdir Books && cd Books` 98 | - run `npm init` 99 | - Install body-parser package. We need ‘body-parser’ package to help us process JSON files passed in requests to the server.\ 100 | `sudo npm install body-parser` 101 | 102 | ![project4](./images/11.png) 103 | 104 | - run `sudo npm install express mongoose` 105 | - In `Books` folder, create a folder named `apps` \ 106 | `mkdir apps && cd apps` 107 | 108 | ![project4](./images/13.png) 109 | 110 | ![project4](./images/12.png) 111 | 112 | - Create a file named `routes.js` and pasted the following code in it 113 | 114 | ```javascript 115 | var Book = require("./models/book"); 116 | module.exports = function (app) { 117 | app.get("/book", function (req, res) { 118 | Book.find({}, function (err, result) { 119 | if (err) throw err; 120 | res.json(result); 121 | }); 122 | }); 123 | app.post("/book", function (req, res) { 124 | var book = new Book({ 125 | name: req.body.name, 126 | isbn: req.body.isbn, 127 | author: req.body.author, 128 | pages: req.body.pages, 129 | }); 130 | book.save(function (err, result) { 131 | if (err) throw err; 132 | res.json({ 133 | message: "Successfully added book", 134 | book: result, 135 | }); 136 | }); 137 | }); 138 | app.delete("/book/:isbn", function (req, res) { 139 | Book.findOneAndRemove(req.query, function (err, result) { 140 | if (err) throw err; 141 | res.json({ 142 | message: "Successfully deleted the book", 143 | book: result, 144 | }); 145 | }); 146 | }); 147 | var path = require("path"); 148 | app.get("*", function (req, res) { 149 | res.sendfile(path.join(__dirname + "/public", "index.html")); 150 | }); 151 | }; 152 | ``` 153 | 154 | - In the `apps` folder, create a folder named `models` 155 | - Create a file named `book.js` 156 | - Paste this code below into `book.js` 157 | 158 | 159 | 160 | ```javascript 161 | var mongoose = require("mongoose"); 162 | var dbHost = "mongodb://localhost:27017/test"; 163 | mongoose.connect(dbHost); 164 | mongoose.connection; 165 | mongoose.set("debug", true); 166 | var bookSchema = mongoose.Schema({ 167 | name: String, 168 | isbn: { type: String, index: true }, 169 | author: String, 170 | pages: Number, 171 | }); 172 | var Book = mongoose.model("Book", bookSchema); 173 | module.exports = mongoose.model("Book", bookSchema); 174 | ``` 175 | 176 | ### ACCESS THE ROUTES WITH ANGULARJS 177 | 178 | 179 | - Change the directory back to `Books` 180 | - Create a folder named `public` 181 | - Add a file named `script.js` 182 | - Copy and paste the Code below (controller configuration defined) into the script.js file. 183 | 184 | ```javascript 185 | var app = angular.module("myApp", []); 186 | app.controller("myCtrl", function ($scope, $http) { 187 | $http({ 188 | method: "GET", 189 | url: "/book", 190 | }).then( 191 | function successCallback(response) { 192 | $scope.books = response.data; 193 | }, 194 | function errorCallback(response) { 195 | console.log("Error: " + response); 196 | } 197 | ); 198 | $scope.del_book = function (book) { 199 | $http({ 200 | method: "DELETE", 201 | url: "/book/:isbn", 202 | params: { isbn: book.isbn }, 203 | }).then( 204 | function successCallback(response) { 205 | console.log(response); 206 | }, 207 | function errorCallback(response) { 208 | console.log("Error: " + response); 209 | } 210 | ); 211 | }; 212 | $scope.add_book = function () { 213 | var body = 214 | '{ "name": "' + 215 | $scope.Name + 216 | '", "isbn": "' + 217 | $scope.Isbn + 218 | '", "author": "' + 219 | $scope.Author + 220 | '", "pages": "' + 221 | $scope.Pages + 222 | '" }'; 223 | $http({ 224 | method: "POST", 225 | url: "/book", 226 | data: body, 227 | }).then( 228 | function successCallback(response) { 229 | console.log(response); 230 | }, 231 | function errorCallback(response) { 232 | console.log("Error: " + response); 233 | } 234 | ); 235 | }; 236 | }); 237 | ``` 238 | 239 | - In `public` folder, create a file named `index.html` 240 | - Cpoy and paste the code below into the file 241 | 242 | ```html 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 |
251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 |
Name:
Isbn:
Author:
Pages:
269 | 270 |
271 |
272 |
273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 293 | 294 |
NameIsbnAuthorPages
{{book.name}}{{book.isbn}}{{book.author}}{{book.pages}} 287 | 292 |
295 |
296 | 297 | 298 | ``` 299 | 300 | ### Conclusion 301 | 302 | In the root folder run the command `node server.js` and head over the browser to see the app using the url ` http://:3300` 303 | 304 | ![project4](./images/14.png) 305 | ![project4](./images/15.png) 306 | -------------------------------------------------------------------------------- /Project 13/readme.md: -------------------------------------------------------------------------------- 1 | # PROJECT 13 - ANSIBLE DYNAMIC ASSIGNMENTS (INCLUDE) AND COMMUNITY ROLES 2 | 3 | ## INTRODUCING DYNAMIC ASSIGNMENT INTO OUR STRUCTURE 4 | 5 | - In your `https://github.com//ansible-config-mgt` GitHub repository start a new branch and call it `dynamic-assignments`. 6 | 7 | - Create a new folder, name it dynamic-assignments. Then inside this folder, create a new file and name it env-vars.yml. We will instruct site.yml to include this playbook later. For now, let us keep building up the structure. 8 | 9 | Your GitHub shall have following structure by now. 10 | 11 | > Note: Depending on what method you used in the previous project you may have or not have roles folder in your GitHub repository – if you used `ansible-galaxy`, then roles directory was only created on your `Jenkins-Ansible` server locally. It is recommended to have all the codes managed and tracked in GitHub, so you might want to recreate this structure manually in this case – it is up to you. 12 | 13 | ```pre 14 | ├── dynamic-assignments 15 | │ └── env-vars.yml 16 | ├── inventory 17 | │ └── dev 18 | └── stage 19 | └── uat 20 | └── prod 21 | └── playbooks 22 | └── site.yml 23 | └── roles (optional folder) 24 | └──...(optional subfolders & files) 25 | └── static-assignments 26 | └── common.yml 27 | ``` 28 | 29 | Since we will be using the same Ansible to configure multiple environments, and each of these environments will have certain unique attributes, such as servername, ip-address etc., we will need a way to set values to variables per specific environment. 30 | 31 | For this reason, we will now create a folder to keep each environment’s variables file. Therefore, create a new folder env-vars, then for each environment, create new YAML files which we will use to set variables. 32 | 33 | _Your layout should now look like this._ 34 | 35 | ```pre 36 | ├── dynamic-assignments 37 | │ └── env-vars.yml 38 | ├── env-vars 39 | └── dev.yml 40 | └── stage.yml 41 | └── uat.yml 42 | └── prod.yml 43 | ├── inventory 44 | └── dev 45 | └── stage 46 | └── uat 47 | └── prod 48 | ├── playbooks 49 | └── site.yml 50 | └── static-assignments 51 | └── common.yml 52 | └── webservers.yml 53 | ``` 54 | 55 | - Now paste the instruction below into the env-vars.yml file. 56 | 57 | ```yaml 58 | --- 59 | - name: collate variables from env specific file, if it exists 60 | hosts: all 61 | tasks: 62 | - name: looping through list of available files 63 | include_vars: "{{ item }}" 64 | with_first_found: 65 | - files: 66 | - dev.yml 67 | - stage.yml 68 | - prod.yml 69 | - uat.yml 70 | paths: 71 | - "{{ playbook_dir }}/../env-vars" 72 | tags: 73 | - always 74 | ``` 75 | 76 | ![project13](./images/1.png) 77 | 78 | Notice 3 things to notice here: 79 | 80 | - We used `include_vars` syntax instead of `include`, this is because Ansible developers decided to separate different features of the module. From `Ansible version 2.8`, the `include` module is deprecated and variants of `include_*` must be used. These are: 81 | - - include_role 82 | - - include_tasks 83 | - - include_vars 84 | 85 | - In the same version, variants of import were also introduces, such as: 86 | 87 | - - import_role 88 | - - import_tasks 89 | 90 | > We made use of a special variables `{ playbook_dir }` and `{ inventory_file }`. `{ playbook_dir }` will help Ansible to determine the location of the running playbook, and from there navigate to other path on the filesystem. `{ inventory_file }` on the other hand will dynamically resolve to the name of the inventory file being used, then append `.yml `so that it picks up the required file within the `env-vars` folder. 91 | 92 | > We are including the variables using a loop. `with_first_found` implies that, looping through the list of files, the first one found is used. This is good so that we can always set default values in case an environment specific env file does not exist. 93 | 94 | ## UPDATE SITE.YML WITH DYNAMIC ASSIGNMENTS 95 | 96 | > Update `site.yml` file to make use of the dynamic assignment. (At this point, we cannot test it yet. We are just setting the stage for what is yet to come. So hang on to your hats) 97 | 98 | _site.yml should now look like this._ 99 | 100 | ```yaml 101 | --- 102 | - hosts: all 103 | - name: Include dynamic variables 104 | tasks: 105 | import_playbook: ../static-assignments/common.yml 106 | include: ../dynamic-assignments/env-vars.yml 107 | tags: 108 | - always 109 | 110 | - hosts: webservers 111 | - name: Webserver assignment 112 | import_playbook: ../static-assignments/webservers.yml 113 | ``` 114 | 115 | ## COMMUNITY ROLES 116 | 117 | > Now it is time to create a role for MySQL database – it should install the MySQL package, create a database and configure users. But why should we re-invent the wheel? There are tons of roles that have already been developed by other open source engineers out there. These roles are actually production ready, and dynamic to accomodate most of Linux flavours. With Ansible Galaxy again, we can simply download a ready to use ansible role, and keep going. 118 | 119 | ### DOWNLOAD MYSQL ANSIBLE ROLE 120 | 121 | We will be using a MySQL role developed by geerlingguy. 122 | 123 | > Hint: To preserve your your GitHub in actual state after you install a new role – make a commit and push to master your `‘ansible-config-mgt’` directory. Of course you must have git installed and configured on `Jenkins-Ansible` server and, for more convenient work with codes, you can configure Visual Studio Code to work with this directory. In this case, you will no longer need webhook and Jenkins jobs to update your codes on Jenkins-Ansible server, so you can disable it – we will be using Jenkins later for a better purpose. 124 | 125 | - On Jenkins-Ansible server make sure that git is installed with `git --version`, then go to ‘`ansible-config-mgt`’ directory and run 126 | 127 | ```sudo 128 | git init 129 | git pull https://github.com//ansible-config-mgt.git 130 | git remote add origin https://github.com//ansible-config-mgt.git 131 | git branch roles-feature 132 | git switch roles-feature 133 | ``` 134 | 135 | - Inside roles directory create your new MySQL role with `ansible-galaxy install geerlingguy.mysql` and rename the folder to mysql `mv geerlingguy.mysql/ mysql` 136 | 137 | ![project13](./images/2.png) 138 | 139 | > Read README.md file, and edit roles configuration to use correct credentials for MySQL required for the tooling website. 140 | 141 | - Now it is time to upload the changes into your GitHub: 142 | 143 | ```bash 144 | git add . 145 | git commit -m "Commit new role files into GitHub" 146 | git push --set-upstream origin roles-feature 147 | ``` 148 | 149 | - Now, if you are satisfied with your codes, you can create a Pull Request and merge it to main branch on GitHub. 150 | 151 | ## LOAD BALANCER ROLES 152 | 153 | We want to be able to choose which Load Balancer to use, Nginx or Apache, so we need to have two roles respectively: 154 | 155 | - Nginx 156 | - Apache 157 | 158 | With your experience on Ansible so far you can: 159 | 160 | - Decide if you want to develop your own roles, or find available ones from the community 161 | - Update both static-assignment and site.yml files to refer the roles 162 | 163 | ![project13](./images/3.png) 164 | 165 | ![project13](./images/4.png) 166 | 167 | ![project13](./images/5.png) 168 | 169 | > Important Hints: 170 | > 171 | > Since you cannot use both Nginx and Apache load balancer, you need to add a condition to enable either one – this is where you can make use of variables. 172 | 173 | - Declare a variable in `defaults/main.yml` file inside the `Nginx` and `Apache roles`. Name each variables `enable_nginx_lb` and `enable_apache_lb` respectively. 174 | 175 | - Set both values to `false` like this `enable_nginx_lb: false` and `enable_apache_lb: false`. 176 | 177 | - Declare another variable in both roles `load_balancer_is_required` and set its value to `false` as well 178 | 179 | - Update both assignment and site.yml files respectively 180 | 181 | - loadbalancers.yml file 182 | 183 | ```yaml 184 | - hosts: lb 185 | roles: 186 | - { role: nginx, when: enable_nginx_lb and load_balancer_is_required } 187 | - { role: apache, when: enable_apache_lb and load_balancer_is_required } 188 | ``` 189 | 190 | - site.yml file 191 | 192 | ```yaml 193 | - name: Loadbalancers assignment 194 | hosts: lb 195 | - import_playbook: ../static-assignments/loadbalancers.yml 196 | when: load_balancer_is_required 197 | ``` 198 | 199 | - Now you can make use of `env-vars\uat.yml` file to define which loadbalancer to use in UAT environment by setting respective environmental variable to true. 200 | 201 | - You will activate load balancer, and enable nginx by setting these in the respective environment’s env-vars file. 202 | 203 | ```txt 204 | enable_nginx_lb: true 205 | load_balancer_is_required: true 206 | ``` 207 | 208 | The same must work with apache LB, so you can switch it by setting respective environmental variable to true and other to false. 209 | 210 | To test this, you can update inventory for each environment and run Ansible against each environment. 211 | 212 | > The server throwing error was not running. 213 | 214 | ![project13](./images/7.png) 215 | 216 | ![project13](./images/8.png) 217 | -------------------------------------------------------------------------------- /Project 6/readme.md: -------------------------------------------------------------------------------- 1 | # PROJECT 6 - WEB SOLUTION WITH WORDPRESS 2 | 3 | - Setup 2 ec2 instances (web and db server) 4 | 5 | - Create 3 volumes and attach to the webserver instance. 6 | 7 | ![project6](./images/2.png) 8 | 9 | ![project6](./images/3.png) 10 | 11 | ![project6](./images/4.png) 12 | 13 | - Connnect to the instance 14 | 15 | ![project6](./images/1.png) 16 | 17 | - Use `lsblk` command to inspect what block devices are attached to the server. Notice names of your newly created devices. All devices in Linux reside in `/dev/` directory. Inspect it with `ls /dev/` and make sure you see all 3 newly created block devices there – their names will likely be `xvdf`, `xvdh`, `xvdg` 18 | 19 | ![project6](./images/10.png) 20 | 21 | - Use `df -h` command to see all mounts and free space on your server 22 | 23 | ![project6](./images/5.png) 24 | 25 | - Use gdisk to create partition on each of the disks 26 | 27 | `sudo gdisk /dev/xvdf` 28 | 29 | > See image for futher commands 30 | 31 | ![project6](./images/9.png) 32 | 33 | ![project6](./images/10.png) 34 | 35 | - Run `sudo yum install lvm2` to install `lvm2` used to check for available partitions. 36 | 37 | ![project6](./images/8.png) 38 | 39 | - Run `sudo lvmdiskscan` command to check for available partitions. 40 | 41 | ![project6](./images/7.png) 42 | 43 | - Use `pvcreate` utility to mark each of 3 disks as physical volumes (PVs) to be used by LVM 44 | 45 | ```bash 46 | sudo pvcreate /dev/xvdf1 47 | sudo pvcreate /dev/xvdg1 48 | sudo pvcreate /dev/xvdh1 49 | ``` 50 | 51 | ![project6](./images/11.png) 52 | 53 | - Verify that your Physical volume has been created successfully by running 54 | 55 | `sudo pvs` 56 | 57 | ![project6](./images/12.png) 58 | 59 | - Use `vgcreate` utility to add all 3 PVs to a volume group (VG). Name the VG 60 | 61 | `webdata-vg` 62 | 63 | `sudo vgcreate webdata-vg /dev/xvdh1 /dev/xvdg1 /dev/xvdf1` 64 | 65 | - Verify that your VG has been created successfully by running 66 | 67 | `sudo vgs` 68 | 69 | - Use `lvcreate` utility to create 2 logical volumes. `apps-lv` (Use half of the PV size), and `logs-lv` Use the remaining space of the PV size. **NOTE:** `apps-lv` will be used to store data for the Website while, `logs-lv` will be used to store data for logs. 70 | 71 | ```bash 72 | sudo lvcreate -n apps-lv -L 14G webdata-vg 73 | sudo lvcreate -n logs-lv -L 14G webdata-vg 74 | ``` 75 | 76 | - Verify that your Logical Volume has been created successfully by running 77 | 78 | `sudo lvs` 79 | 80 | - Verify the entire setup 81 | 82 | ```bash 83 | sudo vgdisplay -v #view complete setup - VG, PV, and LV 84 | sudo lsblk 85 | ``` 86 | 87 | ![project6](./images/13.png) 88 | 89 | ![project6](./images/14.png) 90 | 91 | ![project6](./images/15.png) 92 | 93 | - Use `mkfs.ext4to` format the logical volumes with `ext4` filesystem 94 | 95 | ```bash 96 | sudo mkfs -t ext4 /dev/webdata-vg/apps-lv 97 | sudo mkfs -t ext4 /dev/webdata-vg/logs-lv 98 | ``` 99 | 100 | ![project6](./images/16.png) 101 | 102 | - Create `/var/www/html` directory to store website files 103 | 104 | `sudo mkdir -p /var/www/html` 105 | 106 | - Create `/home/recovery/logs` to store backup of log data 107 | 108 | `sudo mkdir -p /home/recovery/logs` 109 | 110 | ![project6](./images/17.png) 111 | 112 | - Mount `/var/www/html` on apps-lv logical volume 113 | 114 | `sudo mount /dev/webdata-vg/apps-lv /var/www/html/` 115 | 116 | - Use rsync utility to backup all the files in the log directory `/var/log` into `/home/recovery/logs` _(This is required before mounting the file system)_ 117 | 118 | `sudo rsync -av /var/log/. /home/recovery/logs/` 119 | 120 | - Mount `/var/log` on `logs-lv` logical volume. _(Note that all the existing data on /var/log will be deleted. That is why step 15 above is very important)_ 121 | 122 | `sudo mount /dev/webdata-vg/logs-lv /var/log` 123 | 124 | - Restore log files back into `/var/log` directory 125 | 126 | `sudo rsync -av /home/recovery/logs/. /var/log` 127 | 128 | ![project6](./images/18.png) 129 | 130 | - Update `/etc/fstab` file so that the mount configuration will persist after restart of the server. 131 | 132 | --- 133 | 134 | ## UPDATE THE `/ETC/FSTAB` FILE 135 | 136 | - Get the UUID of the device which will be used to update the `/etc/fstab` File 137 | 138 | `sudo blkid` 139 | 140 | ![project6](./images/19.png) 141 | 142 | - Copy the uuid of the logical volumes 143 | 144 | ![project6](./images/20.png) 145 | 146 | - Open the `/etc/fstab` file and paste in this 147 | 148 | ```config 149 | UUID= /var/www/html ext4 defaults 0 0 150 | UUID= /var/log ext4 defaults 0 0 151 | ``` 152 | 153 | ![project6](./images/24.png) 154 | 155 | - Test the configuration and reload the daemon 156 | 157 | ```bash 158 | sudo mount -a 159 | sudo systemctl daemon-reload 160 | ``` 161 | 162 | - Verify your setup by running `df -h` 163 | 164 | ![project6](./images/21.png) 165 | 166 | --- 167 | 168 | ## SETUP DB SERVER 169 | 170 | - Launch a second RedHat EC2 instance that will have a role – ‘DB Server’ 171 | 172 | ![project6](./images/22.png) 173 | 174 | ![project6](./images/23.png) 175 | 176 | > Repeat the same steps as for the Web Server, but instead of `apps-lv` create `db-lv` and mount it to `/db` directory instead of `/var/www/html/` 177 | 178 | - To view all commands, watch this video 179 | 180 | [Video of Full DB Server Setup Command - _(Same setup as the web server)_](https://drive.google.com/file/d/1XYcZ6O8h2iYEzrzVrXO0FfgqYoaRhzET/view?usp=sharing) 181 | 182 | ![project6](./images/25.png) 183 | 184 | --- 185 | 186 | ## INSTALL WORDPRESS ON YOUR WEB SERVER EC2 187 | 188 | - Update the repository 189 | 190 | `sudo yum -y update` 191 | 192 | ![project6](./images/26.png) 193 | 194 | - Install wget, Apache and it’s dependencies 195 | 196 | `sudo yum -y install wget httpd php php-mysqlnd php-fpm php-json` 197 | 198 | ![project6](./images/27.png) 199 | 200 | - Start Apache 201 | 202 | ```bash 203 | sudo systemctl enable httpd 204 | sudo systemctl start httpd 205 | ``` 206 | 207 | ![project6](./images/28.png) 208 | 209 | - To install PHP and it’s depemdencies 210 | 211 | ```bash 212 | sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm 213 | sudo yum install yum-utils http://rpms.remirepo.net/enterprise/remi-release-8.rpm 214 | sudo yum module list php 215 | sudo yum module reset php 216 | sudo yum module enable php:remi-7.4 217 | sudo yum install php php-opcache php-gd php-curl php-mysqlnd 218 | sudo systemctl start php-fpm 219 | sudo systemctl enable php-fpm 220 | setsebool -P httpd_execmem 1 221 | ``` 222 | 223 | ![project6](./images/29.png) 224 | 225 | - Restart Apache 226 | 227 | `sudo systemctl restart httpd` 228 | 229 | - Download wordpress and copy wordpress to `/var/www/html` 230 | 231 | ```bash 232 | mkdir wordpress 233 | cd wordpress 234 | sudo wget http://wordpress.org/latest.tar.gz 235 | sudo tar xzvf latest.tar.gz 236 | sudo rm -rf latest.tar.gz 237 | cp wordpress/wp-config-sample.php wordpress/wp-config.php 238 | cp -R wordpress /var/www/html/ 239 | ``` 240 | 241 | ![project6](./images/30.png) 242 | 243 | ![project6](./images/31.png) 244 | 245 | ![project6](./images/32.png) 246 | 247 | - Configure SELinux Policies 248 | 249 | ```bash 250 | sudo chown -R apache:apache /var/www/html/wordpress 251 | sudo chcon -t httpd_sys_rw_content_t /var/www/html/wordpress -R 252 | sudo setsebool -P httpd_can_network_connect=1 253 | ``` 254 | 255 | ![project6](./images/33.png) 256 | 257 | ### INSTALL MYSQL ON YOUR DB SERVER EC2 258 | 259 | ```bash 260 | sudo yum update 261 | sudo yum install mysql-server 262 | ``` 263 | 264 | ![project6](./images/35.png) 265 | 266 | - Verify that the service is up and running by using `sudo systemctl status mysqld`, if it is not running, restart the service and enable it so it will be running even after reboot: 267 | 268 | ```bash 269 | sudo systemctl restart mysqld 270 | sudo systemctl enable mysqld 271 | ``` 272 | 273 | ![project6](./images/35.png) 274 | 275 | --- 276 | 277 | ## CONFIGURE DB TO WORK WITH WORDPRESS 278 | 279 | ```sql 280 | sudo mysql 281 | CREATE DATABASE wordpress; 282 | CREATE USER `myuser`@`` IDENTIFIED BY 'mypass'; 283 | GRANT ALL ON wordpress.* TO 'myuser'@''; 284 | FLUSH PRIVILEGES; 285 | SHOW DATABASES; 286 | exit 287 | ``` 288 | 289 | ![project6](./images/36.png) 290 | 291 | ## CONFIGURE WORDPRESS TO CONNECT TO REMOTE DATABASE. 292 | 293 | > Hint: Do not forget to open MySQL port 3306 on DB Server EC2. For extra security, you shall allow access to the DB server ONLY from your Web Server’s IP address, so in the Inbound Rule configuration specify source as /32 294 | 295 | ![project6](./images/37.png) 296 | 297 | ![project6](./images/38.png) 298 | 299 | - Install MySQL client and test that you can connect from your Web Server to your DB server by using mysql-client 300 | 301 | ```bash 302 | sudo yum install mysql 303 | sudo mysql -u admin -p -h 304 | ``` 305 | 306 | - Verify if you can successfully execute `SHOW DATABASES;`command and see a list of existing databases. 307 | 308 | ![project6](./images/39.png) 309 | 310 | - Change permissions and configuration so Apache could use WordPress _(I deleted the `wp-config.php` file, and generated a new one automatically from the wordpress UI after filling the required information)_ 311 | 312 | ![project6](./images/40.png) 313 | 314 | ![project6](./images/41.png) 315 | 316 | > Enable TCP port 80 in Inbound Rules configuration for your Web Server EC2 (enable from everywhere 0.0.0.0/0 or from your workstation’s IP) 317 | 318 | - Try to access from your browser the link to your WordPress http:///wordpress/ 319 | 320 | ![project6](./images/42.png) 321 | 322 | ![project6](./images/43.png) 323 | -------------------------------------------------------------------------------- /Project 11/readme.md: -------------------------------------------------------------------------------- 1 | # PROJECT 11 - ANSIBLE – AUTOMATE PROJECT 7 TO 10 2 | 3 | ## INSTALL AND CONFIGURE ANSIBLE ON EC2 INSTANCE 4 | 5 | > I had to start a new server, install and configure jenkins 6 | 7 | ![project11](./images/2.png) 8 | 9 | ![project11](./images/3.png) 10 | 11 | ![project11](./images/4.png) 12 | 13 | ![project11](./images/5.png) 14 | 15 | ![project11](./images/6.png) 16 | 17 | ![project11](./images/7.png) 18 | 19 | - Update `Name` tag on your Jenkins EC2 Instance to `Jenkins-Ansible`. We will use this server to run playbooks. 20 | 21 | - In your GitHub account create a new repository and name it ansible-config-mgt. 22 | 23 | - Instal Ansible with: 24 | 25 | `sudo apt update` 26 | 27 | ![project11](./images/1.png) 28 | 29 | `sudo apt install ansible` 30 | 31 | ![project11](./images/8.png) 32 | 33 | ![project11](./images/9.png) 34 | 35 | - Check your Ansible version by running `ansible --version` 36 | 37 | ![project11](./images/10.png) 38 | 39 | - Configure Jenkins build job to save your repository content every time you change it – this will solidify your Jenkins configuration skills acquired in `Project 9`. 40 | 41 | - Create a new Freestyle project ansible in Jenkins and point it to your ‘ansible-config-mgt’ repository. 42 | 43 | - Configure Webhook in GitHub and set webhook to trigger ansible build. 44 | 45 | - Configure a Post-build job to save all (`**`) files, like you did it in `Project 9`. 46 | 47 | ![project11](./images/11.png) 48 | 49 | ![project11](./images/12.png) 50 | 51 | ![project11](./images/13.png) 52 | 53 | ![project11](./images/14.png) 54 | 55 | ![project11](./images/15.png) 56 | 57 | - Test your setup by making some change in README.MD file in master branch and make sure that builds starts automatically and Jenkins saves the files (build artifacts) in following folder `ls /var/lib/jenkins/jobs/ansible/builds//archive/` 58 | 59 | > Note: Trigger Jenkins project execution only for /main (master) branch. 60 | 61 | - The setup will look like this: 62 | 63 | ![project11](./images/34.png) 64 | 65 | > Tip Every time you stop/start your Jenkins-Ansible server – you have to reconfigure GitHub webhook to a new IP address, in order to avoid it, it makes sense to allocate an Elastic IP to your Jenkins-Ansible server (you have done it before to your LB server in Project 10). Note that Elastic IP is free only when it is being allocated to an EC2 Instance, so do not forget to release Elastic IP once you terminate your EC2 Instance. 66 | 67 | ![project11](./images/16.png) 68 | 69 | ![project11](./images/17.png) 70 | 71 | ![project11](./images/18.png) 72 | 73 | ![project11](./images/19.png) 74 | 75 | ## PREPARE YOUR DEVELOPMENT ENVIRONMENT USING VISUAL STUDIO CODE 76 | 77 | > First part of ‘DevOps’ is ‘Dev’, which means you will require to write some codes and you shall have proper tools that will make your coding and debugging comfortable – you need an Integrated development environment (IDE) or Source-code Editor. There is a plethora of different IDEs and Source-code Editors for different languages with their own advantages and drawbacks, you can choose whichever you are comfortable with, but we recommend one free and universal editor that will fully satisfy your needs – Visual Studio Code (VSC), you can get it here. 78 | 79 | - After you have successfully installed VSC, configure it to connect to your newly created GitHub repository. 80 | 81 | - Clone down your ansible-config-mgt repo to your Jenkins-Ansible instance `git clone ` 82 | 83 | ![project11](./images/20.png) 84 | 85 | ![project11](./images/21.png) 86 | 87 | ## BEGIN ANSIBLE DEVELOPMENT 88 | 89 | - In your ansible-config-mgt GitHub repository, create a new branch that will be used for development of a new feature. 90 | 91 | > Tip: Give your branches descriptive and comprehensive names, for example, if you use Jira or Trello as a project management tool – include ticketnumber (e.g. PRJ-145) in the name of your branch and add a topic and a brief description what this branch is about – a bugfix, hotfix, feature, release (e.g. feature/prj-145-lvm) 92 | 93 | - Checkout the newly created feature branch to your local machine and start building your code and directory structure 94 | 95 | - Create a directory and name it `playbooks` – it will be used to store all your playbook files.Create a directory and name it `inventory` – it will be used to keep your hosts organised. 96 | 97 | - Within the `playbooks folder`, create your first playbook, and name it `common.yml`. 98 | 99 | - Within the `inventory` folder, create an `inventory` file (.yml) for each environment (Development, Staging Testing and Production) `dev`, `staging`, `uat`, and `prod` respectively. 100 | 101 | ![project11](./images/22.png) 102 | 103 | ## SET UP AN ANSIBLE INVENTORY 104 | 105 | > An Ansible inventory file defines the hosts and groups of hosts upon which commands, modules, and tasks in a playbook operate. Since our intention is to execute Linux commands on remote hosts, and ensure that it is the intended configuration on a particular server that occurs. It is important to have a way to organize our hosts in such an Inventory. 106 | 107 | - Save below inventory structure in the `inventory/dev` file to start configuring your development servers. Ensure to replace the IP addresses according to your own setup. 108 | 109 | > Note: Ansible uses `TCP port 22` by default, which means it needs to ssh into target servers from Jenkins-Ansible host – for this you can implement the concept of ssh-agent. Now you need to import your key into ssh-agent: 110 | 111 | - For Linux users – ssh-agent on linux 112 | 113 | `eval 'ssh-agent -s'` 114 | 115 | `ssh-add ` 116 | 117 | - Confirm the key has been added with the command , you should see the name of your key `ssh-add -l` 118 | 119 | - Now, ssh into your `Jenkins-Ansible` server using ssh-agent `ssh -A ubuntu@public-ip` 120 | 121 | ![project11](./images/23.png) 122 | 123 | > Also notice, that your Load Balancer user is `ubuntu` and user for RHEL-based servers is `ec2-user`. 124 | 125 | - Update your `inventory/dev.yml` file with this snippet of code: 126 | 127 | ```yaml 128 | [nfs] 129 | ansible_ssh_user='ec2-user' 130 | 131 | [webservers] 132 | ansible_ssh_user='ec2-user' 133 | ansible_ssh_user='ec2-user' 134 | 135 | [db] 136 | ansible_ssh_user='ec2-user' 137 | 138 | [lb] 139 | ansible_ssh_user='ubuntu' 140 | ``` 141 | 142 | ## CREATE A COMMON PLAYBOOK 143 | 144 | > It is time to start giving Ansible the instructions on what you needs to be performed on all servers listed ininventory/dev. 145 | 146 | > In `common.yml` playbook you will write configuration for repeatable, re-usable, and multi-machine tasks that is common to systems within the infrastructure. 147 | 148 | - Update your `playbooks/common.yml`file with following code: 149 | 150 | ```yaml 151 | --- 152 | 153 | - name: update web, nfs and db servers 154 | hosts: webservers, nfs, db 155 | remote_user: ec2-user 156 | become: yes 157 | become_user: root 158 | tasks: 159 | 160 | - name: ensure wireshark is at the latest version 161 | yum: 162 | name: wireshark 163 | state: latest 164 | 165 | - name: update LB server 166 | hosts: lb 167 | remote_user: ubuntu 168 | become: yes 169 | become_user: root 170 | tasks: - name: Update apt repo 171 | apt: 172 | update_cache: yes 173 | 174 | - name: ensure wireshark is at the latest version 175 | apt: 176 | name: wireshark 177 | state: latest 178 | ``` 179 | 180 | ![project11](./images/24.png) 181 | 182 | > Examine the code above and try to make sense out of it. This playbook is divided into two parts, each of them is intended to perform the same task: `install wireshark utility (or make sure it is updated to the latest version) on your RHEL 8 and Ubuntu servers`. It uses `root user` to perform this task and respective package manager: `yum for RHEL 8 and apt for Ubuntu.` 183 | 184 | > Feel free to update this playbook with following tasks: 185 | > 186 | > - Create a directory and a file inside it 187 | > - Change timezone on all servers 188 | > - Run some shell script 189 | 190 | > For a better understanding of Ansible playbooks – watch this video from RedHat and read this article. 191 | 192 | ## UPDATE GIT WITH THE LATEST CODE 193 | 194 | > Now all of your directories and files live on your machine and you need to push changes made locally to GitHub. 195 | 196 | > In the real world, you will be working within a team of other DevOps engineers and developers. It is important to learn how to collaborate with help of GIT . In many organisations there is a development rule that do not allow to deploy any code before it has been reviewed by an extra pair of eyes – it is also called `"Four eyes principle"`. 197 | 198 | - Now you have a separate branch, you will need to know how to raise a Pull Request (PR), get your branch peer reviewed and merged to the master branch. 199 | 200 | - Commit your code into GitHub: 201 | 202 | - use git commands to add, commit and push your branch to GitHub. 203 | 204 | ```bash 205 | git status 206 | git add 207 | git commit -m "commit message" 208 | ``` 209 | 210 | ![project11](./images/25.png) 211 | 212 | - Create a Pull request (PR) 213 | 214 | > Wear a hat of another developer for a second, and act as a reviewer. 215 | > If the reviewer is happy with your new feature development, merge the code to the master branch. 216 | 217 | ![project11](./images/26.png) 218 | 219 | - Head back on your terminal, checkout from the feature branch into the master, and pull down the latest changes. 220 | 221 | - Once your code changes appear in `master` branch – Jenkins will do its job and save all the files (build artifacts) to `/var/lib/jenkins/jobs/ansible/builds//archive/` directory on `Jenkins-Ansible`server. 222 | 223 | ![project11](./images/27.png) 224 | 225 | ## RUN FIRST ANSIBLE TEST 226 | 227 | - Now, it is time to execute ansible-playbook command and verify if your playbook actually works: 228 | 229 | ```bash 230 | cd ansible-config-mgt 231 | ansible-playbook -i inventory/dev.yml playbooks/common.yml 232 | ``` 233 | 234 | ![project11](./images/28.png) 235 | 236 | ![project11](./images/29.png) 237 | 238 | ![project11](./images/30.png) 239 | 240 | ![project11](./images/31.png) 241 | 242 | - You can go to each of the servers and check if wireshark has been installed by running `which wireshark` or `wireshark --version` 243 | 244 | ![project11](./images/32.png) 245 | 246 | #### Your updated with Ansible architecture now looks like this: 247 | 248 | ![project11](./images/33.png) 249 | 250 | **Congratulations** 251 | _You have just automated your routine tasks by implementing your first Ansible project! There is more exciting projects ahead, so lets keep it moving!_ 252 | -------------------------------------------------------------------------------- /Project 2/readme.md: -------------------------------------------------------------------------------- 1 | # PROJECT 2: LEMP STACK IMPLEMENTATION 2 | 3 | ## STEP 1 – INSTALLING THE NGINX WEB SERVER 4 | 5 | - Run 6 | 7 | ```bash 8 | sudo apt update 9 | sudo apt install nginx 10 | ``` 11 | 12 | - To verify that nginx was successfully installed and is running as a service in Ubuntu, run: `sudo systemctl status nginx` 13 | 14 | ![project2](./images/1.png) 15 | 16 | - Open a web browser of your choice and try to access following url `http://:80` 17 | 18 | ![project2](./images/2.png) 19 | 20 | > Another way to retrieve your Public IP address, other than to check it in AWS Web console, is to use following command: `curl -s http://169.254.169.254/latest/meta-data/public-ipv4` 21 | 22 | ## STEP 2 — INSTALLING MYSQL 23 | 24 | ```bash 25 | sudo apt install mysql-server 26 | sudo mysql 27 | ``` 28 | 29 | ![project2](./images/3.png) 30 | 31 | ```sql 32 | ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'PassWord.1'; 33 | exit 34 | ``` 35 | 36 | - Run `sudo mysql_secure_installation` and follow the instruction. This will ask if you want to configure the `VALIDATE PASSWORD PLUGIN`. 37 | 38 | ![project2](./images/4.png) 39 | 40 | - When you are done with the previous command, run `sudo mysql -p` to login and `exit` to leave SQL prompt. 41 | 42 | ## STEP 3 – INSTALLING PHP 43 | 44 | - Run `sudo apt install php-fpm php-mysql` 45 | 46 | ![project2](./images/5.png) 47 | 48 | ## STEP 4 — CONFIGURING NGINX TO USE PHP PROCESSOR 49 | 50 | > When using the Nginx web server, we can create server blocks (similar to virtual hosts in Apache) to encapsulate configuration details and host more than one domain on a single server. In this guide, we will use projectLEMP as an example domain name. 51 | 52 | > On Ubuntu 20.04, Nginx has one server block enabled by default and is configured to serve documents out of a directory at `/var/www/html`. While this works well for a single site, it can become difficult to manage if you are hosting multiple sites. Instead of modifying `/var/www/html`, we’ll create a directory structure within `/var/www` for the your_domain website, leaving `/var/www/html` in place as the default directory to be served if a client request does not match any other sites. 53 | 54 | - Create the root web directory for your_domain as follows: `sudo mkdir /var/www/projectLEMP` 55 | 56 | - Next, assign ownership of the directory with the $USER environment variable, which will reference your current system user: `sudo chown -R $USER:$USER /var/www/projectLEMP` 57 | 58 | - Then, open a new configuration file in Nginx’s sites-available directory using your preferred command-line editor. Here, we’ll use nano: `sudo nano /etc/nginx/sites-available/projectLEMP` 59 | 60 | > This will create a new blank file. Paste in the following bare-bones configuration: `/etc/nginx/sites-available/projectLEMP` 61 | 62 | ```config 63 | server { 64 | listen 80; 65 | server_name projectLEMP www.projectLEMP; 66 | root /var/www/projectLEMP; 67 | 68 | index index.html index.htm index.php; 69 | 70 | location / { 71 | try_files $uri $uri/ =404; 72 | } 73 | 74 | location ~ \.php$ { 75 | include snippets/fastcgi-php.conf; 76 | fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; 77 | } 78 | 79 | location ~ /\.ht { 80 | deny all; 81 | } 82 | 83 | } 84 | ``` 85 | 86 | ##### Here’s what each of these directives and location blocks do: 87 | 88 | - `listen` — Defines what port Nginx will listen on. In this case, it will listen on port 80, the default port for HTTP. 89 | 90 | - `root` — Defines the document root where the files served by this website are stored. 91 | 92 | - `index` — Defines in which order Nginx will prioritize index files for this website. It is a common practice to list index.html files with a higher precedence than index.php files to allow for quickly setting up a maintenance landing page in PHP applications. You can adjust these settings to better suit your application needs. 93 | 94 | - `server_name` — Defines which domain names and/or IP addresses this server block should respond for. Point this directive to your server’s domain name or public IP address. 95 | 96 | - `location /` — The first location block includes a try_files directive, which checks for the existence of files or directories matching a URI request. If Nginx cannot find the appropriate resource, it will return a 404 error. 97 | 98 | - `location ~ \.php$` — This location block handles the actual PHP processing by pointing Nginx to the fastcgi-php.conf configuration file and the php7.4-fpm.sock file, which declares what socket is associated with php-fpm. 99 | 100 | - `location ~ /\.ht` — The last location block deals with .htaccess files, which Nginx does not process. By adding the deny all directive, if any .htaccess files happen to find their way into the document root ,they will not be served to visitors. 101 | 102 | - When you’re done editing, save and close the file. If you’re using `nano`, you can do so by typing `CTRL+X` and then `y` and `ENTER `to confirm. 103 | 104 | - Activate your configuration by linking to the config file from Nginx’s sites-enabled directory: 105 | 106 | `sudo ln -s /etc/nginx/sites-available/projectLEMP /etc/nginx/sites-enabled/` 107 | 108 | This will tell Nginx to use the configuration next time it is reloaded. You can test your configuration file for syntax errors by typing: `sudo nginx -t` 109 | 110 | You shall see following message: 111 | 112 | ```bash 113 | nginx: the configuration file /etc/nginx/nginx.conf syntax is ok 114 | nginx: configuration file /etc/nginx/nginx.conf test is successful 115 | ``` 116 | 117 | > If any errors are reported, go back to your configuration file to review its contents before continuing. 118 | 119 | - We also need to disable default Nginx host that is currently configured to listen on port 80, for this run: `sudo unlink /etc/nginx/sites-enabled/default` 120 | 121 | - When you are ready, reload Nginx to apply the changes: `sudo systemctl reload nginx` 122 | 123 | - Your new website is now active, but the web root `/var/www/projectLEMP` is still empty. Create an `index.html` file in that location so that we can test that your new server block works as expected: 124 | 125 | `sudo echo 'Hello LEMP from hostname' $(curl -s http://169.254.169.254/latest/meta-data/public-hostname) 'with public IP' $(curl -s http://169.254.169.254/latest/meta-data/public-ipv4) > /var/www/projectLEMP/index.html` 126 | 127 | - Now go to your browser and try to open your website URL using IP address: `http://:80` 128 | 129 | ![project2](./images/6.png) 130 | 131 | > If you see the text from ‘echo’ command you wrote to index.html file, then it means your Nginx site is working as expected. 132 | 133 | > In the output you will see your server’s public hostname (DNS name) and public IP address. You can also access your website in your browser by public DNS name, not only by IP – try it out, the result must be the same (port is optional) 134 | 135 | `http://:80` 136 | 137 | > You can leave this file in place as a temporary landing page for your application until you set up an `index.php` file to replace it. Once you do that, remember to remove or rename the `index.html` file from your document root, as it would take precedence over an `index.php` file by default. 138 | 139 | > Your LEMP stack is now fully configured. In the next step, we’ll create a PHP script to test that Nginx is in fact able to handle `.php` files within your newly configured website. 140 | 141 | ## STEP 5 – TESTING PHP WITH NGINX 142 | 143 | > At this point, your LAMP stack is completely installed and fully operational. 144 | 145 | > You can test it to validate that Nginx can correctly hand `.php` files off to your PHP processor. 146 | 147 | - You can do this by creating a test PHP file in your document root. Open a new file called info.php within your document root in your text editor: 148 | 149 | `sudo nano /var/www/projectLEMP/info.php` 150 | 151 | - Type or paste the following lines into the new file. This is valid PHP code that will return information about your server: 152 | 153 | ```php 154 | After checking the relevant information about your PHP server through that page, it’s best to remove the file you created as it contains sensitive information about your PHP environment and your Ubuntu server. You can use rm to remove that file: `sudo rm /var/www/your_domain/info.php` 163 | 164 | ## STEP 6 – RETRIEVING DATA FROM MYSQL DATABASE WITH PHP (CONTINUED) 165 | 166 | - run `sudo mysql` 167 | 168 | - run 169 | 170 | ```sql 171 | CREATE DATABASE `example_database`; 172 | CREATE USER 'example_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password'; 173 | GRANT ALL ON example_database.* TO 'example_user'@'%'; 174 | exit 175 | ``` 176 | 177 | - You can test if the new user has the proper permissions by logging in to the MySQL console again, this time using the custom user credentials: `mysql -u example_user -p` 178 | 179 | ![project2](./images/8.png) 180 | 181 | - Once logged in, run 182 | 183 | ```sql 184 | SHOW DATABASES; 185 | 186 | # we’ll create a test table named todo_list 187 | 188 | CREATE TABLE example_database.todo_list ( 189 | mysql> item_id INT AUTO_INCREMENT, 190 | mysql> content VARCHAR(255), 191 | mysql> PRIMARY KEY(item_id) 192 | mysql> ); 193 | 194 | INSERT INTO example_database.todo_list (content) VALUES ("My first important item"); 195 | 196 | SELECT * FROM example_database.todo_list; 197 | 198 | exit 199 | ``` 200 | 201 | ![project2](./images/10.png) 202 | 203 | - Now you can create a PHP script that will connect to MySQL and query for your content. Create a new PHP file in your custom web root directory using your preferred editor. We’ll use vi for that: `nano /var/www/projectLEMP/todo_list.php` 204 | 205 | - Copy this content into your todo_list.php script: 206 | 207 | ```php 208 | TODO
    "; 217 | foreach($db->query("SELECT content FROM $table") as $row) { 218 | echo "
  1. " . $row['content'] . "
  2. "; 219 | } 220 | echo "
"; 221 | } catch (PDOException $e) { 222 | print "Error!: " . $e->getMessage() . "
"; 223 | die(); 224 | } 225 | ``` 226 | 227 | ![project2](./images/9.png) 228 | 229 | - You can now access this page in your web browser by visiting the domain name or public IP address configured for your website, followed by /todo_list.php: `http:///todo_list.php` 230 | 231 | ![project2](./images/11.png) 232 | --------------------------------------------------------------------------------