DevOps on ideologia, jonka tavoitteisiin kuuluu ohjelmistotoimitusketjun nopeuttaminen ja automatisointi koodista julkaisuun. Tärkeä osa tämän tavoitteen saavuttamista on viestinnän ja yhteistyön parantaminen ennen kaikkea ohjelmistokehittäjien ja tuotantojärjestelmiä ylläpitävien järjestelmäasiantuntijoiden välillä.
Sekä viestinnän ja yhteistyön tukemiseksi että ohjelmistotoimitusketjun nopeuttamiseksi ja automatisoimiseksi on olemassa joukko erilaisia työkaluja. Joskus näistä työkaluista voi myös kuulla puhuttavan DevOps-työkaluina. On kuitenkin tärkeää huomioida, ettei DevOps edellytä työkalujen käyttöä, eikä työkalujen käyttö automaattisesti tarkoita, että toimintamalli olisi DevOps-ideologian mukainen. Monia DevOpsiin usein liitettyjä työkaluja on itse asiassa käytetty jo ennen kuin termiä ”DevOps” alettiin käyttämään. Millä tavoin nämä työkalut voivat sitten tukea DevOps-käytäntöjä ja -periaatteita?
Jatkuva julkaisu
Jatkuva julkaisu käsittää työkalut, joita käytetään koodin integroimiseksi, paketoimiseksi ja julkaisemiseksi. Toisin sanoen näillä työkaluilla voidaan automaattisesti suorittaa testejä, paketoida ja koota koodit toimituskelpoiseen muotoon sekä automatisoida asennukset palvelimille. Kun jatkuva julkaisu suoritetaan useita kertoja päivässä, saadaan myös palautetta kerättyä nopeammin ja siten voidaan reagoida ongelmiin ja muutoksiin aikaisemmin. Kun jatkuvasta julkaisusta saatu tieto on lisäksi kaikkien saatavilla, auttaa se parantamaan viestintää ja yhteistyötä eri osapuolten välillä.
Esimerkkityökaluja: Jenkins, Bamboo, Travis, Shippable
Virtualisointi ja kontit
Virtualisoinnilla voidaan tarkoittaa monia asioita, mutta DevOpsissa sillä tyypillisesti tarkoitetaan laitteiston virtualisointia, jolloin yhden fyysisen tietokoneen tai palvelimen päällä voidaan ajaa yhtä tai useampaa virtuaalikonetta. Vastaavasti myös useat fyysiset palvelimet voidaan esittää yhtenä virtuaalikoneena. Virtuaalikoneiden ongelma on, että ne vaativat sovelluksen ja sen riippuvuuksien lisäksi myös vieraskäyttöjärjestelmän, jolloin virtuaalikoneiden koko kasvaa usein isoksi. Tämän vuoksi on kehitetty kevyempiä virtualisointimuotoja kuten nk. kontit (engl. containers). Kontteja ajetaan tyypillisesti eristetyssä prosessissa isäntäkoneen käyttöjärjestelmässä. Näin ollen kontit sisältävät ainoastaan sovelluksen ja sen riippuvuudet, eivätkä ne tarvitse omaa vieraskäyttöjärjestelmää. Tämä tekee konteista helpommin siirrettäviä ja tehokkaampia, jolloin useita kontteja voidaan tarvittaessa ajaa yhdellä virtuaalipalvelimella. Sekä virtuaalikoneet että kontit edesauttavat ohjelmistokehittäjien ja järjestelmäasiantuntijoiden välistä yhteistyötä, kun kehitys- ja tuotantoympäristöt voidaan yhdenmukaistaa.
Esimerkkityökaluja: VirtualBox, Vagrant, Docker, Rocket
Pilvipalvelut
Pilvipalvelut perustuvat virtualisointiin, jolloin pilvipalveluntarjoajien työkaluilla monimutkaistenkin palvelinympäristöjen pystyttäminen onnistuu helposti ja nopeasti. Virtualisointi mahdollistaa myös pilvipalveluiden skaalauksen käytön mukaan. Pilvipalveluiden käyttäminen hälventää rajoja ohjelmistokehittäjien ja järjestelmäasiantuntijoiden välillä ja ketteröittää työskentelytapoja, kun palvelinympäristöön tehtävät muutokset voidaan tehdä helposti ja läpinäkyvästi. Automatisoinnin ja parempien työkalujen ansiosta ohjelmistokehittäjä voi myös ottaa aiempaa suuremman roolin infrastruktuurin hallinnassa.
Esimerkkejä pilvipalveluista: Amazon Web Services, Rackspace, Heroku
Konfiguraationhallinta ja provisiointi
Konfiguraationhallinnalla pyritään seuraamaan ja hallitsemaan muutoksia ohjelmistoihin ja laajemmin myös alla olevaan infrastruktuuriin. Provisioinnilla puolestaan tarkoitetaan tarvittavien käyttöjärjestelmien, ohjelmistojen, datan ja muiden riippuvuuksien asentamista ja konfiguroimista palvelimelle. Konfiguraationhallinta ja provisiointi liittyvät siten vahvasti toisiinsa. DevOpsissa nämä vaiheet pyritään automatisoimaan työkalujen avulla. Tällöin työkalujen avulla kuvataan tila, johon palvelin halutaan saattaa, jolloin työkalut hoitavat asennukset ja konfiguroinnit automaattisesti sekä tarkkailevat muutoksia infrastruktuurissa. Infrastruktuurin voi tällöin ilmaista ohjelmoitavana koodina, jolloin infrastruktuurin hallinnassa voidaan hyödyntää ohjelmistokehityksessä käytettyjä työkaluja ja käytäntöjä. Ohjelmistokehittäjät voivat puolestaan käyttää konfiguraationhallinta- ja provisiointityökaluja luodakseen tuotantoympäristöä vastaavan kehitysympäristön automaattisesti. Ympäristöjen yhtenäistäminen poistaa ”toimii minun koneella”-tyyppiset ongelmat ja vähentää näin ristiriitoja eri osapuolten välillä.
Esimerkkityökaluja: Ansible, Puppet, Chef
Konttien orkestrointi
Isot tietojärjestelmät hajautetaan tyypillisesti useille virtuaalipalvelimille sekä näiden päällä ajettaville konteille. Tällöin tarvitaan tehokkaat työkalut konttien orkestrointiin. Orkestrointi tarkoittaa konttien automaattista sijoittelua eri virtuaalipalvelimille sekä konttien välisen viestinnän hallintaa. Käytännössä työkaluilla voidaan määrittää millä palvelimilla kukin kontti ajetaan ja minkä muiden konttien kanssa kukin kontti kommunikoi. Osa työkaluista mahdollistaa myös konttien automaattisen kuormantasauksen ja virheidenhallinnan. Esimerkiksi vioittuneen kontin tilalle voidaan automaattisesti käynnistää vastaava toimiva kontti. Myös pilvipalveluissa on tarjolla työkaluja konttien helppoon asennukseen virtuaalipalvelimille sekä isojen konttijoukkojen hallintaan. Tällaiset orkestrointityökalut tukevat ja nopeuttavat tietojärjestelmän asennusta ja muutosten tekemistä tuotantoympäristöön, jolloin myös ohjelmistokehittäjät voivat helpommin osallistua tietojärjestelmän hallintaan.
Esimerkkityökaluja: Ansible, Docker Compose, Docker Swarm, Kubernetes
Lokitus, seuranta ja metriikoiden visuaalisaatio
Tärkeä osa DevOps-ideologiaa on palautteen kerääminen ja jakaminen jatkuvan parantamisen hengessä. Varsinkin hajautetussa järjestelmässä lokien kerääminen ja tuotantoympäristön reaaliaikainen seuranta voivat olla haasteellisia. Näiden tukemiseksi on kuitenkin olemassa työkaluja, joilla muun muassa lokien kerääminen, kokoaminen, hakuindeksointi ja visualisointi voidaan suorittaa automaattisesti ja reaaliaikaisesti. Kaikille läpinäkyvät metriikat ja kaaviot tukevat DevOps-periaatteita ja päivittäistä päätöksentekoa. Tämä antaa ohjelmistokehittäjille mahdollisuuden tutkia ongelmia reaaliajassa. Kun ohjelmistokehittäjät voivat suoraan seurata tekemiensä muutosten vaikutusta tuotantoympäristössä, kasvattaa se myös heidän sitoutumistaan ja omistautumistaan tietojärjestelmää kohtaan.
Esimerkkityökaluja: Elasticsearch, Logstash, Kibana, Sensu, New Relic, AppDynamics, Splunk
Vaikka yllä esitetyt työkalut tukevatkin DevOps-käytäntöjä ja -periaatteita on edelleen tärkeää muistaa, etteivät työkalut itsessään takaa DevOps-tavoitteiden saavuttamista. Loppujen lopuksi DevOps edellyttää ihmisten välistä yhteistyötä, avoimuutta ja viestintää.