Add questions and exercises

In addition, move shell scripting questions into a separate file.
This commit is contained in:
abregman 2021-11-12 14:43:38 +02:00
parent 432552549a
commit 8b0360e13c
5 changed files with 338 additions and 267 deletions

268
README.md
View File

@ -2,7 +2,7 @@
:information_source:  This repo contains questions and exercises on various technical topics, sometimes related to DevOps and SRE :)
:bar_chart:  There are currently **1962** questions
:bar_chart:  There are currently **1999** questions
:books:  To learn more about DevOps and SRE, check the resources in [devops-resources](https://github.com/bregman-arie/devops-resources) repository
@ -32,7 +32,7 @@
<td align="center"><a href="#programming"><img src="images/programming.png" width="75px;" height="75px;" alt="programming"/><br /><b>Programming</b></a></td>
<td align="center"><a href="#python"><img src="images/python.png" width="80px;" height="75px;" alt="Python"/><br /><b>Python</b></a></td>
<td align="center"><a href="#go"><img src="images/Go.png" width="75px;" height="75px;" alt="go"/><br /><b>Go</b></a></td>
<td align="center"><a href="#shell-scripting"><img src="images/bash.png" width="70px;" height="75px;" alt="Bash"/><br /><b>Shell Scripting</b></a></td>
<td align="center"><a href="exercises/shell/README.md"><img src="images/bash.png" width="70px;" height="75px;" alt="Bash"/><br /><b>Shell Scripting</b></a></td>
<td align="center"><a href="#kubernetes"><img src="images/kubernetes.png" width="75px;" height="75px;" alt="kubernetes"/><br /><b>Kubernetes</b></a></td>
<td align="center"><a href="#prometheus"><img src="images/prometheus.png" width="75px;" height="75px;" alt="Prometheus"/><br /><b>Prometheus</b></a></td>
</tr>
@ -5313,270 +5313,6 @@ If more pods are running than needed -> it deletes some of them<br>
If not enough pods are running -> it creates more
</b></details>
## Shell Scripting
### Shell Scripting Exercises
|Name|Topic|Objective & Instructions|Solution|Comments|
|--------|--------|------|----|----|
|Hello World|Variables|[Exercise](exercises/shell/hello_world.md)|[Solution](exercises/shell/solutions/hello_world.md) | Basic
|Basic date|Variables|[Exercise](exercises/shell/basic_date.md)|[Solution](exercises/shell/solutions/basic_date.md) | Basic
|Great Day|Variables|[Exercise](exercises/shell/great_day.md)|[Solution](exercises/shell/solutions/great_day.md) | Basic
|Factors|Arithmetic|[Exercise](exercises/shell/factors.md)|[Solution](exercises/shell/solutions/factors.md) | Basic
|Argument Check|Conditionals|[Exercise](exercises/shell/argument_check.md)|[Solution](exercises/shell/solutions/argument_check.md) | Basic
|Files Size|For Loops|[Exercise](exercises/shell/files_size.md)|[Solution](exercises/shell/solutions/files_size.md) | Basic
|Count Chars|Input + While Loops|[Exercise](exercises/shell/count_chars.md)|[Solution](exercises/shell/solutions/count_chars.md) | Basic
|Sum|Functions|[Exercise](exercises/shell/sum.md)|[Solution](exercises/shell/solutions/sum.md) | Basic
|Number of Arguments|Case Statement|[Exercise](exercises/shell/num_of_args.md)|[Solution](exercises/shell/solutions/num_of_args.md) | Basic
|Empty Files|Misc|[Exercise](exercises/shell/empty_files.md)|[Solution](exercises/shell/solutions/empty_files.md) | Basic
|Directories Comparison|Misc|[Exercise](exercises/shell/directories_comparison.md)| :( | Basic
|It's alive!|Misc|[Exercise](exercises/shell/host_status.md)|[Solution](exercises/shell/solutions/host_status.md) | Intermediate
## Shell Scripting - Self Assessment
<details>
<summary>What does this line in shell scripts means?: <code>#!/bin/bash</code></summary><br><b>
`#!/bin/bash` is She-bang
/bin/bash is the most common shell used as default shell for user login of the linux system. The shells name is an acronym for Bourne-again shell. Bash can execute the vast majority of scripts and thus is widely used because it has more features, is well developed and better syntax.
</b></details>
<details>
<summary>True or False? When a certain command/line fails in a shell script, the shell script, by default, will exit and stop running</summary><br><b>
Depends on the language and settings used.
If the script is a bash script then this statement is true. When a script written in Bash fails to run a certain command it will keep running and will execute all other commands mentioned after the command which failed.
Most of the time we might actually want the opposite to happen. In order to make Bash exist when a specific command fails, use 'set -e' in your script.
</b></details>
<details>
<summary>What do you tend to include in every script you write?</summary><br><b>
Few example:
* Comments on how to run it and/or what it does
* If a shell script, adding "set -e" since I want the script to exit if a certain command failed
You can have an entirely different answer. It's based only on your experience and preferences.
</b></details>
<details>
<summary>Today we have tools and technologies like Ansible, Puppet, Chef, ... Why would someone still use shell scripting?</summary><br><b>
* Speed
* Flexibility
* The module we need doesn't exist (perhaps a weak point because most CM technologies allow to use what is known as "shell" module)
* We are delivering the scripts to customers who don't have access to the public network and don't necessarily have Ansible installed on their systems.
</b></details>
#### Shell Scripting - Variables
<details>
<summary>How to define a variable with the value "Hello World"?</summary><br><b>
`HW="Hello World`
</b></details>
<details>
<summary>How to define a variable with the value of the current date?</summary><br><b>
`DATE=$(date)`
</b></details>
<details>
<summary>How to print the first argument passed to a script?</summary><br><b>
`echo $1`
</b></details>
<details>
<summary>Write a script to print "yay" unless an argument was passed and then print that argument</summary><br><b>
```
echo "${1:-yay}"
```
</b></details>
<details>
<summary>What would be the output of the following script?
```
#!/usr/bin/env bash
NINJA_TURTLE=Donatello
function the_best_ninja_turtle {
local NINJA_TURTLE=Michelangelo
echo $NINJA_TURTLE
}
NINJA_TURTLE=Raphael
the_best_ninja_turtle
```
</summary><br><b>
Michelangelo
</b></details>
<details>
<summary>Explain what would be the result of each command:
* <code>echo $0</code>
* <code>echo $?</code>
* <code>echo $$</code>
* <code>echo $#</code></summary><br><b>
</b></details>
<details>
<summary>What is <code>$@</code>?</summary><br><b>
</b></details>
<details>
<summary>What is difference between <code>$@</code> and <code>$*</code>?</summary><br><b>
`$@` is an array of all the arguments passed to the script
`$*` is a single string of all the arguments passed to the script
</b></details>
<details>
<summary>How do you get input from the user in shell scripts?</summary><br><b>
Using the keyword <code>read</code> so for example <code>read x</code> will wait for user input and will store it in the variable x.
</b></details>
<details>
<summary>How to compare variables length?</summary><br><b>
```
if [ ${#1} -ne ${#2} ]; then
...
```
</b></details>
#### Shell Scripting - Conditionals
<details>
<summary>Explain conditionals and demonstrate how to use them</summary><br><b>
</b></details>
<details>
<summary>In shell scripting, how to negate a conditional?</summary><br><b>
</b></details>
<details>
<summary>In shell scripting, how to check if a given argument is a number?</summary><br><b>
```
regex='^[0-9]+$'
if [[ ${var//*.} =~ $regex ]]; then
...
```
</b></details>
#### Shell Scripting - Arithmetic Operations
<details>
<summary>How to perform arithmetic operations on numbers?</summary><br><b>
One way: `$(( 1 + 2 ))`
Another way: `expr 1 + 2`
</b></details>
<details>
<summary>How to perform arithmetic operations on numbers?</summary><br><b>
</b></details>
<details>
<summary>How to check if a given number has 4 as a factor?</summary><br><b>
`if [ $(($1 % 4)) -eq 0 ]; then`
</b></details>
#### Shell Scripting - Loops
<details>
<summary>What is a loop? What types of loops are you familiar with?</summary><br><b>
</b></details>
<details>
<summary>Demonstrate how to use loops</summary><br><b>
</b></details>
#### Shell Scripting - Troubleshooting
<details>
<summary>How do you debug shell scripts?</summary><br><b>
Answer depends on the language you are using for writing your scripts. If Bash is used for example then:
* Adding -x to the script I'm running in Bash
* Old good way of adding echo statements
If Python, then using pdb is very useful.
</b></details>
<details>
<summary>Running the following bash script, we don't get 2 as a result, why?
```
x = 2
echo $x
```
</summary><br><b>
Should be `x=2`
</b></details>
#### Shell Scripting - Substring
<details>
<summary>How to extract everything after the last dot in a string?</summary><br><b>
`${var//*.}`
</b></details>
<details>
<summary>How to extract everything before the last dot in a string?</summary><br><b>
${var%.*}
</b></details>
#### Shell Scripting - Misc
<details>
<summary>Generate 8 digit random number</summary><br><b>
shuf -i 9999999-99999999 -n 1
</b></details>
<details>
<summary>Can you give an example to some Bash best practices?</summary><br><b>
</b></details>
<details>
<summary>What is the ternary operator? How do you use it in bash?</summary><br><b>
A short way of using if/else. An example:
[[ $a = 1 ]] && b="yes, equal" || b="nope"
</b></details>
<details>
<summary>What does the following code do and when would you use it?
<code>diff <(ls /tmp) <(ls /var/tmp)</code>
</summary><br>
It is called 'process substitution'. It provides a way to pass the output of a command to another command when using a pipe <code>|</code> is not possible. It can be used when a command does not support <code>STDIN</code> or you need the output of multiple commands.
https://superuser.com/a/1060002/167769
</details>
<details>
<summary>What are you using for testing shell scripts?</summary><br><b>
bats
</b></details>
## SQL
### SQL Exercises

View File

@ -19,6 +19,7 @@
| Launch EC2 web instance | EC2 | [Exercise](launch_ec2_web_instance.md) | [Solution](solutions/launch_ec2_web_instance.md) | Easy |
| Security Groups | EC2 | [Exercise](security_groups.md) | [Solution](solutions/security_groups.md) | Easy |
| IAM Roles | EC2 + IAM | [Exercise](ec2_iam_roles.md) | [Solution](solutions/ec2_iam_roles.md) | Easy |
| Spot Instances | EC2 | [Exercise](create_spot_instances.md) | [Solution](solutions/create_spot_instances.md) | Easy |
#### AWS - Lambda
@ -352,6 +353,12 @@ On Demand is good for short-term non-interrupted workloads (but it also has the
Reserved instances: they are cheaper than on-demand and the instance is yours for the chosen period of time.
</b></details>
<details>
<summary>Which pricing model has potentially the biggest discount and what its advantage</summary><br><b>
Spot instances provide the biggest discount but has the disadvantage of risking losing them due bigger bid price.
</b></details>
<details>
<summary>You need an instance for two years, but only between 10:00-15:00 every day. Which pricing model would you use?</summary><br><b>
@ -434,7 +441,7 @@ EBS
</b></details>
<details>
<summary>What EC2 RI types are there?</summary><br><b>
<summary>What EC2 reserved instance types are there?</summary><br><b>
Standard RI - most significant discount + suited for steady-state usage
Convertible RI - discount + change attribute of RI + suited for steady-state usage
@ -443,6 +450,18 @@ Scheduled RI - launch within time windows you reserve
Learn more about EC2 RI [here](https://aws.amazon.com/ec2/pricing/reserved-instances)
</b></details>
<details>
<summary>For how long can reserved instances be reserved?</summary><br><b>
1 or 3 years.
</b></details>
<details>
<summary>What allows you to control inbound and outbound instance traffic?</summary><br><b>
Security Groups
</b></details>
<details>
<summary>What bootstrapping means and how to use it in AWS EC2?</summary><br><b>
@ -482,6 +501,14 @@ To terminate such instances, you must cancel the Spot instance request first.
Set of Spot instance and if you want, also on-demand instances.
</b></details>
<details>
<summary>What strategies are there to allocate Spot instances?</summary><br><b>
* lowestPrice: launch instances from the pool that has the lowest price
* diversified: distributed across all pools
* capacityOptimized: optimized based on the number of instances
</b></details>
#### AWS - Lambda
<details>

View File

@ -0,0 +1,9 @@
## AWS EC2 - Spot Instances
### Objectives
A. Create two Spot instances using a Spot Request with the following properties:
* Amazon Linux 2 AMI
* 2 instances as target capacity (at any given point of time) while each one has 2 vCPUs and 3 GiB RAM
B. Create a single Spot instance using Amazon Linux 2 and t2.micro

View File

@ -0,0 +1,35 @@
## AWS EC2 - Spot Instances
### Objectives
A. Create two Spot instances using a Spot Request with the following properties:
* Amazon Linux 2 AMI
* 2 instances as target capacity (at any given point of time) while each one has 2 vCPUs and 3 GiB RAM
B. Create a single Spot instance using Amazon Linux 2 and t2.micro
### Solution
A. Create Spot Fleets:
1. Go to EC2 service
2. Click on "Spot Requests"
3. Click on "Request Spot Instances" button
4. Set the following values for parameters:
* Amazon Linux 2 AMI
* Total target capacity -> 2
* Check "Maintain target capacity"
* vCPUs: 2
* Memory: 3 GiB RAM
5. Click on Launch
B. Create a single Spot instance:
1. Go to EC2 service
2. Click on "Instances"
3. Click on "Launch Instances"
4. Choose "Amazon Linux 2 AMI" and click on "Next"
5. Choose t2.micro and click on "Next: Configure Instance Details"
6. Select "Request Spot instances"
7. Set Maximum price above current price
8. Click on "Review and Launch"

264
exercises/shell/README.md Normal file
View File

@ -0,0 +1,264 @@
## Shell Scripting
### Shell Scripting Exercises
|Name|Topic|Objective & Instructions|Solution|Comments|
|--------|--------|------|----|----|
|Hello World|Variables|[Exercise](hello_world.md)|[Solution](solutions/hello_world.md) | Basic
|Basic date|Variables|[Exercise](basic_date.md)|[Solution](solutions/basic_date.md) | Basic
|Great Day|Variables|[Exercise](great_day.md)|[Solution](solutions/great_day.md) | Basic
|Factors|Arithmetic|[Exercise](factors.md)|[Solution](solutions/factors.md) | Basic
|Argument Check|Conditionals|[Exercise](argument_check.md)|[Solution](solutions/argument_check.md) | Basic
|Files Size|For Loops|[Exercise](files_size.md)|[Solution](solutions/files_size.md) | Basic
|Count Chars|Input + While Loops|[Exercise](count_chars.md)|[Solution](solutions/count_chars.md) | Basic
|Sum|Functions|[Exercise](sum.md)|[Solution](solutions/sum.md) | Basic
|Number of Arguments|Case Statement|[Exercise](num_of_args.md)|[Solution](solutions/num_of_args.md) | Basic
|Empty Files|Misc|[Exercise](empty_files.md)|[Solution](solutions/empty_files.md) | Basic
|Directories Comparison|Misc|[Exercise](directories_comparison.md)| :( | Basic
|It's alive!|Misc|[Exercise](host_status.md)|[Solution](solutions/host_status.md) | Intermediate
## Shell Scripting - Self Assessment
<details>
<summary>What does this line in shell scripts means?: <code>#!/bin/bash</code></summary><br><b>
`#!/bin/bash` is She-bang
/bin/bash is the most common shell used as default shell for user login of the linux system. The shells name is an acronym for Bourne-again shell. Bash can execute the vast majority of scripts and thus is widely used because it has more features, is well developed and better syntax.
</b></details>
<details>
<summary>True or False? When a certain command/line fails in a shell script, the shell script, by default, will exit and stop running</summary><br><b>
Depends on the language and settings used.
If the script is a bash script then this statement is true. When a script written in Bash fails to run a certain command it will keep running and will execute all other commands mentioned after the command which failed.
Most of the time we might actually want the opposite to happen. In order to make Bash exist when a specific command fails, use 'set -e' in your script.
</b></details>
<details>
<summary>What do you tend to include in every script you write?</summary><br><b>
Few example:
* Comments on how to run it and/or what it does
* If a shell script, adding "set -e" since I want the script to exit if a certain command failed
You can have an entirely different answer. It's based only on your experience and preferences.
</b></details>
<details>
<summary>Today we have tools and technologies like Ansible, Puppet, Chef, ... Why would someone still use shell scripting?</summary><br><b>
* Speed
* Flexibility
* The module we need doesn't exist (perhaps a weak point because most CM technologies allow to use what is known as "shell" module)
* We are delivering the scripts to customers who don't have access to the public network and don't necessarily have Ansible installed on their systems.
</b></details>
#### Shell Scripting - Variables
<details>
<summary>How to define a variable with the value "Hello World"?</summary><br><b>
`HW="Hello World`
</b></details>
<details>
<summary>How to define a variable with the value of the current date?</summary><br><b>
`DATE=$(date)`
</b></details>
<details>
<summary>How to print the first argument passed to a script?</summary><br><b>
`echo $1`
</b></details>
<details>
<summary>Write a script to print "yay" unless an argument was passed and then print that argument</summary><br><b>
```
echo "${1:-yay}"
```
</b></details>
<details>
<summary>What would be the output of the following script?
```
#!/usr/bin/env bash
NINJA_TURTLE=Donatello
function the_best_ninja_turtle {
local NINJA_TURTLE=Michelangelo
echo $NINJA_TURTLE
}
NINJA_TURTLE=Raphael
the_best_ninja_turtle
```
</summary><br><b>
Michelangelo
</b></details>
<details>
<summary>Explain what would be the result of each command:
* <code>echo $0</code>
* <code>echo $?</code>
* <code>echo $$</code>
* <code>echo $#</code></summary><br><b>
</b></details>
<details>
<summary>What is <code>$@</code>?</summary><br><b>
</b></details>
<details>
<summary>What is difference between <code>$@</code> and <code>$*</code>?</summary><br><b>
`$@` is an array of all the arguments passed to the script
`$*` is a single string of all the arguments passed to the script
</b></details>
<details>
<summary>How do you get input from the user in shell scripts?</summary><br><b>
Using the keyword <code>read</code> so for example <code>read x</code> will wait for user input and will store it in the variable x.
</b></details>
<details>
<summary>How to compare variables length?</summary><br><b>
```
if [ ${#1} -ne ${#2} ]; then
...
```
</b></details>
#### Shell Scripting - Conditionals
<details>
<summary>Explain conditionals and demonstrate how to use them</summary><br><b>
</b></details>
<details>
<summary>In shell scripting, how to negate a conditional?</summary><br><b>
</b></details>
<details>
<summary>In shell scripting, how to check if a given argument is a number?</summary><br><b>
```
regex='^[0-9]+$'
if [[ ${var//*.} =~ $regex ]]; then
...
```
</b></details>
#### Shell Scripting - Arithmetic Operations
<details>
<summary>How to perform arithmetic operations on numbers?</summary><br><b>
One way: `$(( 1 + 2 ))`
Another way: `expr 1 + 2`
</b></details>
<details>
<summary>How to perform arithmetic operations on numbers?</summary><br><b>
</b></details>
<details>
<summary>How to check if a given number has 4 as a factor?</summary><br><b>
`if [ $(($1 % 4)) -eq 0 ]; then`
</b></details>
#### Shell Scripting - Loops
<details>
<summary>What is a loop? What types of loops are you familiar with?</summary><br><b>
</b></details>
<details>
<summary>Demonstrate how to use loops</summary><br><b>
</b></details>
#### Shell Scripting - Troubleshooting
<details>
<summary>How do you debug shell scripts?</summary><br><b>
Answer depends on the language you are using for writing your scripts. If Bash is used for example then:
* Adding -x to the script I'm running in Bash
* Old good way of adding echo statements
If Python, then using pdb is very useful.
</b></details>
<details>
<summary>Running the following bash script, we don't get 2 as a result, why?
```
x = 2
echo $x
```
</summary><br><b>
Should be `x=2`
</b></details>
#### Shell Scripting - Substring
<details>
<summary>How to extract everything after the last dot in a string?</summary><br><b>
`${var//*.}`
</b></details>
<details>
<summary>How to extract everything before the last dot in a string?</summary><br><b>
${var%.*}
</b></details>
#### Shell Scripting - Misc
<details>
<summary>Generate 8 digit random number</summary><br><b>
shuf -i 9999999-99999999 -n 1
</b></details>
<details>
<summary>Can you give an example to some Bash best practices?</summary><br><b>
</b></details>
<details>
<summary>What is the ternary operator? How do you use it in bash?</summary><br><b>
A short way of using if/else. An example:
[[ $a = 1 ]] && b="yes, equal" || b="nope"
</b></details>
<details>
<summary>What does the following code do and when would you use it?
<code>diff <(ls /tmp) <(ls /var/tmp)</code>
</summary><br>
It is called 'process substitution'. It provides a way to pass the output of a command to another command when using a pipe <code>|</code> is not possible. It can be used when a command does not support <code>STDIN</code> or you need the output of multiple commands.
https://superuser.com/a/1060002/167769
</details>
<details>
<summary>What are you using for testing shell scripts?</summary><br><b>
bats
</b></details>