337 lines
14 KiB
Markdown
337 lines
14 KiB
Markdown
|
---
|
||
|
title: "Dear ops, it's 2019 and you need dev skills"
|
||
|
subtitle: "Evolve, or die in pain"
|
||
|
date: 2019-06-21
|
||
|
draft: false
|
||
|
tags: [ops, dev, devops, opinion]
|
||
|
---
|
||
|
|
||
|
# To infinity... and beyond!
|
||
|
|
||
|
DevOps, IaC, AGILE, SCRUM, Containers, SysOps, CI/CD, microservices, serverless, FAAS
|
||
|
|
||
|
Yes, it's a buzzwords **shitstorm** but all of these concepts summarize how
|
||
|
_software development_ and _deployment_ evolves. Do i think that sysadmins
|
||
|
time is over ? **No**.
|
||
|
|
||
|
But time as come, _we_, as sysadmins, have to adapt to this moving
|
||
|
industry.
|
||
|
|
||
|
Accept it or die, but [cloud
|
||
|
computing](https://en.wikipedia.org/wiki/Cloud_computing) is the norm now.
|
||
|
Small IT companies with "good old LAMP" as the only business model will die
|
||
|
soon.
|
||
|
|
||
|
Dont' be scared, take a deep breathe and let's dive into this !
|
||
|
|
||
|
# DevOps is the new sexy
|
||
|
|
||
|
## DevOps = "Dev" + "Ops"
|
||
|
|
||
|
_DevOps_, _SecDevOps_, _DevOps Enginner_ are the most used terms in job
|
||
|
requests. But, after all, what the fuck is that shit ?
|
||
|
|
||
|
In most cases, IT projets human resources can be split into two teams :
|
||
|
|
||
|
- [Dev](https://en.wikipedia.org/wiki/Programmer) : This team write
|
||
|
application code. Pushed by marketing teams, clients or users, the main
|
||
|
purpose of the dev team is **adding new feature** to the software.
|
||
|
|
||
|
- [Ops](https://en.wikipedia.org/wiki/System_administrator) : This team have
|
||
|
to maintain operational conditions and ensure that **prod is up, up to date
|
||
|
and stable**.
|
||
|
|
||
|
By means, this two job positions are in conflict. On one side, ops team wants
|
||
|
stable and predictable stuff, on the other side, dev team wants liberty to
|
||
|
move quickly in order to add new features and meet commercial goals and
|
||
|
objectives.
|
||
|
|
||
|
What could be done to satisfy both worlds ? **DevOps**
|
||
|
|
||
|
## DevOps culture
|
||
|
|
||
|
First of all, no, DevOps is not a job title _(even if everyone on LinkedIn
|
||
|
thinks so)_. It's a culture, a way of thinking and the more important point
|
||
|
of this is : it tells how to organize software development teams.
|
||
|
|
||
|
The purpose is to put ops and devs to an agreement. Afterall, everyone works for the
|
||
|
same goal : **build the best product, work less and make more money**.
|
||
|
|
||
|
DevOps presents a new way of thinking how teams collaborate. The main purpose
|
||
|
of DevOps is to open discussions between Ops and Dev. Dev have to be aware of
|
||
|
how the code is deployed and how the production systems are handled by the
|
||
|
ops team. On the other hand, ops needs some dev skills in order to understand
|
||
|
correcly what type of software is served in production.
|
||
|
|
||
|
To sum it up, DevOps could be presented using a loop of all these concepts and
|
||
|
actions :
|
||
|
|
||
|
- Define a task, or feature, focused on needs from customers or clients
|
||
|
- Implement this feature or execute the defined task
|
||
|
- Code review
|
||
|
- Tests (unit tests, integration tests, staging tests)
|
||
|
- Functionnal testing on a preproduction environment
|
||
|
- Push to production
|
||
|
- Handle and analyse feedback from production
|
||
|
|
||
|
In order to archive all this tasks, teams have to communicate clearly on what
|
||
|
should be done by each team and in some cases, there is an overlap between
|
||
|
dev tasks and ops tasks but the final goal is the same : get to the best
|
||
|
possible result.
|
||
|
|
||
|
## Devops methods and concepts
|
||
|
|
||
|
Now that the culture is presented, let's take a look at how this principles
|
||
|
can be applied to the real world.
|
||
|
|
||
|
### Contract
|
||
|
|
||
|
The top most important thing is what I call a **contract**. This is an
|
||
|
agreement that create a link between dev and ops. A contract needs to be as
|
||
|
descriptive as possible. On one hand developpers needs to tell to administrators
|
||
|
all of the project details, what needs to be run and what are the
|
||
|
dependencies or services required by the application. On the other hand,
|
||
|
operators have to understand dev needs and do all the plumbing to deploy dev
|
||
|
requests to production.
|
||
|
|
||
|
In most cases, this contract can be represented by
|
||
|
[containers](https://www.docker.com/resources/what-container) and a
|
||
|
[docker-compose](https://docs.docker.com/compose/) file. It's declarative,
|
||
|
easy to read, easy to understand and clear enough to know what needs to be
|
||
|
run and what kind of plumbing is needed to make all services works together
|
||
|
to create the whole application.
|
||
|
|
||
|
If this not clear enough, here is a generic example :
|
||
|
|
||
|
|
||
|
{{< highlight yaml "linenos=table" >}}
|
||
|
version: '3'
|
||
|
|
||
|
services:
|
||
|
web:
|
||
|
image: galaxies:version
|
||
|
volumes:
|
||
|
- ./src:/dest
|
||
|
depends_on:
|
||
|
- db
|
||
|
ports:
|
||
|
- 8080
|
||
|
label:
|
||
|
- "frontend.rule=Host:galaxies.rick"
|
||
|
|
||
|
db:
|
||
|
image: postgres
|
||
|
volumes:
|
||
|
- ./mounts/db_data:/var/lib/postgresql/data
|
||
|
environment:
|
||
|
POSTGRES_USER: RICK
|
||
|
POSTGRES_PASSWORD: C137
|
||
|
POSTGRES_DB: galaxies
|
||
|
{{< / highlight >}}
|
||
|
|
||
|
An ops, receiving this file, can extract a lot of information on how the
|
||
|
application works.
|
||
|
|
||
|
- A web app that :
|
||
|
- is accepting requests on port 8080
|
||
|
- is responding using the url _galaxies.rick_
|
||
|
- needs persitent storage
|
||
|
- needs a a postgres database
|
||
|
|
||
|
Now let's explain what should be done by ops to push this to production :
|
||
|
|
||
|
0. Ensure that _galaxies.rick_ DNS points to production environment
|
||
|
0. Pull galaxies:version image
|
||
|
0. Ensure an access to a database (can be a container, a cluster or a standalone pg)
|
||
|
0. Inject database variables into production environment
|
||
|
0. Start the galaxies:version image
|
||
|
0. Update HTTP reverse proxy rules to redirect _galaxies.rick_ to _galaxies:version_ on port _8080_
|
||
|
|
||
|
And **voilà**, now you have a clear line between what kind of stuff
|
||
|
developers will push to production and how the operators will plug the
|
||
|
project on the production environment.
|
||
|
|
||
|
### Automation
|
||
|
|
||
|
Okay, okay ! But as an ops, I don't want to take care of all this stuff everytime dev needs to push a new version of the sotfware !
|
||
|
|
||
|
Me too, and this is why the second top most important thing is **automation** !
|
||
|
|
||
|
Take a look at all the tasks described earlier, do you really want to make all
|
||
|
those changes by hand using vim on the production environment ?
|
||
|
|
||
|
Ten or even twenty years ago, the first automated things was machine boostrap
|
||
|
and basic configuration using scripts. Modern applications requirements means
|
||
|
more machines, more complexity. The easieast way to handle this new level is
|
||
|
to delegate some of the tasks to computers using **declarative** structures.
|
||
|
|
||
|
This is why tools like _Ansible_ are now popular and widely used. Today we
|
||
|
want to describe a state and let tools do the stuff needed to get to this
|
||
|
state. Why ? Because this is the simpliest way to normalize how things have
|
||
|
to be done[^1] and to get complex systems up and running. If there is a bug
|
||
|
or a missing feature in one of this tool, there is a good chance that you
|
||
|
will have to put your hands in the grease and code it.
|
||
|
|
||
|
This first step of automation gives ops opportunity to work on tools
|
||
|
associated to concepts like [Continuous
|
||
|
Integration](https://en.wikipedia.org/wiki/Continuous_integration) and
|
||
|
[Continuous Delivery](https://en.wikipedia.org/wiki/Continuous_delivery).
|
||
|
|
||
|
Do not forget that current apps do more things than serving a simple website.
|
||
|
By using small iterations, dev gain the ability to make small changes often
|
||
|
in contrast to doing major updates. This way of develivering software enhance
|
||
|
stability because most of the code base is not changed between deployments
|
||
|
to production. If something goes wrong it will be a lot easier to bisect to
|
||
|
the root causes of this bug or unexpected app response.
|
||
|
|
||
|
To give dev the power to deliver atomic changes to pre-production, staging
|
||
|
and production, they need to deploy all the stuff by themselves in a
|
||
|
**predictable and reproducible** and the answer is automation !
|
||
|
|
||
|
### Metrics & alerting
|
||
|
|
||
|
```
|
||
|
With great power comes great responsibility !
|
||
|
```
|
||
|
|
||
|
This is why metrics matters. If devs can deploy stuff to prod, they also need
|
||
|
to know if everything is working as expected and no, I will not give them
|
||
|
root access to production !
|
||
|
|
||
|
Enabling low level metrics ensure to ops that production is up and running
|
||
|
smoothly but this is not enough to apply DevOps principles. Devs also need
|
||
|
**visitiliy** on how the app is handling requests (success / error rates) or
|
||
|
some status about the queue system. Every team needs different sets of
|
||
|
metrics, specific to their missions.
|
||
|
|
||
|
With metrics, comes **alerting**. If metrics are well defined, alterting can
|
||
|
be routed to people who are aware of what can be done to resolve the problem.
|
||
|
For example, if the app goes crazy, a member of the dev team will be in the
|
||
|
right position to take action and fix the problem but if it's a proxy memory
|
||
|
leak, an ops will probably know what to do and to dig, to find and resolve
|
||
|
the issue.
|
||
|
|
||
|
Performance monitoring is as mandatory as alerts. Teams wants to be sure that
|
||
|
the newly pushed feature is working and that there is no performance drop
|
||
|
somewhere else in the application.
|
||
|
|
||
|
### Culture, sharing and empathy
|
||
|
|
||
|
Sharing is caring
|
||
|
|
||
|
Sharing is one of the key to apply DevOps concepts and culture. In this
|
||
|
situation, sharing is not restricted to **communication** but also
|
||
|
**responsabilities**
|
||
|
|
||
|
If dev teams **share responsabilities** with ops team, there is a all new
|
||
|
field of possibilities to collaborate and simplify deployment and
|
||
|
maintenance. For ops team, a better communication and shared responsabilities
|
||
|
with dev ensure that they have access to informations regarding businesses
|
||
|
goals, productions requirements.
|
||
|
|
||
|
If devs and ops are both responsible of failure, or sucess, of the product,
|
||
|
there is less possibility to fall in a blame counter-blame situation. With
|
||
|
more communication and a strong trust chain between members of ops and dev
|
||
|
teams, everyone gets autonomy and a voice in dev or deployment process.
|
||
|
|
||
|
Last but not least, a lots of **empathy** is needed. Failure is a success !
|
||
|
It's one of the best way to learn new things but this is only possible in a
|
||
|
safe and tolerant environment. The war between dev and ops is over. Listening
|
||
|
and talking to eveyrone will probably help every member of the teams.
|
||
|
|
||
|
## Limits
|
||
|
|
||
|
Of course, DevOps is not perfect. When misunderstood, this can be quite
|
||
|
catastrophic. Reducing DevOps to a buzzword is as silly as taking everything
|
||
|
as Truth in the holy Bible. DevOps is a mentality, you will have to create
|
||
|
your own DevOps culture.
|
||
|
|
||
|
A lots of managers and leaders thinks that DevOps means, fire half of the
|
||
|
devs , half of the admin, mixup, and voilà. Is this sharing ? No ! Doing
|
||
|
DevOps means more distributed responsability and less stress for everyone.
|
||
|
|
||
|
Another wrong idea is to think that more deployments means more features.
|
||
|
Integrating deployments automations and testing is only used to enhance
|
||
|
robusteness of the all system. The idea is not to make more feature, but more
|
||
|
small changes in order to increase poduction stability.
|
||
|
|
||
|
# A new open field
|
||
|
|
||
|
After all that, there is clearly an emerging need of programming skills
|
||
|
common to all the principles and methods presented.
|
||
|
|
||
|
## Why Industry needs (smart)ops ?
|
||
|
|
||
|
A smartops is someone who clearly understand that the IT industry is
|
||
|
changing. Everything is moving to the **cloud**, more and more services are
|
||
|
externalized and everything becomes more and more automated. All this stuff
|
||
|
creates a violent shift between two sets of methods.
|
||
|
|
||
|
- an old one
|
||
|
- launch command in a terminal using ssh
|
||
|
- bash scripts to setup things
|
||
|
- edit file directly on production using _vim_
|
||
|
|
||
|
- a new one
|
||
|
- pipelines
|
||
|
- automation
|
||
|
- services interactions between HTTP services
|
||
|
|
||
|
No I'm not saying that ssh is dead. I'm saying that methods evolves.
|
||
|
|
||
|
As more automation means less human action, there is clearly a move to
|
||
|
descriptive infrastructure deployments and internal services doing all the
|
||
|
plumbing stuff needed to get a stable and viable production.
|
||
|
|
||
|
In order to achieve all this new challenges, industry needs to delegate tasks
|
||
|
to smart programs write using code. This new services and automation programs
|
||
|
have to be **written by ops**, beceause they are the ones who trully knows
|
||
|
how to run production systems at scale. But, sorry to say that, perl and bash
|
||
|
scripts can do that kind of jobs. More automation of everything also means
|
||
|
automation of the most complex tasks in the stack and this is where scripting
|
||
|
langages are not enough.
|
||
|
|
||
|
For the ones who thinks I'm wrong, maybe. But here is my opinion based on a
|
||
|
lots of bash and perl script experiments. When things needs at least
|
||
|
parallelism, http requests and response manipulations, strong error handling
|
||
|
or ability to push stuff inside a monitoring stack, golang will be my choice
|
||
|
and I deeply think it should be yours too because this is the main purpose
|
||
|
of this kind of new languages, created specificaly to answer dev and ops
|
||
|
problems.
|
||
|
|
||
|
Moving from scripting to programming will also help smartops understand how
|
||
|
software they put in production works. By knowing how to construct a
|
||
|
software, ops will gain the ability to help devs, integrating every one in a
|
||
|
DevOps culture.
|
||
|
|
||
|
## New profiles, new horizons
|
||
|
|
||
|
Yes, ops **needs dev skills** in order to get a role in teams resolving new
|
||
|
challenges that comes with modern infrastructures and cloud infrastructures.
|
||
|
|
||
|
This changing ecosystem also gives evolution ability to ops and dev. With
|
||
|
efforts, everyone can, at least, take a look at how roles and interconnection
|
||
|
between ops and dev works. To be clear, i'm saying that dev also needs ops
|
||
|
skills ! But i keep that for another article, stay tuned.
|
||
|
|
||
|
If old ops don't want to make the effort, that's not a problem because new kind of
|
||
|
people get what is happening. Believe it or not but it's real. The smartops
|
||
|
community is **inclusive**. Even if this is not perfect yet, the _golang_ and
|
||
|
_k8s_ is clearly LGBT and women friendly !
|
||
|
|
||
|
I want to thanks all the _LBGT_||women gophers||ops[^2] I follow because they
|
||
|
are the roots of this wonderful and refreshing community[^3]. The best thing
|
||
|
I can do is to invite you to follow this people ! Here is the list :
|
||
|
|
||
|
- [Jessie Frazelle](https://twitter.com/jessfraz)
|
||
|
- [Ashley McNamara](https://twitter.com/ashleymcnamara)
|
||
|
- [Ellen Korbes](https://twitter.com/ellenkorbes)
|
||
|
- [Kris Nova](https://twitter.com/krisnova)
|
||
|
- [Jaana B. Dogan](https://twitter.com/rakyll)
|
||
|
- [Francesc Campoy](https://twitter.com/francesc)
|
||
|
- [Aditya Mukerjee](https://twitter.com/chimeracoder)
|
||
|
|
||
|
[^1]: Alice likes apt-get, Bob likes aptitude ? I don't care, I just want a standardized way to install a package
|
||
|
[^2]: This is an inclusive OR
|
||
|
[^3]: If you want to be removed or added to the list, just send me a tweet or whatever.
|