DevOps Engineer Interviews – Example Prescreen Questions

Background

While a DevOps engineer candidate’s aptitude should factor heavily into your team’s recruiting strategy (it deserves at least as much weighting as their experience with any specific tech stack), certain technology knowledge simply has to be there on Day 1. So is it ever too early to start funneling candidates on the hard technical dimensions?

Interviewing is big investment in time and effort. A great hire can have an immediate and lasting impact on your organization. But so can a misfire, right? For this reason, getting your internal recruiters involved upfront on things like technical questionnaires can save everyone (including the candidate, the recruiter and your team!) a number of cycles down the road.

A candidate is stating senior experience with Red Hat-based Linux OSes? Ask the recruiter to verbally prescreen the candidate on those questions below. Because either such a candidate knows how many bits are in a byte, or they’re probably not going to be a fit. It’s the same for any scripting languages for which they indicate expertise.

You’ll likely want to ask your recruiting colleagues to cover both Linux and the candidate’s preferred scripting language during the prescreen. So in addition to the one for Linux, I’ve included example questionnaires for both Python and Perl below.

Overall, an effective and efficient DevOps interview funnel might look like this:

  1. Resume review [DevOps leader].
  2. Technical prescreen, 10-15 minutes [tech recruiter].
  3. Technical phone interview, 30-45 minutes [senior DevOps team member].
  4. Onsite/video team interviews, 2-3 hours total [various DevOps team members; at least one internal dev/product team customer; and the DevOps leader, who should get preliminary feedback and then take the final interview slot].
  5. Offer.

Suggested Prescreen Passing Thresholds

  • 9-10: senior DevOps engineer candidate.
  • 6-8: midlevel.
  • 5: junior.

The Importance of Verbalizing Concepts

An ideal prescreen question is easy for a non-engineer to ask and easy for an engineer to answer– verbally.

(It’s also a good idea to ask the recruiter to transcribe and share with you the candidate’s answers, just in case the answer given is actually an acceptable alternative.)

Linux Prescreen Questionnaire 

1. On the bash shell, what does $? (“dollar sign question mark”) indicate?  

The exit status of the last command.

2. What’s the easiest way to determine the number of inodes (“eye nodes”) available on a file system? 

df -i

3. What is the process ID of init? 

1

4. What does ldd (“L-D-D”) do? 

list dynamic dependencies

5. What command lists the open ports on a system? 

netstat

6. What is the default run level of a running system (non X Window)? 

3

7. Where are failed login attempts logged by default? 

/var/log/btmp or /var/log/secure

8. What are the default file permissions if the umask is 022? 

644

9. How many bits are in a byte? 

8

10. What port number does DNS use by default? 

53

Python Coding Prescreen Questionnaire 

1. What’s the syntax for importing only the “date” submodule of the “datetime” module?

from datetime import date

2. In terms of error handling, what are the three clauses which can follow a try statement?

except/else/finally

3. Which of these are mutable and which are immutable? lists, sets, tuples.

mutable: lists, sets 

immutable: tuples

4. What is the syntax for declaring a function called “timer”?

def timer():

5. What would print(‘hi’ + 3) produce?

An error.

6. What would print(‘hi’ * 3) produce?

“hihihi” (it will print the word “hi” three times.)

7. What file extension does Python store its bytecode in?

.pyc

8. How can you print only the final element of a list named “groceries”, when you don’t know how many elements there are?

groceries[-1]

9. How can you determine the length of a string named “email”?

len(email)

10. How would you run a Bash command such as “uptime” within the Python interpreter (either single or double quotes are OK in the candidate’s answer)?

import os

os.system(‘uptime’) 

…OR…

from os import system

system(‘uptime’)

Perl Coding Prescreen Questionnaire

1. What variable types are there?

Scalar, Array, Hash

2. How do you debug a Perl script on the command line?

use “-d” switch

3. How do you remove the last element of an array?

pop function

4. What switch is used to execute Perl code on the command line?

either “-e” or “-E

5. What is the operator used for Perl regular expression substitution?

"s", for example "s/foo/bar/"

6. How do you access parameters passed to a subroutine?

"@_"

7. How do you declare a variable when the strict pragma is used?

prefix the variable with “my

8. What function is used to return a specific non-zero value?

exit, NOT die

9. When you require a module in Perl do you need specify the extension?

Yes

10. What is used to execute an external command from a perlscript and capture the output of the command?

backticks, for example: $system_uptime = `uptime`

Level Up Technology Blog Post on Ansible Jira Integration

Check out the Level Up team’s latest Ansible Pro Tips post: “Simplify Your Jira Change Management Processes Via Ansible Playbooks“.

Highlights (bolds are mine):

A big way in which we typically measure success with DevOps has to do with integration.”

“…there is almost always at least a small amount of coding required to help you maximize your ROI in connecting the technologies you have with whatever you decide to build or buy next. Jira offers a good example of how a small amount of coding can have a big impact.”

“…as a guiding principle, you want your tools to enforce your processes. Not the other way around. If you are using Ansible, there’s a great opportunity to enforce more of your technology and governance processes without anybody having to remember to do anything except the task itself.”

“And this Jira module is flexible in terms of working with whatever your custom issue types and statuses might be as well. But hopefully as you can see, this is the type of straightforward, module-level integration that your organization can start taking advantage of to increase ROI and let the platform do the hard stuff when it comes to change management via Ansible right now, today.”

Level Up Technology Blog Post on Custom ansible-lint Rules

Inspired by a great audience question at our last meetup… check out the Level Up team’s latest blog post: “Express Your Team’s Infrastructure Code Standards Using Custom ansible-lint Rules“.

A few highlights:

  • “The Ansible by Red Hat project currently maintains ansible-lint as a way to communicate its summary view of global default best practices and “syntactic sugar” to the wider community”
  • “Granted, your team may not always end up agreeing with ansible-lint’s default worldview. Which is totally fine. There are both runtime (the -x flag) and config file options available to exclude rules either by the rule ID or any matching tag. If and when you encounter false-positives, or have other reasons to want to reduce warning “noise” in your linting efforts, you can simply share your ansible-lint config files somewhere like GitHub that the rest of your team can consume as well.”
  • “ansible-lint becomes super-charged when you combine its default rules with custom rules created by you and your team”