Changes

Jump to: navigation, search

OPS245 Lab 2

2,866 bytes removed, 14:35, 1 September 2021
m
Practice For Quizzes, Tests, Midterm & Final Exam
# <span style="background-color:yellow;">Repeat the steps as you did in the previous investigation ([https://wiki.cdot.senecacollege.ca/wiki/OPS235_Lab_2#Part_1:_Install_KVM_Virtualization_Application Investigation1 Part 1]) to '''stop and disable firewalld, install iptables-services, start and enable iptables''' for this newly-created VM.</span>
# <span style="background-color:yellow;">Repeat the steps as you did with c7host post-install to '''turn off (permissive) SELinux''' (using the command 'vi' instead of 'vim') and perform a '''yum update'''.</span>
# Issue the following command to obtain and record your centos3 centos2 IPADDR in your lab2 logbook: <b><code><span style="color:#3366CC;font-size:1.2em;">ip address show</span></code></b>
# Record the time taken to install, and compare this to the time taken by the previous installations in your lab2 logbook.
::* In order to fully back up a virtual machine, what information should be saved in addition to the virtual machine image?
=== Part 3: Using Shell Scripts the Command Line for VM Backup &amp; State Management===
{|width="40%" align="right" cellpadding="10"
|- valign="top"
|
{{Admon/tip|Bash Shell Scripting Tips:|<br>'''<u>Data Input</u>'''<br><ul><li>A shell script can obtain data from a number of methods: '''reading input files''', using '''arguments when issuing command''' (positional parameters), or '''prompting for data to store in a variable'''. The later method can be accomplished by using the '''read''' command.<br><br></li><li>Example:<br><br>''read -p "Enter your name: " userName''.<br><br></li></ul>'''<u>Mathematical Expressions</u>'''<br><ul><li>In the bash shell scripting, data is stored in variable as text, not other data types (ints, floats, chars, etc) like in compiled programs like C or Java. In order to have a shell script perform '''mathematical operations''', number or variable need to be surrounded by two sets of parenthesis '''((..))''' in order to convert a number stored as text to a binary number.<br><br></li><li>Examples<br><br>''var1&#61;5;var2&#61;10''<br>''echo "$var1 + $var2 &#61; $((var1+var2))"''<br><br>'''Note:''' shell does not perform floating point calculations (like '''5/10'''). Instead, other commands like '''awk''' or '''bc''' would be required for floating point calculations (decimals)<br><br></li></ul><u>'''Loops (for / while / until)'''</u><ul><li>Determinant loops (such as '''for''' loops) usually repeat for a preset number of times (eg. counts, positional parameters stored). In-determinant loops (such as '''while''' or '''until''' loops) may repeat based on unknown conditions (like waiting for user to enter correct data).<br><br></li><li>Conditional statements '''&amp;&amp;''' (run if previous command or test is true) and '''&#124;&#124;''' (run is previous command or test is false) can also be used when testing multiple conditions.<br><br></li><li>Examples:<br>''set ops235 is fun''<br>''for x''<br>''do''<br>&nbsp;''echo "argument is $x"''<br>''done''<br><br>''for x in $(ls)''<br>''do''<br> &nbsp;''echo "Filename: $x"''<br>''done''<br><br>''read -p "enter a whole number: " num''<br>''until echo $num &#124; grep -q "^[0-9][0-9]*$"''<br>''do''<br> &nbsp;''read -p "Incorrect. Please enter WHOLE NUMBER: " num''<br>''done''<br><br>''read -p "pick a number between 1 and 10: " num''<br>''while [ $num -lt 1 ] &#124;&#124; [ $num -gt 10 ]<br>''do''<br> &nbsp;''read -p "Incorrect. Please pick number between 1 and 10: " num''<br>''done''<br><br></li></ul>}}
|}
You will continue our use of the Bash Shell scripting by first creating a Bash Shell script that examining commands will allow the Linux sysadmin to select gather information about and manage their created VMs for backup to root's home directory. Afterwards you will download, view and run a couple Bash Shell scripts that use the virsh command to start and stop your virtual machinesVirtual Machines.
:'''Perform the following steps:'''
<ol><li value="4">Now, shut-down your centos1 VM normally, and close the centos1 VM window.</li><li>Switch to your terminal and issue the command: <b><code><span style="color:#3366CC;font-size:1.2em;">sudo virsh start centos1</span></code></b></li><li>Using the appropriate command check to see if your centos1 VM is now running.</li><li>There are other commands that can be used (such as '''suspend''', or '''shutdown'''). The "shutdown" command may not always work since it relies on the guest handling a particular ACPI event. Why do you think it is useful to have commands to manipulate VMs?</li></ol>
{{Admon/important|Virtual Machine Does not Shutdown from Command|If the Virtual machine fails to shutdown from the <code>virsh shutdown</code> command, then you can go to the '''Virtual Machine manager''' and '''halt''' or '''shutdown''' within the VM itself, then you can click the '''PowerOff''' button in the VM window. You'll want to avoid a forced shutdown since those are equivalent to yanking the power cord out of the wall on a physical machine!|}}
<ol><li value="8">Open a Bash shell terminal.</li><li>Use a text editor (such as <b><code><span style="color:#3366CC;font-size:1.2em;">vi</span></code></b> or <b><code><span style="color:#3366CC;font-size:1.2em;">nano</span></code></b>) to create a Bash Shell script called: <b><code><span style="color:#3366CC;font-size:1.2em;">backupVM.bash</span></code></b> in your '''bin''' directory.</li><li>Enter the following text content into your text-editing session:</li></ol><code style="color:#3366CC;font-family:courier;font-size:.9em;"><br>&#35;!/bin/bash  &#35; backupVM.bash<br>&#35; Purpose: Backs up pre-defined virtual machines<br>&#35;<br>&#35; USAGE: ./backupVM.bash<br>&#35;<br>&#35; Author: *** INSERT YOUR NAME ***<br>&#35; Date: *** CURRENT DATE ***  if [ $(whoami) != "root" ] # only runs if root<br>then<br>&nbsp;echo "You must be root" >&2<br>&nbsp;exit 1<br>fi</code><br><ol><li value="12">Save your editing session, but remain in the text editor.</li><li>This shell script is designed particularly for your centos1, centos2, and centos3 VMS.</li><li>The code displayed below will prompt the user if they wish for all VMs to be backed-up; otherwise, allow the user the option of specifying which VMs to be backed-up. Add the following code</li></ol><br><code style="color:#3366CC;font-family:courier;font-size:.9em;"> read -p "Backup all VMs? (y|n):" answer # prompt if all VMs to be backed-up if [ "$answer" = "y" ] # Backup all VMs if answer is yes<br>then<br>&nbsp;for num in 1 2 3 # Determinant loop for 3 arguments: 1, 2, and 3<br>&nbsp;do<br>&nbsp;&nbsp;echo "Backing up VM #$num"<br>&nbsp;&nbsp;gzip < /var/lib/libvirt/images/centos$num.qcow2 > ~/backups/centos$num.qcow2.gz<br><br>&nbsp;&nbsp;echo "VM #$num BACKUP DONE"<br>&nbsp;done<br><br>elif [ "$answer" = "n" ]<br>then<br>&nbsp;read -p "Which VM should be backed up? (1/2/3): " numanswer<br>&nbsp;until echo $numanswer | grep "^[123]$" >> /dev/null # Look for match of single digit: 1,2, or 3<br>&nbsp;do<br>&nbsp;&nbsp;read -p "Invalid Selection. Select 1, 2, or 3: " numanswer<br>&nbsp;done<br>&nbsp;echo "Backing up VM #$numanswer"<br>&nbsp;gzip < /var/lib/libvirt/images/centos$numanswer.qcow2 > ~/backups/centos$numanswer.qcow2.gz<br><br>&nbsp;echo "VM #$numanswer BACKUP DONE"<br>else<br>&nbsp;echo "Invalid Selection... Aborting program"<br>&nbsp;exit 2<br>fi </code>  <ol><li value="15">Save, set permissions, and then run that shell script to backup centos1. Since that script will only work if you are have root permissions, you will need to use the technique you learned earlier in this lab to run the command with elevated privileges. Confirm that this script did backup this image to your home directory</li><li>Use the <b><code>wget</code></b> command to download, study, and run the following shell scripts on-line:<blockquote><b><code><span style=" pointer-events:none;cursor:default;color:#3366CC;font-size:1.2em;">https://ict.senecacollege.ca/~ops245/labs/vm-start-text.bash<br>https://ict.senecacollege.ca/~ops245/labs/vm-stop-text.bash</span></code></b><br><b><code><span style=" pointer-events:none;cursor:default;color:#3366CC;font-size:1.2em;">https://ict.senecacollege.ca/~ops245/labs/vm-start.bash<br>https://ict.senecacollege.ca/~ops245/labs/vm-stop.bash</span></code></b></blockquote></li><li>Try to understand what these Bash Shell scripts do.</li></ol> 
'''Answer INVESTIGATION 3 observations / questions in your lab log book.'''
<li>Modify the if statement so it is just getting the current username, not the username and a newline. You can do this using several steps and several variables, but it can also be done in a single line.</li>
<li>Now that the script recognizes you as being root (or at least running the script with root permissions), it should work. Notice how we've used the + to combine several strings together to pass to the os.system command. We did this because this script needs the python variable to be evaluated before the whole line gets handed over to os.system. If you left the variable names inside the quotes, python will ignore them as just being part of a string. By putting them outside of a string, and concatenating their value to that string, we can evaluate them and feed them into that command.</li>
<li>Convert the rest Test your script to make sure it works. If it doesn't, go back and fix it. Do not continue until it successfully makes backups of your VMs.</li><li>There is a weakness to this script as written. Every time you run it, it will make a backup of all three VMs. But what if you only made a change to one of them? Do we really need to wait through a full backup cycle for two machines that didn't change? As the bash script above into pythonis currently written, then test we do. But we can make it better.</li><li>Before the for loop that backs up each machine add a prompt to ask the user if they want to back up all machines. Use an if statement to check if they said yes.<ul><li>if they did say yes, back up all the VMs using your python version existing for loop.</li><li>If they didn't say yes, do nothing for now.</li></ul></li><li>Test your script to make sure it works. Check what happens if you say 'yes' to the prompt, and check what happens if you say things other than 'yes'.</li><li>Now we have a script that asks the user if they want to back up all VMS, and if they say they do it does. But if they don't want to back up every VM, it currently does nothing.</li><li>Add an else statement to handle the user not wanting to back up every VM. Inside that else clause ask the user which VM they would like to back up (you can even give them the names of available VMs (Centos1, Centos2, Centos3).</li><li>Now nest and if statement inside that else so that your script can handle what your user just responded with. If they asked for Centos1, back up Centos1. If they want to back up Centos2, only back up Centos2, etc. Hint: You might want to use elif for this.</li><li>Test your script again. You should now have a script that:<ul><li>Makes sure the user is running the script with elevated permissions.</li><li>Asks the user if they want to back up every VM.</li><li>If they want to back up every VM, it backs up every VM.</li><li>If they user does not want to back up every VM, the script asks them which VM they do want to back up.</li><li>If they user selected a single VM, the script will back up that one VM.</li></ul></li>
</ol>
# List the steps to correctly restore your VMs from a USB disk to your c7host VM.
# How can you prompt the user for data and store into a variable?
# How do you perform mathematical operations in the Bash shell and within a Bash shell script?
# What is the difference between a determinant loop and an in-determinant loop?
# Show a few examples how loops can be used to error-check when prompting the user for data.
# What is the purpose of the '''&amp;&amp;''' and '''||''' symbols when used with logic?'
# What does the command '''rpm -qi centos-release''' do and why is it important?
# What is the difference between '''rpm -q centos-release''' and '''uname -a'''?
932
edits

Navigation menu