Happy Bear Software

Beginners system administration skills list

Code tutorials for new developers spend a lot of time on writing code and building applications. I don't think many new developers are being guided towards managing their own servers. Most tutorials targeting new developers get them to deploy their applications to a PaaS like Heroku.

In the interest of cultivating a well-balanced skill-set, after getting a basic feel for the command line I think new developers should have at least some exposure to setting up and running servers.

Here's what I'd recommend new developers learn how to do:

Connecting to remote servers with SSH. There's no way to interact with servers in a data centre without SSH. This would include setting up SSH, connecting to a server with it and perhaps deactivating password based authentication.

User management. This means creating, removing and modifying users on a Unix system. This would include understanding how groups work.

Working with file permissions. Granting/removing different levels of access to different parts of the file system with chmod and chown. Knowing how to read file permission bits is a big step towards removing fear of this.

Init systems. Configuring them to start/stop processes at specified run levels. Starting and stopping services interactively.

Configuring a firewall. Understanding the need for a firewall and how to limit inbound network traffic to specific ports.

Basic monitoring. Understanding the free memory, disk usage, load average and other metrics for how well a server is performing.

Configuring a web server to serve static files. There are probably millions of things that you could use a server for but most of us are in it to serve web on port 80. Setting up a web server allows you to do that.

Package manager. Know how to install software packages and keep them up to date.

Static file deployment. Once you've set up a static web server, you need some automated method of updating that website. For a static website, this can be as simple as using rsync to keep the files up to date.

Dynamic web application deployment. Deploying a dynamic web application is usually more involved. There are many tools to help you automate the process and you should learn to use one of them.

Configuration management. There are many modern options for automating the entire process of setting up and deploying to a server. I like Ansible, but Puppet, Chef and SaltStack are also perfectly good tools. Learning one of them and using it to consider servers will result in much easier to maintain servers.

There's a lot to add to this list (backups, virtualization etc), but these are what I'd consider the absolute basics.

Note: Many refer to these skills as "ops" or "devops". I'm still not entirely sure what these words mean, so I'm going to stick with what I know and call it "system administration" for now.