Devops Interview questions and answers | Devops mock interview 1 Answers

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
hi everyone this is deekshit welcome to my channel in this particular video i'm gonna discuss answers for devops mock interview one so please watch devops mock into one before watching this video i'll leave a link in description so coming to this video as i said i'm gonna discuss answers for the question so each question have uh a different types of answer so whatever the knowledge that i have but with that like i'm gonna answer these questions so if you feel any other answer which is like better than whatever i give answer i have given so you can just comment it in the comment section so other people will will also come to know like there is a better answer than this one now let's start with the questions first we will start with git questions so the first question was why we need kit and what makes git unique from other tools like svn so all the code and automation test cases if uh if a project has automation testing so then all those things will be placed under sems it can be a github bit bucket azure repos are it depends on a project what they have taken so to deal with this sem you need to have a client client tool so which is basically a git so git is version control uh system so wherein it tracks the changes you make to the files so when you have a uh like do the changes you'll also have a record for that change and also you can revert it back back to a specific version so if you feel there is a bug in present version so then you can always go back to a specific version which is which is working fine i also get makes collaboration easier allowing the changes by multiple people to all we merged into one source so when you have a couple of people who is contributing to the same project they all can contribute to one project and so if any one more person if he comes and joins to the team so then he can go ahead and you can clone that and you can again work on that and also other part of the question was why data is better than svn but there are two types of version control system one is centralized and another one is distributed version control system so in a centralized version control system it is basically subversion so in that so you'll have central repository and your local mission so in your local machine you don't have any working copy means like you'll have working copy but you don't have uh something called as local repository so if you want to do anything comment update any operations you should always be online with your central repository and if your central repository goes down so then you won't be able to access your code at all so in other and distributed version control system so uh you'll have kind of like it's a three or three layer architecture so you'll have working copy and there is something called as local repository as you can see on the slide and then we have a remote repository so whatever the change is like whenever you want to do the push or pull fetch so in that time only you need to be there online with your remote repository so or else you'll have a local copy so you can always work with that local repository you'll have a local copy right so with that you can always work on work upon and other things are like uh so branching revert log everything in subversion you need to do it in the central repository wherein like in distributed so in in our case it is a git so you can do it in remote repository as well as in your local so that's why distributed version control system have always advantage over a central uh centralized version control system so there are many other differences as well but um to keep it short so i've just taken a major differences okay so the next question was um let's say i have a maven repo clone onto my local did some changes and i have built the code now the target folder will be generated so now when i get operations like git add git commit or any git operations the target folder should not be considered so how to achieve this so we can achieve this by using uh git ignore basically uh see target folder which which has uh artifacts right it is not a valid valid candidate to be there in a bit bucket so it should be on whatever the jar or artifacts which will be generated by maven should be there in some artifactory so that's the reason so whichever you feel it should be ignored for all git operations so that time you can go ahead and you can create a dot get ignored and then you can do it so let's see a demo for this okay so what i'll do is um i'll just i have a machine so when i i have already uh installed git here so let me take one more uh thing so this is my github repository so what i'll do is i'm gonna take this particular sample web application so what i'll do is i'll just gonna clone this particular repo cd not cd i'll just clone it here git clone and then the clone link okay so let me go inside sample web application and here my form is there so what i'll do is mvn clean install so in the question they've mentioned like if it is a small change okay anyway like i'm not doing any change but let me do a mvn install so what it does it will gonna create a target folder which will have uh everything like um the artifacts in it okay so it will it will gonna take a couple of seconds because uh so it is downloading all the dependencies and the plugins whatever you have defined in your project so now as you can see it took 10 seconds okay so now when i see here so one folder has been created which is target basically it will have all the artifacts related to my project okay when i do git status now so this particular uh target folder is taken into account so like let's say now in our case now it is only one folder like let's say uh if if a particular command generates like hundreds of artifacts and you don't want to consider them uh to your git operations so then it's very easy like you can create a dot git ignore file ignore and then what you need to do is you need to take this target folder so in my case so then you can include this target folder so now when i do git status target folder shouldn't be displayed okay let me clear the screen so now when i do git status see the target folder is not considered so that's that's the reason like when you have a git ignore and whatever the files and whatever the regular expression whatever the folders that you mentioned it will be ignored for all your git operations okay so this is how if you want to uh ignore a particular file so this is how you will do it okay so let's uh go ahead under the next question so the next question is our difference between get pull and get fetch so first see what git pull and git fetch is so then we will see a simple demo so how git fetch works and git pull works so git pull so it perf it performs two functions using a single command so basically it performs git fetch plus git merge and uh when you clone a repository onto your local machine so there will be two kinds of branches one is remote branches another one is like local branches remote branches how we will identify this uh the remote branches will be suffixed with the remote so i'll just show you like to see all the command all the branches that our particular repo as the command for that is the git branch iphone a so it will list out all the branches that we have okay i'll just show you that before that so what git pull does is uh it fetches all the changes that were made to the remote branch then uh so it will take the changes onto the remote branch then it merges those changes to the local branch as i say like there will be two kinds of branches one is local branches and remote branches so what it will do is like it will gonna fetch the changes from remote repository onto the remote branch and then it will merge it back to local branch the next one is uh git fetch so as i've already uh are shown so git pull is equals to git fetch plus git merge git fetch or does only off of the work what git pull does it just brings the changes on your remote repository onto the remote branches okay so then if you want to see those changes onto your local breasts so then you need to explicitly do a merge okay now quickly we will see how it works okay now i have already cloned my um repo repository right so what i will do is now i'll execute git branch iphone a okay so hope you're able to see this like let let me increase the size of it so as you can see now when i execute git branch iphone a so i'll be able to see many branches like as you can see whichever the branches as a remote in it so those are remote branches whichever is not suffixed with remotes so then those are local branches okay so now what i'll do is uh first let me change few things in github okay so this is my project what i'll do is let me change this readme.md what i'll do in this i'll just do a small change the stormcat is there right i'm just gonna change only this um our tomcat t from upper case to lower case so after that i will just gonna commit it so once i commit it so now when i do git git uh pull so what it does so it basically takes the changes and then it will place it in local branch right so before that what we will do is we will do a git fetch okay so when i do git fetch as you can see there was some changes so then those things are there in origin uh ansible sonar okay it's not there in our local branch yet so if i do cat and readme dot md so you'll be able you'll be not able to see that change so still it is a uppercase okay so but so when i go back to my remote branch which is uh uh this particular branch origin ansible sonar when i go this uh for this particular branch when you do cat here see this particular changes are there so that's what i mentioned so what fetch will do is it will gonna take the changes from your remote repository and you can keep it in remote branches in your local okay if you want to have those changes onto your local branch so then what you need to do is first you need to put checkout sorry git checkout and you need to give the branch name so basically in our case uh it is ansible sonar so let me go there so still if i see readme.md so it shouldn't be updated now when i do git merge and then so if i give origin and then slash so this ansible sonar so that time i'll be able to see those changes once i'm merging this when it helps is like let's say now somebody has uh changed something so whatever the file that you are working the same file has been changed if you know that like the same file has been changed before getting those changes on to your local branch you just wanted to check what are all the changes he did to other person so in that case like what you can do is you can fetch it and you can compare it like what are all the changes he did whether it is really okay like to merge it back to my local are so those kind of things you can check it and if you if you're okay then you can merge it okay so on the other end so what git pull does is so let me what i'll do is let me uh correct those changes back like i'll just update this capital like a lowercase 2 t to uppercase t so when i do this one so when i do now a git pull okay so as you can see uh now uh when i do a cat on readme.md so what it does it will gonna take the changes directly from that remote repository uh to my local branch so in the background so what it does it will get the remote repository changes to remote branch and then it will get back uh those things to my local branch okay so this is a basic uh difference between git pull and get fetch and the next question was how to clone a specific branch in a gate so as you can see uh till now when we uh just discussed about this one so let me clear the screen so now when i do this one so as you can see now here so there are like when i do git branch iphone a so all the branches will be visible for you right so like let's say i want to uh i'm doing some automation i wanted to uh go to this particular i want to clone this particular branch and i need to do some file changes and check in back so in this um there are only eight or nine branches but we're in like in actual repositories like if our project is consists of like hundreds of developers then multiple brands many branches will be there so cloning all the branches like it doesn't make any sense and it will take much time and your dot gate folder will be increased right so for that reason so if you want to uh clone only a specific branch so how we we can do it so yeah there is an option wherein like we can specify in git clone command so that clones only a particular branch okay so for that what i'll do is let me go back to my home directory i'll do rmrf and sample web application so when i do this i don't have anything what i'll do is get clone and i need to give an option which is hyphen b and then i need to specify which branch i need so let me take the backup branch okay and then so there is an option iphone iphone single branch so you need to use this particular option if you don't use this option so when you use only this particular option what it does if you clone all the branches but when you go inside that particular folder so cloned folder so by default it is uh it is on this backup branch okay if you want to clone only backup branch so then you need to use iphone iphone single iphone branch and then what i'll do is let me take the clone link so if you want to play with this example so you can always go ahead and you can fork these things okay so let me clone these things okay so now when i do cd sample web application and when i do ls so now when i do git branch iphone a you'll be able to see only backup branch only a single branch has been cloned onto our machine okay so this is how if you want to clone a specific branch so this is how you can do it so the next questions uh so we will it was on marvin so we will jump onto maven so now in the marvin the first question was uh when i issue a mba install so what all the things that will gonna happen in background okay so now what we will do is uh so let me uh take uh this particular example itself before that what i'll do is like um so i wanted to i want to explain uh build life cycles before uh seeing the output of the ambient instrument so there are three life cycles in maven one is default uh clean and site so when you execute mb and clean what it does it basically does the cleanup in layman terms it directly deletes that target folder whatever it has been generated in the previous executions of the command and there is one more thing which is ambient side so maven is not only a built-in it is a project management tool as well so when you execute ambient site it creates a lot of documentation and good documentation about your project so it will give the number of dependencies number of plugins and what all the transitive dependencies and words like if you have any metadata you have provided in your form so it will be segregated properly okay and now another uh lifecycle was default so default has seven faces okay as you can see on the screen so it is validate compile test package verify install deploy these are the seven phases of our default lifecycle so when you execute mvn install what it does is so in the background it will definitely it will gonna execute ambient validate so it validates the correctness of your palm.xml whether all the information has been supplied properly or not it is gonna check and then it will execute mvn compile ambient compile basically creates the dot class files of your project and the next thing is uh test phase wherein it will apply all the unit test cases that you have written onto your dot class files so then uh it is like maven is a build tool right it obviously creates some jar files and uh some war files depending on project so in this phase it will gonna create the executable this package phase and the next one is verify freeze so in this uh all the system integration test cases will be applied onto your jar okay to verify whether system integration test cases are like properly working or not and the the last one is not the last one last before one that's like mvn install what it does whatever the artifacts that has been generated in this project by uh using packy so that particular artifact will be copied onto dot m2 so which is called as local repository in maven okay so and also the last one is like ambient deploy so if you want to push your artifacts to any artifactory like jfrogger nexus you you can use that and you can uh you can achieve that okay so when you uh execute mvn install so by default it will gonna run all these things so when you execute mvn package so in that time it will execute ambient validate compile and test when you execute mvn verify so it will do all these things so what we will do is we will see a simple um what i'll do is mvn clean so let me give install so as you can see now you can see in the locks actually so what are all the things it will gonna run so okay as you can see here the maven compiler plugin so what it is like all the whatever the stages are there right like the faces so in maven perspective it is the plugins okay so as you can see it is running uh resources means like it is uh getting the resource information and it is doing a compilation and then it is applying this test cases and then it is creating a war file because my minus web application that's the reason it is creating a war so in this case this is like package uh phase so in the install as you can see here the war file which has been generated for this project will be copied onto dot m2 folder which is then like uh the home folder of uh your machine you're under your user okay so it has local installation you can say it's a local installation so it will transfer your war file or jar file to or dot m2 folder okay and uh the next question is uh what are the settings that you need to do before running mvn deploy so for this uh to explain so i i have one more repo so which is um so let let me go back to my username and then click on repositories and here so there is something called as nexus maven samples so let me clone this one onto my mission so i'll do cd dot dot now git clone and then the clone link so now before executing mv and deploy what i'll do is so i'll just explain what all the settings that you need to have okay the first thing uh what you need to do uh do is like in dot m2 folder you need to have settings.xml means like you need to specify the username and password of your artifactory so in my case i'm using nexus so which is already up and running in my case okay so you need to specify the information about your nexus repository what is the username what is the password all those things you need to specify here so this is everything is commented if you come here like if you scroll uh if i scroll down so as you can see here so this is what i've used i've used a server and when i've specified the id so i'll be using this id again in my form.xml i'll just show that as well so then i'm using username and password the username password of your id factory you need to specify here okay so this is the setting that you need to do here and after that so in my ambient project maven project if you see in pom.xml so what i have specified is here i am specifying my repository so if you see that so that id and this id should be matching so there you are providing the settings like the username and password so when in here i am specifying where my artifact should go if it is a snapshot it should go here if it is a release then it should go here so that is what i am specifying here in my case if you see my uh version it is a release right so that it will go to this particular release repository okay so now let me clone this one so i guess i've already cloned this one so let me go inside the sample web application so not sample web application it is nexus sample so before that i'll make sure uh whatever i've cloned uh as my ip address nexus ip address properly uh is given what i'll do is oh i was in pom.xml itself so let me check it in form.xml so it is uh 35 188 and my nexus is yeah it is one on the same as you can see this ipad assignment okay now it is proper so what i'll do is so before that so i'll just gonna move the settings.xml to my.n2 folder okay because in the local repository only my settings.xml should be placed so that's the reason i'm just copying this settings.xml to my dot improve okay so now dot m2 has been i mean settings.xml has been transferred to dot m2 so now let me go inside demo and then i'll execute mvn deploy okay when i do this one it'll gonna execute so all the steps as i told you in the previous uh example so it will gonna execute all those things uh validate package test verify and install so then it will gonna take the artifact and it will publish it to the nexus so it will take a little time so it is executing the test phase now and uh so we can go to nexus meanwhile and so mine is released right so maven release is a place it will gonna upload so when i click on this one still no components are there because i guess like it is still running so now when i see this one my win releases okay i should have it there i guess i've deleted somehow but yeah so as you can see marvin public has see it is uh it should be there i don't know why it has been deleted so i guess um i i think i've deleted some components like uh some repository name and all so that's the reason but yeah maven public is the combination of both my mvn maven a snapshot under release as you can see here this this says like it has been uh uploaded uploading to this particular repository so you can see here right so this is uploading so now if you want to do if you want to do any mbn deploy so these are all the two settings one is you need to have a server details in your settings.xml and in pom.xml you should have this particular block distribution management and in distribution management you need to specify the url uh where you need to push it and the id what you're specified in settings.xml should be matched with this one okay and uh the next question was uh why marvin takes much time in the first execution and the second execution will take less time so i have executed everything previously right so what i'll do is let me take one more repo which is there in my under my username which is jenkins file repository so jenkins file i'll take this one so now let me clone this onto my local git clone and then so when i do git clone so it'll clones for me so let me go inside so when i do mvn uh install here even clean install install so then uh it will take uh we can see how much time will it take so at the end as you can see it is like downloading many things so as uh i've run two projects right so that time it has download all the repositories and it will take first time what it does is whatever the dependencies that you have mentioned so it will gonna download it will download and then it will place it in dot m2 okay so now again if i do npn install so it should ideally take less than whatever it has been taken previously like it is three seconds right it should take less time because what happens is like if i go to my uh dot m2 folder so when you execute for the first time so if any uh repository like uh not the repository any dependency that you have defined in your pom.xml will be downloaded and kept here okay so for the second time when you run it so it will it will refer it from here so if it is there first how it will navigate works is first it will check in the local repository if that dependency is there in local repository so then it will fetch it from here if it doesn't exist then it will go to central repository and then it will fetch it okay so that's why so when you execute first for the for the first time so it will take much time so when you execute for the second time so already so all the dependencies will be downloaded so that's the reason it will take very less time okay and uh the next questions on unix and shell scripting the first question on shell scripting was um how to get a present working folder so this is so when you do a pwd you basically get a full path so my question was so i need to get so let's say i'm in this particular folder right so when i execute that particular command i should get only that particular value if i execute in a home directory so now if i do uh pwd so my current directory is this one i should get uh output as home only okay so in that case there is something called as a base name command you can use that so so the command is base name and then so you need to use a double quotes the dollar pwd and you use this one so you will get only the present working folder okay so if i go back to uh home directory so if you see now i'm not in this particular directory when i execute the base name again so i'll be able to get only uh the home as output okay now if we will check it for another thing as well so i have cloned the nexus right so when i do base name base name and then i'll use a double quotes so to put that dollar pwd when i execute this one so i'll get only the present working um folder okay so there is one more way like so there are many ways like by which you can achieve it so another way is like if that base name command is not supported in all the versions all the linux flavors so you can use a pwd and you can do some work around and then you can get the output as well so what you can do is pwd reverse so it will gonna reverse the output and then what i'll do is cut hyphen d so i am delimiting by using this and then i'm selecting the field one and then i'm just reversing again okay the same output so base name whatever you get it from base name you will get it by using this command as well but if base name is supported it's better to use this so rather than pipelining it pipelining it okay and the next question is uh how to copy a file uh from local windows machine to the cloud-based linux mission so um so there are uh see cloud platform like aws google cloud and a azure so there they have their own command lines like uh awscli google cloud so by using those things i guess like we will be able to copy that so apart from that so we have something called as psap so especially if you want to copy from your local mission by using um windows powershell prompt so then you can use psep option so by which like you will be able to transfer the file from your local windows machine onto the nexus from a reverse way like vice versa also is possible so now let's see the example for that as well so let me open my commercial so what i'll do is i'll just open it in one some of the folder itself okay powershell and let me open this so now what i'll do is um yes let me increase the font so what i'll do is i'll just gonna transfer one of the file onto my this particular machine so basic ubuntu so for this machine i'll gonna copy so what i need to do is here now pscp i need to say which file i want to send so let me send it postman so i'll just postman.newspec file to where like uh you need to specify the username and you need to specify the ip and also colon so where you need to copy so what i'll do is i'll do a cd dot dot now so i don't have that new spec file so let me give this particular folder okay so when i give this one so it should ideally it should ask me the password as well so i'm entering the password so it should copy successfully now now so when when i do ls in my mission so i should be able to see that content so when i do postman spec so i should be able to see the content as well okay so this is how if you want to transfer any file from your windows machine onto your linux machine so then this is the way if you want to do a vice versa then you need to specify as you can see here so pscp and whatever the username and the dns name our ip of your machine and the folder where from where you need to copy and folder which you need to gets copied like that file onto your machine okay next question is a shell script named test.sh can accept four parameters so that is a b c d the parameters won't be supplied in order always and the number of parameters can also vary so it can be only a b or it can be cd okay it can be jumbled also i i can send like c a b d so that is how okay but in this case i want to identify the position of letter c okay so how i will write the shell script for that so this shell script i have already written so let me what i'll do is let me go to my github again so there is a repo called shell script saying that i have kept on my shell scripts shell script so here so there is something called id candles position underscore parameter so what you can do is like um you can copy this one so if you are interested you can fork this repository as well now here this is very simple so what i've did is like i've initialized i is equals to zero i'm running a for loop so when you use dollar i so what it does whatever the parameters you are sending it from your as a parameter will be stored as array in this array okay so i'm running up for each loop so every parameter i am taking individually okay and then i am doing an increment because so whenever i do one for each loop i wanted to increment because this is how you will get the position right so that's the reason i am just incrementing incrementing it and then i am searching like if uh dollar p in my case dollar p is like the each parameter like the first parameter for the first time second fire parameter for the second loop like that so if it is c so then i'm just doing doing a echo so i'm just doing user supplied so sorry about the spelling mistake typo and so as parameter in dollar i position so every for every loop i'm just incrementing okay so i'll just gonna take this particular shell script so let me show it vi and i'll just name it as test.sh okay and down saying this like i'll keep this so let me execute this one sh test dot sh i'll sign a b c and d okay so as you can see now it is in the third position so that's the reason i'm getting that so if i take off the c so i won't get any output because i am not supplied uh so i'm just verifying if loop right if c is not there you won't get any output and if i'm jumbling like d and then again c so ideally i should get four okay and one more case i specified was like number of parameters it might change with number of parameters as well so i do this one so i should get id2 so i'm getting the proper output so this is a this is uh the simple script so that i've created so if you want to uh execute this in your systems so then you can go ahead and copy and execute these things okay and uh next questions uh it was an ansible so why we need adult commands in ansible so and also give the scenario where you have used commands so yeah so adopt commands uh basically uh uses uh user slash bin when you install ansible so this command line by default will be installed okay and uh so this these things are like if you want to achieve a some trick task like if you want to copy something from your host machine onto the node so rls you if you want to ping a particular mission so then you can use adobe commands and then now you can achieve those things very easily and these things are not reusable because like when once you execute the command so that's all like you want to achieve that task again then you need to execute that command again okay it's not like playbook and then so you can say examples like if you want to ping a particular machine so this is how like i've given the all combinations like ansible iphone all in the sense like if you have one ip if you want to execute only that particular um on that particular node so this is how like you need to give iphone i all iphone i and you need to specify the ip address comma hyphen m and pin okay when you have a host file so in which like you you want to take the only dev group and then you can do that as well so let me show one ansible uh command so what i'll do is i have a ansible master for that which is already configured okay i'll just execute verify ansible version so this is also mandatory like so in few of the interviews i've seen like they'll ask you randomly so which version of my win which version of ansible which version of git you have used so it is better like make a down like make it down so what are all the versions that you have used for your projects are for your practice okay the ansible has been uh installed in this particular mission so what i'll do is now i'll do a ansible thing that's all okay so i have something a host file so let me check so is there anything 35 so let me verify this ip addresses exists or not i guess that is the same 35 202 yeah so this is the same so what i'll do is ansible uh i'll give dev and i'm just giving inventory file as host and what module i need to execute it is basically a ping so this is a basic module if you want to test the connectivity so this is a module you use so you can use any other commands like that so you can use copy module and then as you can see in the slide so you can give the source hyphen a you need to give basically arguments so before that i'll check any files are there yeah i have a test.yml right so let me send that itself okay so i'll just copy and then iphone a and then in the single quotes i guess i need to supply source and destination okay src is equals to my test.yml yml and then our destination is dest is equals to and i'll give this particular thing so it should execute successfully so when i go to that particular machine so this is my uh mission as you can see for the confirmation so basic ubuntu uh so this is my pc one two so when i do this ls here so i should be able to see test.yml okay so this is if you want to achieve any small tasks or like one-time tasks so then you can go ahead and you can use ansible documents and the next question is when i need a detailed log on executing ansible playbook what option do you do i need to use so when i run ansible playbook it it won't give me detailed output it just says like how many has changed and what are all the tasks the information only minimal information it gives like let's say i want to give the i want to see the detailed output what are all the things that's happening and what are all the things that are going to happen everything if i want to see so how it is done okay so let let us take a simple playbook so again there is a repo in my github which is hansible so here i have written examples like all the yml files for each of the modules so you can go ahead and you can prefer this so let me take a copy module so as of now so what i'll do is i'll just copy this onto ansible master so va and test so test is already there so what i'll do is um let me copy call this one as copy dot yml and in this i'll gonna pull paste this okay it has not copied properly so what i'll do is let me copy it again okay host so here i need to specify the proper host path what i'll do is here the test dot okay this is already there right i'll just do host files and this is just an example i'm just taking so destination path so let me save this first wq and i'll take this directory it is same directory in that machine as well so that that's what i'm just copying from here okay so let me copy this one and paste it here okay so now when i do now when i execute ansible playbook first let's execute normally so i'll i'll just show you the difference then i need to give the group so basically let me check whether i've already have that group name specified in that yml file then i don't need to specify yeah i have already specified as host right so in this case ansible iphone playbook and then i need to give the host file and then i need to give the playbook name in my case it is copy dot yml okay so as you can see this is very minimal information so i want it in detail so then there is an option which you can use for a detailed output if you want to see all the low level information so then hyphen bvbv so which gives the low i mean uh the information information for your like what are all the things it is running all the information it gives to you okay this is if you want a detailed uh output so then you can go ahead and you can use that particular option and uh what's what is ansible.cfg5 so ansible dot cfg will by default it presents in slash etc slash ansible so you can define certain settings in ansible so this is the link so when i click on this one so you will be able to see what all the settings that will be there in ansible.cfg yes uh yeah so you can specify where your host file is there uh on by default on what user you need to run your plea book all those things you can specify it here so by default it it will be there in etc slash ansible okay so everything is like by default it is like commented if you want to enable anything so see uh inventory so if you have your inventory file under this file folder so you can just give that value and you can uncomment this one so then it all ansible playbooks will assume your host is here okay you don't need to that time you don't want to you don't need to specify actually this iphone i is there right you don't need to specify that particular option hyphen i okay so basically you will just have all the certain settings in ansible.cfg and what are all the modules you have worked on so which module is used for getting the file from node to master so previously we have seen one module so which is copy which copies from ansible master onto the node so this is reverse case if you want to get from the node onto the master how will you do that and before that the first thing so you need to say yes i've worked on a couple of modules i can name according to your usage you can see whatever the modules that you have worked on so these are the common modules that i've listed here copy fetch m debug uh get url extract template file app command shell module and also as i mentioned so i have a repo um wherein i have given the demo means sample yml for almost all the modules that i've specified in slide so you can go ahead and you can refer these things if you are interested so then the next part of the question is now which module is used for getting the file from note on to the master so which is basically a fetch module so what it does uh it will take the file from the host means not the host from the node on to our master ansible master so let's take this particular yml file so what i'll do is let me clear the screen clear uh so now when i do ls so i have few files va so what i'll do is fetch dot yml okay so i'll just create this so whatever the content i have copied from that i'm gonna copy it here so i've just copied and so now i need to change these things right so i need to change these things uh source path and the destination path so i need to change these things basically uh so what i'll do is let me change the source path to uh in whatever the node so i have something uh this let me create some touch touch a b or something a file a and touch i'm doing a creation of a file so i want to copy this a file onto my ansible master okay so that is what i want to do now so i'll take this pwd and then i'll take this particular part because in this i have my thing right so what i'll do is i'll just change this one so i've changed this and my this thing is a right so on the destination path so what i'll do is again in this mission also this particular folder is there right so i'll give this one and let me save this so now ansible iphone playbook then i need to specify the host file and then the yml which i'm using so then what it does when i do ls now see the from okay so it has created a folder with uh that particular hostname so 35 so in that i should be able to see folder however it was in that and now in the inside that i should have a file called as a okay so this is how if you want to fetch it from your node onto your master so this is how you do it okay so so this is what the question was so what are all the modules you can say uh copy and you can list and you can refer this github link as well so the next thing is let's say i have a playbook so which has five tasks in a playbook first two tasks should run on my local machine and other three tasks should run in the node so in ansible there is something called a single play and a multiple play so in a playbook you can have a single play means like you can use one web server so means like one group of servers you can run all the tasks on that so you can use multiple please so wherein like you can execute few tasks and um one a group of servers and in one another group of servers you can execute other tasks so whatever this question is there right you can achieve it in multiple ways by using when and where there is a concept called as blocks by using which that also you can achieve it so what i have taken is uh i've taken to make it very simple so i have taken a multiple place concept so i have executed this so let me show you this i have already written this playbook as well so the name of that playbook in the same this one is multiple play just search for that and here i'll explain the playbook here itself so what i'm assuming here my notes doesn't have the internet connectivity at all so what i'm trying to do here is i'm just installing the w get in the local host in ansible master basically so and also have set gather facts is false so gather facts if you set a city to true so then it will take all the facts about your node mission and then it will store it so i i just wanted to ignore those things so that's the reason i don't want to collect my localhost gather facts right so i don't need it so that's the reason i'm just keeping it as false and then so i'm just installing a dublicate there are two tasks as question says there are two tasks which is uh dublin gate i'm installing so in my case i don't need it actually but uh to make it two tasks i'm just installing wget and the next task is um so jenkins i am downloading jenkins for file so as i already mentioned mentioned uh so i'm assuming my notes doesn't have internet connectivity my use cases i need to download war file on my master and then copy it onto my node and then start it okay so as you can see so in the first task i am just copying my jenkins war file onto my destination okay and then in the second task i am executing shell module here i am executing multiple commands i wanted to keep in a single module so that's the reason i'm using a multi-line commands okay make directory and i'm moving uh here i'm creating a folder structure because i don't want my jenkins folder should be there in the home so that's the reason i'm just copying on to my jenkins folder which i have created created previously and then in the background i'm running a no hop command so java iphone jar and um i'm giving a percent so that's the reason it will run in the background as well okay so this i guess i have already copied as you can see now when i do cat and test dot yml okay i am in a wrong folder so let me go back cd slash home and s devops so when i go here and when i see it so uh when i do cat and this test.yml okay i'll be able to see uh the same thing same thing i've copied from there so let me execute this ansible iphone playbook okay then i need to give the host and i need to give the playbook name as well so now the first task is w gate so it says ok and the next step is download jenkins so it is downloading a war file it will take couple of seconds yes now it is done so the next task so as you can see multiple place this is the first plane and the second plane so as i already mentioned so you can achieve this particular question whatever the question is the right you can achieve it in multiple ways so one is by using uh when conditions are by using a block there is a concept called as block by using which you can achieve it so i just wanted to keep simple so that's the reason i have just taken this okay so now uh so what i've done is like i've just installed and run my jenkins right so what we will do we will take the ip of my node uh so which is basically this is my uh ansible node right so i'm gonna take this particular one and i'll just check like whether jenkins is up and running or not so my jenkins runs on 8080 by default so it will take couple of seconds yes uh as you can see it is up and running yeah so it is like initial password it is asking initial password so anyway we will gonna discuss thinking questions as well right so that time we will take that and then we will give here okay and let's jump on to the next questions quickly and next question is on jenkins the first question was how to save uh only last five bills of a jenkins job so i'll pause the video i'll just make sure my jenkins is up and running which i have created which i have installed through my playbook so it'll take little time so i'll just pause the video until then so uh my jenkins is up and running uh so the question was how to save only the last five builds because uh when you install jenkins so uh basically it it does have a dot jenkins folder in the background so where the file system of your jenkins is saved so there is a place so when all your build build information and everything the configurations of your job or configuration of your your jenkins file everything will be saved there only so like let's say one a project is there which is for two last two years so every one build for every day so that means 365 plus 365 which comes around like more than 750 bills so keeping like those many hold bills it doesn't make any sense so uh in that cases you you can ask the client or you can depending on client requirement you can keep only the last specified bills so by which like you can uh take off the memory that you will be used by this build files so before that so i'll go to my uh mission when i install my jenkins right so i'll go here so let me go to dot jenkins so folder so here is the place so when it will gonna store all your build uh things okay so there is something called as jobs folder right so inside this so there will be something called as a builds folder okay so here if you go ahead and if you see so i've created one job actually in that as you can see so there are like one two three six jobs there if i go ahead and if i run few more jobs see this is my job which is running so so now when i go ahead and again if i run it okay mvn clean so what it does it will gonna create one more uh build and if i go back to my machine if i do ls now again one more build will be created build folder so if i keep on adding up here so my memory is wasted so that's the reason i wanted to only keep the last five bills so how would you achieve that so there is there will be an option so when you click on configure and you will get an option so discard old bills so then you can say like maximum number of bills that you need to keep so when you say five so in my case i've asked as a five so when you say five and click save and then when you go back to this build with parameters and when you click on run now so all the things like one two three will be deleted upon like successful build only the last five bills will be stored take a little time so let's verify that as you can see see now one two three has been deleted so that you can do a long rotation wherein you don't need to keep all those the previous bills so whichever the new bills you wanted to keep them only so then you can by using this you can do it and you can also save the memory in your jenkins host okay so this is how when you want to keep only specific belts so then this is how you need to do it and then the next question is have you worked on jenkins file you you should say yes so nowadays like no one is using freestyle if they are using also they are trying to migrate it towards jenkins file which is pipeline and then uh can we use a docker as an agent so it is node but it is agent in declarative in a node in perspective scripting so i will gonna explain this with descriptive so that's the reason agent so we can yes we can use docker as agent in a jenkins file and the next sub part of this question is uh we will handle docker container creation and deletion the container creation and deletion by handle by jenkins itself so it automatically creates the container on top of that container it will gonna do the build so once the build is done so then it'll the container will be deleted okay and the next uh part of the question was i'm building a maven project let's say i'm building a maven project so whenever when i'm running a onto this particular job on a container so every time it will be a fresh instance as i said the docker container will be created by jenkins so once the build is successful and then it'll gonna delete it so let me show the logs so this particular job uses the container itself so before that let me go to jenkins file and let me show you uh how that jenkins file is so repo name is jenkins file in my bit of id so in this i have taken download branch as an example so let me go to develop branch here so jenkins file if you see the jenkins file so here i've used agent as stockhead so docker and what image i want to use because i am running a maven command so that's the reason i have used a maven image okay and if i go here and when i check the logs so as you can see it status the docker container at the beginning of the execution at the end so then it is stopping and removing as well the container so whenever the next bill comes again the new container and it will stop at the end and every time like it will be a fresh instance so whenever you execute on a fresh instance ambient install basically it will download everything so all the dependencies will be downloaded right so it will take much time so i wanted to avoid that so that is the uh the question is about so whenever i run for the second time so i should reduce the build times how we can achieve it so this is very simple so what we what we can do is so first what we need to do is on jenkins host first you need to download all the dependencies that your project uses so assume like so in my case now uh my jenkins host is this one right so here if you see uh in dot m2 already i have all the dependencies because this project i have ran previously right so everything i have correct so what i can do all this repository can be copied onto the container so so then when i copy on to the container then it can use these dependencies in the local repository of the container and then it can take less time right so that we can do it so for that what we need to do is we need to add one line so that is we need to add args arguments basically args and then we need to give hyphen v and we need to give the dot m2 folder so this is my dot m2 folder on the host so then i'm copying on to my container the container also as you can see so i've ran now so let me go here and when i run build with parameter when i select here it basically runs ambient install in the background okay so jenkins file is like when you select uh install it will execute mba install let me commit these changes first so when you see here the locks of it so it is keeping see it will take a lot of time because it is downloading all the dependencies as you can see it took 11 seconds to execute and it is placing root or dot m2 so in my container also the dot m2 folder is present in root okay so now if i run ideally it should take very less time so when i run mvn install now it should ideally it should take very very less time so compared to the last time uh the execution time so again it is downloading few of the dependencies so let's check yeah as you can see previously it has taken i guess 10 seconds now it has reduced to 5 seconds okay so this is how you can copy the dot m2 folder onto the container so that you can reduce the build time okay and the next thing is why we need a multi-branch pipeline so this i won't be i won't be creating it i'm just giving the so what is multi-branch pipeline so basically in every project there will be some branching strategy so all the stable branches shouldn't be tested by the developers or the test engineers so what they need to do is they need to create another branch out of master or a develop so then they need to implement their features and then uh they'll rise apr uh it will be reviewed by your managers and senior people then it will be merged back so some kind of testing should be there in your branches so right on your branches as well so multi branch pipeline is one of the uh very important job type in uh in these days so wherein it will create each job for each branch okay so multi branch pipeline what it does it all automatically discovers manages and execute pipelines for each branch okay and also one mandatory thing is each branch should have jenkins file if you branch don't have jenkins file so then it is not it it won't create a branch job for that particular branch okay and uh so this is the official link so when uh it gives like how we can create multi branch pipeline and it gives the example it has shown they have given um very uh brief about like how we can create and or what is multi-branch pipeline is okay and then next question is if you forget jenkins password how would you log in back this is not logging back so how will you go back to your jenkins screen so this is very simple so as i said so it will be like your jenkins file jenkins will be running on the submission right so basically that will have a back back-end file system so when i go to that particular folder dot jenkins okay so let me go there so there will be something called as config.xml okay when i go to this particular file there will be something called as use security okay so when you just make this particular value of to false okay so this is by default it will be true so what i can do is i'll just do this particular value to false and uh so if i go back to my jenkins so here you can see there will be log out button when i do log out it will it'll by default it'll redirect me to sign in page what i'll do i'll just stop that process in my mission ps iphone eaf to list all the active processes there are many processes which are running i need to identify what my jenkins process id is so my jenkins process id is uh so this one because this run i have run through my ansible playbook right so this is my process id so i'll just gonna kill this one kill iphone 9 and then this process id so when i give this one so that jenkins i won't be uh access it now right so as you can see it's still rotating now what i can do is i can go back to my home folder because i know where my jenkins file jar file is so i can go there and i can start my jenkins again java iphone jar jenkins.org okay it will take a little time so as you can see it is referring to a root directory in dot jenkins uh folder so now when i refresh it so i should be directly going into the dashboard rather than going to sign signup page okay so it will take little time to get started so also config.yml so that is what i mentioned so that is very important so when you when you are dealing with like if you want to change any settings then you can use that config.xml so if you want to copy those uh settings like from your machine to another local machine your friends like what are all the uh settings that you did i need it in my system so you can take that config.xml and give it to m so that is also possible okay so as you can see now the no login screen directly onto the dashboard so if you want to enable again that particular signing page so then you need to set that particular value to true and then you reload it and next things and docker so the first question and docker was uh any three best practices of docker so there are many best practices so i've listed few of them the first one is always keep docker file in an empty directory and make sure so if at all if it if it is with some files so make sure those files are required for your image creation okay because so when you just like let me go to uh some of the mission which has docker installed so i'll just stop it jenkins now because we don't need it now let me clear the screen okay so when now i'm in some directory right so when i execute before that i will gonna check whether docker is installed or not docker version yes docker is installed so now so let me create a simple docker file so va docker file and then when i give a from let me insert it from i'll just take a simple image busy box and then i'll uh do a run um and then i'm just doing a touch a i'm just creating a file on the image that's all when i do docker build so what it does is for me and when i give dot so it will what it does whatever the files which are there in that particular directory so the docker context we will call right so in dart in the sense like present working folder if i supply dot okay what it does what it does is basically it will send it will try to send what are all the files it's present in this particular directory to the docker demon so in my case there is a jenkins.org so that's the reason it is taking 67.4 mb right so like what i'll do is now let me what i'll do is so let me create one more folder mkdir and i'll create a docker folder uh inside this docker folder so what i'll do is be a docker file again okay so here again i'll just take the same steps from busy box and i'll just run a command touch a okay so when i do this one so again when i do a docker build on this particular thing so now it will take very less time and also it will send only 2 kb because i don't have any files in this directory so that's the reason so whenever you're running your docker file make sure you're running it in an empty folder are where you have some files which you need to be copied onto your image okay this is by which like we can avoid unnecessary uh things that you're sending it to your docker demon it saves your time and also data and the next thing is use official images as you can see on the screen so always like what uh so rather than taking a debian image and installing jd canva and running your application you just take open jdk image and run your application by which you can take off lot of the image layerings and then you can you can take it it will create a lot of size as well because you're taking some image on top of that you're installing jdk let's say your debian image is 500 mb on top of that you are installing jdk as you know like it is for 300 mb again it will uh add up like three more uh three more 300 more mb right it comes up to 800 mb so an open jdk if you directly use it like all the configuration will be done by them and it will be very minimal and so the open jdk image can be very less size less inside so that's the reason use official images whenever it is possible and use more specific tags so rather than install giving like latest stack so always suggested like use a proper tag because like let's say you have created a docker file now so i've used the latest tag so then you're rebuilding your docker file again in the next year assume like next three months so now the latest version in docker file talk open jdk is eight so now when you run it in next year so the open jdk the latest version is the night so when you give latest tags so what it does uh talker assumes like there is latest image already there in my cache so i'll use that only so in the background so it is wrong right so it is like it is eight only but you you are thinking that as a nine so that's the reason so it is always better like specific more specific contacts and look for minimal flavors so docker is one of the advantage of doctor is the image size is very less compared to the virtual machines so whenever you're creating your docker images custom docker images always look for a minimal flavors so as you can see in the table so if you take over jdk it is 624 mb so if you don't want that you just need it for a simple usage so then you can go for alpha and images and which is very less in size so always all fine images will be less in size you can use that and then you can reduce your image size and also multi-stage builds so again which reduces the size of your image so when you have like in this example whatever the what they have did is so they're using a maven image they're building their code and they're using again open jdk and they're capping copying the whatever the executable file they have generated in the previous uh image cache and copying onto the scene so if you don't uh use this multi-stage so then you need to take some ubuntu image install mavin open jdk on that rls like take mavin and install open jdk so it adds up the image size so if you follow this one so it will consider only open jdk image size that's all okay so this is how we can reduce the immediate size as well so there are a couple of other good practices as well so i've just just listed few the next thing is a docker uh difference between docker stop and docker kill so both the commands are used for uh stopping uh your containers okay to make sure the processes that you're running in your container to stop that to make sure your container has stopped in state okay so exited in state so for that so what i'll do is so let me take one more prompt of this particular uh basic ubuntu thing so let me take this basic open tool uh it is coming up i guess let me what i'll do refresh this one uh yes now i have two things so the basic ubuntu basic ubuntu because i wanted to show the parallely so when you just give a command docker events so you can see the live events uh so what is happening in your docker host so like let's say when you when i do docker ps uh so sorry put that docker ps so i don't have oh i have many uh running containers so what i'll do is i'll gonna create one more command okay one more uh so when i show you like this so when i do docker or run iphone d i'm just creating a busy box uh thing so busy box and then bin such okay so it will gonna create a container as you can see you can see the live events when you do what docker events okay so now what i'll do docker ps i'll do so now as you can see busy blocks is there so when i execute docker or stop and when i give a container id so what it does basically it sends two kinds of signals so one is first it executes a signal 15 so it will give 10 seconds of grace period to a container to main process to end so it will give some grace period so by which like uh meanwhile so it can now uh take some time and it can finish that that's work and then kill the kill signal nine okay so when it comes to a docker kill it's directly killing like it doesn't give any grace period for docker containers process to execute it work so what i'll do i'll just start my container again docker start and i'll just give the container id okay so now when i do docker ps so i'll be able to see that part again okay so now uh docker uh kill and then uh if i give this particular android id as you can see it says like um it sends a signal line directly in case of docker stop it it sends signal 15 at signal line and in case of docker kill so it's directly sends a signal 9 so it doesn't give any grace time for container to finish its work okay so that is a basic difference so as you can see docker stop will sense the signal or trim and then signal kill so when in docker kill directly sends signal and also if you want to send any custom signals by using docker kill you can send that command to list the containers which in a state exited so there are comments so docker ps iphone a iphone f is filter so if status is equal to running so then if you want only the running containers then you can use this because when you execute docker ps it will give running containers so when you execute docker ps iphone a it will give running and exited like if i want only exited so then you can use this particular option and if you want to remove only the stopped container so then this is how you can do it and command to clean up or the docker host deleting stopped containers tangling images everything so the command for that is docker system prone so when you do a docker system okay so it will it'll execute it will delete basically stopped containers networks dangling images everything so it is better like always to do because if you if your stopped container sitting for a long time so it will consume lot of memory so it's better like stop that and then uh the next is what version docker you have used so it is always better like what version docker you have used and also better or no you just read about the release notes of that particular docker version what are all the things has been used and what are all the things that a particular version has been changed so those things are it's better to see it okay and the next thing is uh can we have a multiple cmds in dockerfile you can have it but it's uh it's uh no use like when you have multiple cmds only the last cmd will be taken into account so multiple cmds if you have it it is no use only the last thing will be taken care into account and uh have you worked on docker swarm and docker compost yeah so docker's form is similar to kubernetes so it is group of physical servers or virtual machines so that are running or so docker applications if you want to configure as a cluster and if you want to uh orchestrate your containers so you need to go for a docker sound so very compose it is used for if you have multi container applications like let's say you have some mysql application mysql database and some other application if you are using so in that case you can go for docker compose and you can uh write your multi-container docker application and next it was on kubernetes so kubernetes questions so the first question was uh can we have a multiple containers in a board yes we can have a multiple containers uh in a pod so can we have a similar containers in a port so no so like let's say you are running a abc container so with the image similar container in the sense like the container which is created by the same image or the same process no similar containers can't be there in a single part because pod is a individual unit which runs a a specific container okay but you can have a multiple containers like any container sidecar containers which is like support for your application container okay so you can't have similar containers which is running in your pod okay so now like let's say i i have four containers one of them has failed so how would you check which container has failed okay so for that uh for this uh i have already uh my kubernetes cluster is up and running so what i'll do is i'll go to kubernetes master and uh so when i execute qctl so i'm just checking whether cube ctl is installed or not yes it is installed so now when i execute so let me increase the font uh so when i execute i have already cloned kubernetes project so here i have lot of examples so when i create cube cdl apply hyphen f and when i give this particular folder so whatever the object files are there in that particular one it will be created okay so now when i do cube cpl get all so as you can see uh one uh pod is running but other things are like which is errored out so i want to check so on upon which container creation it is erroring out okay so to check that so the command is very simple so you can use a describe command so that is what the question is how will you check if something fails okay so that is a cube ctrl ctrl before that i'll do a get all uh first so then cube ctrl and then describe odd and then i need to give the partner in my case any of the part i'll give so when i execute this one so you'll be able to see now you can see so this is the sidecar container so this is the name of my container if you see here so it says like something error image so this is the reason the state is waiting so if you see another container which is already up and running and it doesn't have any issues as you can see the restart count is zero exit code is zero if the exit code is zero so then your application is successfully running that is what it means okay so if you if something is going on wrong so you will be able to see in a described logs as well okay so this is how some control is not running if it is failed so you can check it like this and what is liveness and readiness pro so liveness and readiness probe is used to make your application highly available so i mean i have answered the second part of the second part of the question why we need them to make your application highly available you use liveness and readiness pro so i have a detailed video about liveness and readiness pro so liveness pro probe is basically used for uh restarting container whenever it uh it is unresponsive it can be many cases it can it can be application a infinite loop issue or some memory issue it can be anything so if container will be unresponsive so liveness probe make sure it will be restarted so when it comes to readiness pro so when you start your container when you execute your container so even before your container starts so it says like pod one out of one but actually in the background so it it it actually it is not running because it will take a little time to start your process right like let's say you are running some java process it will it will take 20 20 to 25 seconds okay so before uh 25 seconds it won't accept any if it accepts the request it won't be able to serve it right so until unless your container is ready it shouldn't allow the traffic so readiness probe make sure so until unless your container is ready it won't accept any traffic okay so that is the combination of lightness and readiness probe is always increased or to make your application highly available i have a detailed video because uh if you want to show those things it will take a little time so it will at least take 15 to 15 to 20 minutes so that's the reason i'm just giving what is uh liveness and readiness pro there are videos in my channel wherein i have explained liveness and readiness probe in detail the next one have you worked on kubernetes monitoring which tools have you used so yes kubernetes is uh microservice and it is dynamic in nature so we don't know when a port comes up when port goes off like you need to know why the pod recreation is happening and why it is failing as well and so when you deal with micro services you'll you'll obviously have a lot of applications to deal with so in that case monitoring is very important yes you can say there are many monitoring solutions the famous ones are by using prometheus and graphana and you can say elk statue used for monitoring again uh so i have videos on these things as well so i'm not promoting my videos i'm just telling because uh it will take a lot of time to explain so actually at least as i've mentioned 20 to 25 minutes it will take so that's the reason i'm just mentioning it and i have a detailed videos for these things okay and uh can we deploy a port onto a particular node yes we can do that um for this there are many ways like uh there is a node selector uh node affinity attains tolerations many concepts are there so i am going with the node selector because my question is very simple so when can we deploy a particular node on a particular node so what i'll do is uh before that so let me clean my cube cdl uh workspace means like i'll gonna delete all the things get all and let the cube ctrl delete and i'll give a deployment name and also this part i don't know how it has been created so i'm gonna delete those things as well so let me clear the screen and now okay it's taking a little time to delete everything so now my thing has been cleared so now when i now execute so i have already one file which is spot.yml so wherein i have node selector so before executing this so you need to label your a node so when you do a cube ctfc in my case qctl get nodes there are two nodes attached to my ansible master sorry kubernetes master which is basic ubuntu and ansible master so you need to label your uh node first by using this command i've labeled already cube ctl label nodes basic ubuntu my mission name and the label size is equals to medium and also when you're in your pod.yml so you need to specify one tag which is node selector uh so where i am specifying that tag okay so now uh i i'm again for making sure i'm just seeing like any parts are there or not yes i don't have any parts now what i'll do is cube cdl apply iphone f and uh dot yml so it has been created cube cto get all and when i see this one so there is one more option hyphen o wide you can use this so when it shows like on which node it has been scheduled so that is what my requirement was i wanted to schedule it on particular node so which is in my case basic iot ubuntu so i have successfully able to uh run my pod on this basic ubuntu machine okay so this is a uh so we can do it so i have that in my github repo if you are interested you can fork that as well and you can work on it and yeah so that's all so thank you uh so it was a big video and also one more thing i wanted to um ask you like if you have any suggestions that uh if i want to improve on anything like the way i answer so you can always do comment on the comment section and let me know so yeah that's all for this video i guess it was a long video so thanks for watching have a good day bye
Info
Channel: Deekshith SN
Views: 114,768
Rating: undefined out of 5
Keywords: Devops, DevopsInterview
Id: 5w8qVukxXXY
Channel Id: undefined
Length: 89min 56sec (5396 seconds)
Published: Thu Jul 23 2020
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.