Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
322 lines (239 sloc) 19.6 KB

Puppet configuration management

Jussi Isosomppi, 2017

This repository is a part of Haaga-Helia's Linux server management course, taught by Tero Karvinen. The course aims to teach students the proper use of centralized management, as well as the use of version control tools such as github.
More info at Tero Karvinen's home page.

Side note: This course also marks my first encounter with the Markdown syntax. So far, it seems very clear and easily versatile enough for the reporting required during this course. Adam Pritchard's Markdown cheat sheet and GitHubs own formatting guide have been valuable resources.

startup.sh is a bash script designed to set up a new computer for use.

The purpose of this script is to do as much as possible with puppet, instead of running the commands in the setup script itself. This allows me to keep updating the git repositories instead of updating the setup script on my homepage every time something changes.

This script is also hosted at jisosomppi.me/startup.sh for ease of use. Setting up a new computer needs just two commands: wget ~~jisosomppi.me/startup.sh~~ ## No longer supported && bash startup.sh and is easy enough to type with even the default US keyboard layout.

  • It changes the keyboard layout to FI, updates the package list, and installs git and puppet.
  • It clones this git repository to the local computer and sets up my global config for git.
  • It makes the gitup script easily executable for all users.
    • It's contents are simply git add . && git commit; git pull && git push.
    • Changing this to a simple bash script encourages more frequent updates.
  • It then runs the puppetfile site.pp, installing and setting up
    • UFW
    • SSH
    • Apache
    • PHP

Harjoitustehtävä h1

Tehtävänanto

Asenna jokin muu demoni kuin Apache. Raportoi, miten rakensit, selvitit ja testasit kunkin osan (esim. sudo puppet resource, puppet describe, lähteet…). Julkaise myös modulisi lähdekoodi niin, että sen voi helposti ottaa käyttöön.

Vinkkejä:

  • Käytä package-file-service -rakennetta.
  • Voit julkaista modulisi GitHubissa.
  • Raportti on helppo kirjoitaa GitHubiin MarkDown-tekstinä.
  • Lue opiskeltavat artikkelit ennenkuin teet tehtävän
  • SSH lienee helpoin demoni asentaa. Jos olet jo taitava Puppetissa, voit asentaa haastavampia vaihtoehtoja, kuten LAMP:in.

Asensin koneelle openssh-serverin, ja varmistin että demoni on ja pysyy käynnissä. Lisäksi yritin myös saada poistettua root loginin käytöstä. Yritin muokata /etc/ssh/sshd_config -tiedostoa puppetin file_line -ominaisuudella. Tätä varten asensin file_linen edellyttämän modulin, stdlibin, komennolla puppet module install puppetlabs-stdlib.

Ruma puppetfile

Kirjoitin seuraavan puppetfilen:

class sshaccess {

        package { 'openssh-server':
                ensure => "installed",
                allowcdrom => 'true',
        }

        package { 'openssh-client':
                ensure => "installed",
                allowcdrom => 'true',
        }

        file { '/etc/ssh/sshd_config':
                ensure => 'present',
        }

#       file_line { 'Prevent SSH root login':
#               line => 'PermitRootLogin no',
#               path => '/etc/ssh/sshd_config',
#               match => '^PermitRootLogin.*$',
#		require => Package["openssh-server"],
#               notify => Service["ssh"],
#       }

        service { 'ssh':
                ensure => 'running',
                enable => 'true',
                require => Package["openssh-server"],
        }

}

En saanut file_line -osuutta toimimaan lukuisista yrityksistä huolimatta, vain sain seuraavan virheilmoituksen:

Error: Puppet::Parser::AST::Resource failed with error ArgumentError: Invalid resource type file_line at /home/xubuntu/conman/puppet/modules/sshaccess/manifests/init.pp:24 on node xubuntu.tielab.haaga-helia.fi

Siirryin tämän jälkeen käyttämään templatea, eli kopioin tiedoston /etc/ssh/sshd_config kansioon puppet/modules/ssh/templates.

Muokkasin tiedostoon SSH-portiksi 1324 ja kielsin rootilla kirjautumisen kokonaan.

Kokeilin SSH-yhteyttä ennen puppetfilen ajamista, ja yhteys vakioporttiin 22 onnistui.

Ajoin puppetfilen (komennolla sudo puppet apply --modulepath modules/ -e 'class{"ssh":}'), jonka jälkeen portti 22 lakkasi toimimasta mutta portti 1324 (ssh -p 1324 xubuntu@localhost) toimi.

Vähemmän ruma puppetfile

Lopullinen SSH-moduli näyttää siis tältä:

class ssh {

        package { 'openssh-server':
                ensure => 'installed',
                allowcdrom => true,
        }

        package { 'openssh-client':
                ensure => 'installed',
                allowcdrom => true,
        }

        file { '/etc/ssh/sshd_config':
                content => template ('ssh/sshd_config'),
                require => Package['openssh-server'],
                notify => Service['ssh'],
        }

        service { 'ssh':
                ensure => 'running',
                enable => true,
                require => Package['openssh-server'],
        }

}

Harjoitustehtävä h2

Tehtävänanto

a) Gittiä livenä: Tee ohjeet ja skriptit, joilla saat live-USB -tikun konfiguroitua hetkessä – ohjelmat asennettua ja asetukset tehtyä.

b) Kokeile Puppetin master-slave arkkitehtuuria kahdella koneella. Liitä raporttiisi listaus avaimista (sudo puppet cert list) ja pätkä herran http-lokista (sudo tail -5 /var/log/puppet/masterhttp.log).

Vinkkejä:

  • Herra-orja arkkitehtuuria on helppo kokeilla labrassa oikeilla koneilla. (Virtualboxilla kokeileminen on todennäköisesti hitaampaa ja hankalampaa)
  • Jos herra-orja arkkitehtuurissa sertifikaatit menevät solmuun, pysäytä molemmat demonit (puppetmaster ja puppet agent) yhtä aikaa, poista /var/lib/puppet/ssl/. Tee tarvittavat korjaukset ja yritä uudelleen.

Lähtötiedot

Toteutin tämän tehtävän kahdella seuraavanlaisella virtuaalikoneella:

  • Alustana Windows 10 (build 1709), ja sen Hyper-V -alusta
  • Käyttöjärjestelmänä Xubuntu 16.04.3 LTS (64bit)
  • 1024 Mb muistia per kone
  • Ajoin Xubuntua kokeilutilassa, eli pyrin mahdollisimman lähelle tositilannetta
  • Valmistelin molemmat koneet käyttöön ajamalla oman startup.sh-skriptin
  • Annoin toiselle koneelle hostnameksi master ja toiselle slave, käynnistin avahi-daemonit uudelleen ja totesin pingin toimivan molempiin suuntiin

Puppetin asennus ja asetukset

Ylläolevan käyttöönoton jälkeen valmistelin koneita puppet slave/master -suhteeseen. Seurasin Tero Karvisen ohjeita, joilla pääsin aika pitkälle.

Puppet ja git asentuivat molemmille koneille jo startup.sh-skriptillä, ja git-repository kloonattiin molemmille koneille.

Muokkasin ohjeen mukaisesti molempien koneiden puppet-asetuksia (sudoedit /etc/puppet/puppet.conf), eli lisäsin masterille dns-nimet ja slavelle master-serverin.

Jäin pitkäksi aikaa jumiin samaan virheilmoitukseen (Error 400 on SERVER: The environment must be purely alphanumeric, not 'puppet-ca'), joka löytyi ajamalla slavella komento sudo puppet agent -tvd. Käytönnössä tämä näkyi niin, ettei sertifikaattipyyntö joko lähtenyt slavelta ollenkaan tai ainakaan päässyt masterille perille asti (sudo puppet cert --list masterilla ei näyttänyt yhtään sertifikaattia). Tajusin kuitenkin oman tyhmyyteni tuota slaven debuglistaa lukiessa; en ollut avannut puppetille porttia 8140. Nopea sudo ufw allow 8140/tcp korjasi tilanteen, ja sain sertifikaatin hyväksyttyä.

Cert list

Pyydetyllä komennolla sudo puppet cert list tyhjän palautuksen joitain kertoja saatuani tajusin lisätä komennon loppuun --all. Oletuksena komento palauttaa vain allekirjoittamattomat sertifikaatit.

Masterin sertifikaattilista alla:

+ "master.home" (SHA256) 50:64:07:34:A0:DB:F1:89:EF:E1:31:75:1C:91:40:BD:BB:A3:2A:B7:18:61:32:55:40:80:4D:E2:61:A9:76:BB (alt names: "DNS:master.home", "DNS:puppet", "DNS:puppet.home")
+ "slave.home"  (SHA256) FB:EA:F4:75:9B:19:A1:04:AE:22:C9:93:A2:BF:B3:0D:0C:CE:64:69:9C:03:96:08:7F:29:F7:41:78:3E:98:27

Näyttää itse sertifikaatin lisäksi myös koneille puppet.confissa määritellyt dns-aliakset.

Master log

Ote masterin logista alla:

[2017-11-05 00:10:26] - -> /production/file_metadatas/plugins?links=manage&recurse=true&ignore=.svn&ignore=CVS&ignore=.git&checksum_type=md5
[2017-11-05 00:10:26] 10.0.0.111 - - [05/Nov/2017:00:10:26 UTC] "POST /production/catalog/slave.home HTTP/1.1" 200 1047
[2017-11-05 00:10:26] - -> /production/catalog/slave.home
[2017-11-05 00:10:26] 10.0.0.111 - - [05/Nov/2017:00:10:26 UTC] "PUT /production/report/slave.home HTTP/1.1" 200 9
[2017-11-05 00:10:26] - -> /production/report/slave.home

Harjoitustehtävä h3

Tehtävänanto

a) Asenna useita orjia yhteen masteriin. Ainakin yksi rauta- ja useampia virtuaalisia orjia.

b) Kerää tietoa orjista: verkkokorttien MAC-numerot, virtuaalinen vai oikea… (Katso /var/lib/puppet/)

c) OrjaSkripti: Tee skripti, joka muuttaa koneen Puppet-orjaksi tietylle masterille. Voit katsoa mallia Tatun tai Eemelin ratkaisuista.

d) (vapaaehtoinen) Laita skripti Vagrantfile:n provisointiskriptiksi.

e) Vapaaehtoinen: Oikeaa elämää. Ratkaise jokin kurssin ulkopuolinen asia Puppetilla.

f) Vapaaehtoinen: Unelmien tikku. Tee unelmiesi USB-live-tikku.

Lähtötiedot

Toteutin tämän tehtävän kahdella seuraavanlaisella virtuaalikoneella:

  • Alustana Windows 10 (build 1709), ja sen Hyper-V -alusta
  • Käyttöjärjestelmänä Xubuntu 16.04.3 LTS (64bit)
  • 1024 Mb muistia per kone
  • Ajoin Xubuntua kokeilutilassa, eli pyrin mahdollisimman lähelle tositilannetta

Puppetmasterin asetukset

Tein puppetmasterille samat asetukset kuin viimeksi:

  • dns_alt_namet /etc/puppet/puppet.confiin
  • master.local /etc/hostsiin
  • puppetin portti auki palomuurista sudo ufw allow 8140/tcp
  • sertifikaattien nollaus sudo rm -R /var/lib/puppet/ssl

Rautaslaven asetukset

Virtuaalislaven asetukset (Hyper-V)

Yritin luoda Tero Karvisen ohjeiden (Vagrant multimachine script ja Multiple Puppet slaves with Vagrant) mukaisesti virtuaalikoneita vagrantilla, mutta sain joka kerta vastaan saman virheilmoituksen. Virheilmoituksen mukaan koneista oli levytila lopussa, vaikka tein mitä. Yritin ajaa Ubuntun ja Xubuntun eri versioita (16.04.3., 16.10., 17.04.) sekä livenä, RAMilta, asennettuna... Muutin virtuaalikovalevyn kokoa aina teratavuun asti, poistin koneet ja levyt useampaan otteeseen, kokeilin käyttöoikeuksien muutoksia...

Lopulta syyksi selviytyi Hyper-V:n kyvyttömyys sisäkkäisten virtuaalikoneiden suhteen - Hyper-V:n "rautakoneisiin" ei voi kytkeä BIOSin virtualisointitukea päälle. Varsinaisessa rautakoneessa virtualisointi oli kuitenkin käytössä ja toimi ajaen useampaa Linux-VM:ää samaan aikaan.

Orjakisat part 1

Tämän osuuden tiedostot omassa repossaan https://github.com/jisosomppi/manymachines

23 fyysistä konetta
21-23 orjaa per kone
200Mb muistia per orja

502 orjaa

Löysin tyhjän labran 5004 keskiviikkona n. 15:45 ja päätin käydä sen 23 koneen kimppuun (yksi opiskelijan käytössä ja yksi serverinä ilman virtuaalikoneita). Ainoa kone, jonka kovalevylle jotain asensin, oli puppetmasterini. Tein koneelle tarvittavat asetukset (hostname, etc/hosts, puppet.conf), sekä asensin tietysti tarvittavat ohjelmat.

Aloin rakentamaan itselleni omaa Vagrant-skriptiä Teron, Tatun ja Tommin mallien pohjalta. Käytin Teron tscriptiä master-hostin lisäämiseen, Tatun porttimappausta ja Tommin yksilöintiosuutta.

Omaksi pohjaksi valitsin minimal/trusty64 -boxin, josta säädin 512Mb vakiomuistin 200Mb:een. Laskin nopeasti, että jos koneissa on muistia 16Gb, saan helposti 50+ orjaa per kone (Xubuntun asennukselle ja muulle olisi siis tilaa 16Gb - 50x200Mb = 6Gb). Tosin orjamääriä tutkiessani totesin että muistia onkin vain 8Gb per kone (ainakin df -h . mukaan).

Aluksi komennon vagrant up käyttäminen johti virheilmoitukseen puuttuvasta USB 2.0 -tuesta. Pikaisen googletuksen jälkeen löysin muiden valitukset samasta aiheesta, ja pääsin korjaamaan virheen Vagrantfilestä.

Asennus ja lopputulos

Otin koneet käyttöön käynnistämällä livetikulta Xubuntu 16.04.3:en suoraan käyttömuistiin, jonka jälkeen latasin käynnistysskriptin ja ajoin sen (wget ~~jisosomppi.me/puppetslave.sh~~ ## No longer supported && bash puppetslave.sh). Skripti asentaa tarvittavat ohjelmat ja alkaa luomaan 50:ä virtuaalikonetta. Skripti jatkoi pyörimistään jokaisella koneella muistin loppumiseen asti, jonka jälkeen komento joko jäi pyörimään tai päättyi virheeseen.

df -h . osoittautui toimivaksi työkaluksi edistyksen seurantaan: jokaisella koneella oli lopulta 100% levytilasta (muistista) käytössä. Osalla koneista en edes saanut toimintoa ajettua, kun muistin loppuminen johti mielenkiintoisiin tilanteisiin.

Tämänhetkisellä configilla sain asennettua 21-23 orjaa jokaiselle 23 fyysiselle koneelle, eli sain kerrallaan yhteensä 502 orjaa rekisteröityä puppetmasterille. Kellon lähestyessä kahdeksaa sovin itseni kanssa tämän riittävän ensimmäiseksi kokeiluksi.

Kokeilin tämän jälkeen yhdellä koneella virtuaalikoneen muistimäärän laskemista 150Mb:iin, mutta tällä ei tuntunut olevan mitään vaikutusta kumpaakaan suuntaan. Virtuaalikone otti edelleen yhteyden puppetmasteriin, SSH-yhteys siihen toimi ja ohjelmat toimivat normaalin oloisesti. En siltikään saanut toimimaan yhtään virtuaalikonetta lisää.

Jälkiviisaus iski taas perinteiseen tapaan raporttia viimeistellessä - yhdenkään koneen isäntäkäyttöjärjestelmässä ei pyörinyt orjia eikä siitä ollut karsittu ylimääräisiä paketteja pois. Seuraavaksi vuorossa kenties asennuskoon optimointi?

Orjasota part 2

Ei riitä vielä!

Harjoitustehtävä h4

a) Kokeile Ansible:a
b) Kokeile Salt:ia

Ansible master-minion kokeilu

Käynnistin kahdessa virtuaalikoneessa (Hyper-V, Windows 10 build 1709) Xubuntu 16.04.3 :n livenä. Tämän jälkeen päivitin pakettilistat ja asensin molemmille koneille ansiblen (sudo apt-get install -y ansible). Tämän jälkeen lisäsin ensimmäiselle koneelle toisen koneen IP-osoitteen tiedostoon /etc/ansible/hosts:

[testserver]
10.0.0.115

Yritin tämän jälkeen pingata lisättyä nodea komennolla ansible all -m ping, mutta sain vastaukseksi vain erroria. Debuggauksen käyttöönotto (-vvvv) näytti aika heikosti lisätietoa, mutta viittaa selvästi SSH-autentikointivirheeseen. Yritin seurata Joonan ohjeita ja ottaa SSH-avaimet käyttöön, mutta heikolla menestyksellä.

Sain pingin toimimaan seuraavilla korjauksilla:

  • Poistin molemmilta koneilta palomuurin käytöstä (joka tosin oli turhaa, toimii hyvin myös palomuurin kanssa koska Ansible käyttää SSH:ta)
  • Ansiblen virallisten ohjeiden mukaan lisäsin komennon perään --ask-pass, joka johti SSH-salasanan kysymiseen
  • Lisäsin molemmille live-käyttöjärjestelmille salasanan siltä varalta, ettei tyhjä salasana kelpaa SSH-autentikointiin
  • Success! Näiden muutosten jälkeen pingaus onnistuu ilman mitään ongelmaa, samoin kuin muiden komentojen ajaminen (ansible all -a "/bin/echo Hello master!" --ask-pass)

Salt master-minion kokeilu

Aloitin kokeilun asentamalla Xubuntu 16.04.3 -isäntäkoneelle salt-masterin ja salt-minionin. Määritin minionin asetuksiin (sudoedit /etc/salt/minion) masterin IP-osoitteen (master: 127.0.0.1) ja käynnistin molemmat palvelut uudelleen. Tämän jälkeen tarkistin varmistusta odottavat avaimet komennolla sudo salt-key --list all. Listaan oli ilmestynyt uusi entry, puppetmaster (isäntäkoneen hostname), joka odotti vahvistusta. Varmistin avaimen komennolla sudo salt-key -a puppetmaster, jonka jälkeen testasin toimivuuden pingaamalla (sudo salt '*' test.ping).

Tämän jälkeen asensin Xubuntun myös toiseen koneeseen, sekä vagrantin isäntäkoneeseen. Asensin molemmille salt-minionin, muokkasin niiden asetuksiin masterin IP-osoitteeksi isäntäkoneen IP-osoitteen ja käynnistin palvelut uudelleen. Tämän tarkistin odottavat avaimet isäntäkoneella (sudo salt-key --list all). Tarkistin pyyntöjen hashit komennolla sudo salt-key -f <minionin hostname> ja tarkistin ne minioneilta komennolla sudo salt-call key.finger --local. Hashit täsmäsivät, joten hyväksyin avaimet komennolla sudo salt-key -A (Hashien tarkistus).

Tein vielä kokeeksi pakettiasennuksen minionille:

  • Ajoin masterilla komennon sudo salt-key --list all, jolla tarkistin minionien nimet, ja tunnistin listasta viereisen koneen (xubuntu)
  • Tämän jälkeen annoin masterilla komennon sudo salt xubuntu pkg.install apache2, jonka pitäisi asentaa valitulle minionille (xubuntu) valittu paketti (apache2)
  • Masterin terminaaliin tulee tuloste tehdyistä toimenpiteistä:
jussi@puppetmaster:~$ sudo salt xubuntu pkg.install apache2
xubuntu:
    ----------
    apache2:
        ----------
        new:
            2.4.18-2ubuntu3.5
        old:
    apache2-api-20120211:
        ----------
        new:
            1
        old:
.
. ...ja loput kymmenkunta Apachen osapakettia
.
  • Varmistin vielä paketin asentumisen kokeilemalla minionin selaimella osoitetta localhost, josta löytyi Apachen testisivu.

Harjoitustehtävä h5

a) Asenna Puppetin orjaksi vähintään kaksi eri käyttöjärjestelmää. (Tee alusta, pelkkä tunnilla tehdyn muistelu ei riitä). b) Säädä Windows-työpöytää. Voit esimerkiksi asentaa jonkin sovelluksen ja tehdä sille asetukset.

Tein itselleni puppetmasterin Windows 10:n Hyper-V:llä pyörivästä Xubuntu 16.04.3 -livetikusta. Asensin siihen puppetmasterin, johon lisäsin dns-nimet, uusin SSL-avaimet ja avasin palomuuriin portin 8140.

Tämän jälkeen tein toisesta vastaavanlaisesta virtuaali-live-Xubuntusta orjan, jolle määritin masterin dns-nimen serveriksi. Uusin SSL-avaimet ja yhdistin tämän ensimmäisen orjan onnistuneesti masteriin.

Seuraavaksi siirryin tekemään itselleni Windows 10-orjaa Teron ohjeiden mukaisesti. Tein asennuksen omalle testikoneelle, johon asensin Windows 10 Pro:n, Bonjourin ja Puppetin (3.8.5). Asentaessa määritin masterin osoitteeksi virheellisesti IP-osoitteen, joka johti testausvaiheessa virheilmoituksiin (ip:tä ei ollut määritelty masterin puppet.confiin -> virhe SSL-avaimessa). Vaihdoin Windows-orjalle serveriksi masterin dns-nimen (puppetmaster.home), jonka jälkeen yhteys syntyi.

Tein puppetmasterille testimodulit hellowindows ja hello linux, jotka loivat testitiedostot onnistuneesti molemmille orjille.

Tämän jälkeen loin masterille uuden modulen, joka asentaa Windows-orjille VLC:n ja Arduino IDEn:

class choco {
   include chocolatey

   Package {
       ensure => "installed",
       provider => "chocolatey",
   }

   package {["vlc", "arduino"]:}

}