Palvelinten hallinta - ICT4TN022-3
Takaisin juureen

Kotitehtävä h3
8.11.2017

  1. Useita orjia yhdessä masterissa
  2. Tietoja orista
  3. Orjuuttava skripti
  4. Oikeaa elämää Puppetilla

1. Useita orjia yhdessä masterissa

Tehtävä a). Tehtävään kului noin 2h

Tehtävänä oli asentaa useita orjia yhteen masteriin. Ainakin yksi rauta-, ja useampia virtuaalisia.

Puppetmasterina toimii Renki-servini. Puppetmasterin asennus kuten tehtävässä 2.

Ensimmäisenä slavena toimi Raspberry Pi 3 Model B -laitteella toimiva Ubuntumate-julkaisu. Se on Ubuntu 16.04.3 joka on käännetty Raspberryn ARM-prosessorille. Orjan asennus toimi Ubuntumatessa samalla tavalla, kuin edellisessä tehtävässä 2. Koneen hostname on ubuntumate, jolla se tunnetaan jatkossa.

Asensin toisenkin rautaorjan. Koneena toimi Acer Aspire ES1-523 läppäri, ja käyttöjärjestelmänä Ubuntu Desktop 16.04.3 LTS. Koneen hostname on ubuntu, jona se tunnetaan seuraavissa tehtävissä.

Seuraavaksi oli aika asentaa virtuaaliorjia. Päätin tehdä tämän Vagrantilla. Asensin Vagrantin ja Virtualboxin Renki-serverilleni:

$ sudo apt-get -y install vagrant virtualbox

Vagrantin käytössä käytin apuna tätä Tero Karvisen ohjetta.

$ cd
$ mkdir vagrantti
$ cd vagrantti
$ nano Vagrantfile

Tiedostoon kirjoitin seuraavan konfiguraation, joka luo kaksi virtuaalikonetta nimillä slave01 ja slave02:

Vagrant.configure(2) do |config|
 config.vm.box = "bento/ubuntu-16.04"

 config.vm.define "slave01" do |slave01|
   slave01.vm.hostname = "slave01"
 end

 config.vm.define "slave02" do |slave02|
   slave02.vm.hostname = "slave02"
 end

end

Ja annoin Vagrantin luoda koneet:

$ sudo vagrant up

Vagrantilla meni muutama minuutti luoda koneet. Kun koneet oli luotu, otin niihin ssh-yhteyden, ja asetin ne orjiksi Rengille. (Rengillä orja? hehe...)

$ vagrant ssh slave01
$ sudo apt-get update
$ sudo apt-get install -y puppet
$ echo -e '\n[agent]\nserver = renki' | sudo tee -a /etc/puppet/puppet.conf
$ echo -e '192.168.1.103\trenki' | sudo tee -a /etc/hosts
$ sudo puppet agent --enable
$ sudo service puppet restart
$ exit

Toistin saman slave02:lle

Kaiken pitäisi olla asennusten osalta kunnossa. Sitten oli aika tarkastaa Puppetmasterin sertifikaattilista uusista sertifikaateista. Annoin Rengillä seuraavan komennon

sudo puppet cert --list

Puppet listasi slave01:n ja slave02:n sertifikaatit, jotka allekirjoitin. Ubuntumaten ja ubuntun sertit olin allekirjoittanut jo aikaisemmin.

sudo puppet cert sign slave01.pp.htv.fi slave02.pp.htv.fi

Testasin konfiguraation toimivuuden yksinkertaisella puppet-moduulilla. Puppetmasterilla minulla oli hello-moduuli, joka luo tiedoston "/tmp/helloPuppet.txt", joka sisältää tekstin "Moikkamoi!"

Jotta tuo moduuli pusketaan orjille, loin seuraavanlaisen site.pp:n hakemistoon /etc/puppet/manifests. Nodejen kirjoitusasuun sain apua tästä puppetin manuaalisivusta.

node 'ubuntumate.pp.htv.fi', 'ubuntu.pp.htv.fi', 'slave01.pp.htv.fi', 'slave02.pp.htv.fi'{
include hello
}

Tämä varmistaa sen, että saan manuaalisesti määritellä, mitä millekin koneelle tarjotaan. Tässä esimerkissä olen listannut kaikki asentamani nodet samaan, mutta tämä ainakin varmistaa että moduuleja ei vahingossakaan tarjota sellaisille, joille en ole niitä tarkoittanut.

Kävin vielä jokaisella koneella varmistamassa, että moduuli toimii:

vagrant@slave01:~$ cat /tmp/helloPuppet.txt
Moikkamoi!

Tulos oli vastaavanlainen kaikilla neljällä koneella.

Näin olin siis asentanut monta orjaa yhteen masteriin.

2. Kerää tietoja orjista

Tehtävä b). Tehtävään kului noin 15 minuuttia

Seuraava tehtävä oli kerätä tietoja orjista: niiden MAC-osoitteet, ovatko ne virtuaalisia vai rautakoneita, jne. Tämä tieto löytyy ohjeen mukaan /var/lib/puppet/ hakemistosta.

Tuohon hakemistoon ei niin vain pääsekään käsiksi, joten korotin itseni superuseriksi ja listasin kansiorakenteen:

$ sudo -i
$ cd /var/lib/puppet/

Ja listasin kansiorakenteen:

$ tree

root@renki:/var/lib/puppet# tree
.
├── bucket
├── clientbucket
├── client_data
├── client_yaml
├── facts.d
├── lib
├── preview
├── reports
│   ├── slave01.pp.htv.fi
│   │   ├── 201711121757.yaml
│   │   ├── 201711121810.yaml
│   │   ├── 201711121812.yaml
│   │   └── 201711121816.yaml
│   ├── slave02.pp.htv.fi
│   │   ├── 201711121758.yaml
│   │   └── 201711121817.yaml
│   ├── ubuntumate.pp.htv.fi
│   │   ├── 201711091428.yaml
│   │   ├── 201711091438.yaml
│   │   ├── 201711091508.yaml
│   │   ├── 201711091538.yaml
│   │   ├── 201711091608.yaml
│   │   ├── 201711091638.yaml
│   │   ├── 201711091708.yaml
│   │   ├── 201711091738.yaml
│   │   ├── 201711091808.yaml
│   │   ├── 201711091838.yaml
│   │   ├── 201711091908.yaml
│   │   ├── 201711091938.yaml
│   │   ├── 201711092008.yaml
│   │   ├── 201711092038.yaml
│   │   ├── 201711092108.yaml
│   │   ├── 201711092138.yaml
│   │   ├── 201711092208.yaml
│   │   ├── 201711092238.yaml
│   │   ├── 201711092308.yaml
│   │   ├── 201711092338.yaml
│   │   ├── 201711100008.yaml
│   │   ├── 201711100038.yaml
│   │   ├── 201711100108.yaml
│   │   ├── 201711100138.yaml
│   │   ├── 201711100208.yaml
│   │   ├── 201711100238.yaml
│   │   ├── 201711100308.yaml
│   │   ├── 201711100338.yaml
│   │   ├── 201711100408.yaml
│   │   ├── 201711100438.yaml
│   │   ├── 201711100508.yaml
│   │   ├── 201711100538.yaml
│   │   ├── 201711100608.yaml
│   │   ├── 201711100638.yaml
│   │   ├── 201711100708.yaml
│   │   ├── 201711100738.yaml
│   │   ├── 201711100808.yaml
│   │   ├── 201711100838.yaml
│   │   ├── 201711100908.yaml
│   │   ├── 201711100938.yaml
│   │   ├── 201711101008.yaml
│   │   ├── 201711101038.yaml
│   │   ├── 201711101108.yaml
│   │   ├── 201711101138.yaml
│   │   ├── 201711101208.yaml
│   │   ├── 201711101238.yaml
│   │   ├── 201711101308.yaml
│   │   ├── 201711101338.yaml
│   │   ├── 201711101408.yaml
│   │   ├── 201711101438.yaml
│   │   ├── 201711101508.yaml
│   │   ├── 201711101538.yaml
│   │   ├── 201711101608.yaml
│   │   ├── 201711101638.yaml
│   │   ├── 201711101708.yaml
│   │   ├── 201711101738.yaml
│   │   ├── 201711101808.yaml
│   │   ├── 201711101838.yaml
│   │   ├── 201711101908.yaml
│   │   ├── 201711101938.yaml
│   │   ├── 201711102008.yaml
│   │   ├── 201711102038.yaml
│   │   ├── 201711102108.yaml
│   │   ├── 201711102138.yaml
│   │   ├── 201711102208.yaml
│   │   ├── 201711102238.yaml
│   │   ├── 201711102308.yaml
│   │   ├── 201711102338.yaml
│   │   ├── 201711110008.yaml
│   │   ├── 201711110038.yaml
│   │   ├── 201711110108.yaml
│   │   ├── 201711110138.yaml
│   │   ├── 201711110208.yaml
│   │   ├── 201711110238.yaml
│   │   ├── 201711110308.yaml
│   │   ├── 201711110338.yaml
│   │   ├── 201711110408.yaml
│   │   ├── 201711110438.yaml
│   │   ├── 201711110508.yaml
│   │   ├── 201711110538.yaml
│   │   ├── 201711110608.yaml
│   │   ├── 201711110638.yaml
│   │   ├── 201711110708.yaml
│   │   ├── 201711110738.yaml
│   │   ├── 201711110808.yaml
│   │   ├── 201711110838.yaml
│   │   ├── 201711110908.yaml
│   │   ├── 201711110938.yaml
│   │   ├── 201711111008.yaml
│   │   ├── 201711111038.yaml
│   │   ├── 201711111108.yaml
│   │   ├── 201711111138.yaml
│   │   ├── 201711111208.yaml
│   │   ├── 201711111238.yaml
│   │   ├── 201711111308.yaml
│   │   ├── 201711111338.yaml
│   │   ├── 201711111408.yaml
│   │   ├── 201711111438.yaml
│   │   ├── 201711111508.yaml
│   │   ├── 201711111538.yaml
│   │   ├── 201711111608.yaml
│   │   ├── 201711111638.yaml
│   │   ├── 201711111708.yaml
│   │   ├── 201711111738.yaml
│   │   ├── 201711111808.yaml
│   │   ├── 201711111838.yaml
│   │   ├── 201711111908.yaml
│   │   ├── 201711111938.yaml
│   │   ├── 201711112008.yaml
│   │   ├── 201711112038.yaml
│   │   ├── 201711112108.yaml
│   │   ├── 201711112138.yaml
│   │   ├── 201711112208.yaml
│   │   ├── 201711112238.yaml
│   │   ├── 201711112308.yaml
│   │   ├── 201711112338.yaml
│   │   ├── 201711120008.yaml
│   │   ├── 201711120038.yaml
│   │   ├── 201711120108.yaml
│   │   ├── 201711120138.yaml
│   │   ├── 201711120208.yaml
│   │   ├── 201711120238.yaml
│   │   ├── 201711120308.yaml
│   │   ├── 201711120338.yaml
│   │   ├── 201711120408.yaml
│   │   ├── 201711120438.yaml
│   │   ├── 201711120508.yaml
│   │   ├── 201711120538.yaml
│   │   ├── 201711120608.yaml
│   │   ├── 201711120638.yaml
│   │   ├── 201711120708.yaml
│   │   ├── 201711120738.yaml
│   │   ├── 201711120808.yaml
│   │   ├── 201711120838.yaml
│   │   ├── 201711120908.yaml
│   │   ├── 201711120938.yaml
│   │   ├── 201711121008.yaml
│   │   ├── 201711121038.yaml
│   │   ├── 201711121108.yaml
│   │   ├── 201711121138.yaml
│   │   ├── 201711121208.yaml
│   │   ├── 201711121238.yaml
│   │   ├── 201711121308.yaml
│   │   ├── 201711121338.yaml
│   │   ├── 201711121408.yaml
│   │   ├── 201711121438.yaml
│   │   ├── 201711121508.yaml
│   │   ├── 201711121538.yaml
│   │   ├── 201711121608.yaml
│   │   ├── 201711121638.yaml
│   │   ├── 201711121708.yaml
│   │   ├── 201711121738.yaml
│   │   └── 201711121808.yaml
│   └── ubuntu.pp.htv.fi
│       └── 201711121821.yaml
├── rrd
├── server_data
├── ssl
│   ├── ca
│   │   ├── ca_crl.pem
│   │   ├── ca_crt.pem
│   │   ├── ca_key.pem
│   │   ├── ca_pub.pem
│   │   ├── inventory.txt
│   │   ├── private
│   │   │   └── ca.pass
│   │   ├── requests
│   │   ├── serial
│   │   └── signed
│   │       ├── renki.bb.dnainternet.fi.pem
│   │       ├── slave01.pp.htv.fi.pem
│   │       ├── slave02.pp.htv.fi.pem
│   │       ├── ubuntumate.pp.htv.fi.pem
│   │       └── ubuntu.pp.htv.fi.pem
│   ├── certificate_requests
│   ├── certs
│   │   ├── ca.pem
│   │   └── renki.bb.dnainternet.fi.pem
│   ├── crl.pem
│   ├── private
│   ├── private_keys
│   │   └── renki.bb.dnainternet.fi.pem
│   └── public_keys
│       └── renki.bb.dnainternet.fi.pem
├── state
│   ├── agent_disabled.lock
│   └── graphs
└── yaml
    ├── facts
    │   ├── slave01.pp.htv.fi.yaml
    │   ├── slave02.pp.htv.fi.yaml
    │   ├── ubuntumate.pp.htv.fi.yaml
    │   └── ubuntu.pp.htv.fi.yaml
    └── node
        ├── slave01.pp.htv.fi.yaml
        ├── slave02.pp.htv.fi.yaml
        ├── ubuntumate.pp.htv.fi.yaml
        └── ubuntu.pp.htv.fi.yaml

29 directories, 186 files

Kansiorakenteesta päättelin, että hakemisto "yaml/facts" voisi sisältää faktoja orjista.

Luin slave01:n tiedot:

$ cat yaml/facts/slave01.pp.htv.fi.yaml

Tiedosto sisälsi paljon tekstiä, näytti siltä että kaikki mahdollinen data orjasta on listattu. Slave01:llä ja slave02:lla data oli lähes tulkoon samaa, ja täysin samassa järjestyksessä. Oleellisesti erilaiset oli kohta "uuid". UUID voisi viitata Universally Unique Identifieriin, eli kyseessä on varmaan koneen viime kädessä yksilöivä tunniste.Muuten eroja oli vain uptimessä ja vapaan muistin määrässä.

Ubuntun ja ubuntumaten datat olivat keskenään (sekä slave01:n ja 02:n kanssa) aivan eri järjestekysessä.

Virtuaalisuuden osoitus löytyi kohdista "virtual" ja "is_virtual". Slaveilla se näytti tältä:

virtual: kvm
is_virtual: "true"

Fyysisillä ubuntulla ja ubuntumatella taas seuraavanlainen:

virtual: physical
is_virtual: "false"

Koneiden MAC-osoitteet löytyvät kohdasta "macaddress:". Sen lisäksi MACci löytyy erikseen jokaisen internet interfacen kohdasta. Esimerkiksi macaddress_eth0 tai macaddress_wlan0

Virtuaalikoneilla slave01 ja slave02 on sama MAC-osoite:

macaddress: "08:00:27:67:d9:b9"

Rautakoneilla ubuntulla ja ubuntumatella on luonnollisesti uniikit MACit:

macaddress: "fc:45:96:2d:ab:ab" #ubuntu
macaddress: "b8:27:eb:85:b1:06" #ubuntumate

Tiedosto sisältää muutakin dataa, mm. koneen IP-osoitteen, muistin määrän (vapaa ja kokonaismuisti), prosessorien määrän ja tyypin, uptimen (päälläoloaika), käyttöjärjestelmän jne.

Tässä vielä esimerkkinä slave01:n data.

3. Orjuuttava skripti

Tehtävät c) ja d). Tehtävään kului noin 30 minuuttia

Tehtävänä oli tehdä skripti, joka muuttaa koneen Puppet-orjaksi tietylle masterille.

Halusin laittaa sen vielä Vagrantin provisiointiskriptiksi. Lähestyin tehtävää lyömällä putkeen komennot, joita olen aikaisemmissa tehtävissä antanut. Skripti asettaa koneen Renki-serverini orjaksi, ja se toimii vain samassa lähiverkossa olevassa koneessa.

	sudo apt-get update
		# Pakettitietojen päivitys
	sudo apt-get install -y puppet
		# Puppetin asennus
	echo -e '\n[agent]\nserver = renki' | sudo tee -a /etc/puppet/puppet.conf
		# Kirjoita ohje agentille puppet.confiin
	echo -e '192.168.1.103\trenki' | sudo tee -a /etc/hosts
		# hosts-tiedostoon rengin IP
	sudo puppet agent --enable
		# Puppet agentin käyttöönotto
	sudo service puppet restart
		# Puppet-palvelun uudelleenkäynnistys

Tämä skripti pitäisi ajaa kun kone luodaan, niin se asettuu orjaksi Rengille. Sertifikaatti pitää tosin käsin hyväksyä, mutta en näe sitä itse haitallisena. Sertifikaattien hyväksyntä on kuitenkin aika helppoa copy/paste-hommaa, ja kaikki nodet voi lyödä yhden komennon jatkeeksi. (tyyliin "sudo puppet cert sign slave01.pp.htv.fi slave02.pp.htv.fi ubuntu.pp.htv.fi")

Kuinka tämä skripti sitten asetetaan ajettavaksi Vagrantissa, siihen käytin Tero Karvisen ohjetta apuna.

Muutin Vagrantfileni seuraavanlaiseksi:

$tscript = <<TSCRIPT
sudo apt-get update
        # Pakettitietojen päivitys
sudo apt-get install -y puppet
        # Puppetin asennus
echo -e '\n[agent]\nserver = renki' | sudo tee -a /etc/puppet/puppet.conf
        # Kirjoita ohje agentille puppet.confiin
echo -e '192.168.1.103\trenki' | sudo tee -a /etc/hosts
        # hosts-tiedostoon rengin IP
sudo puppet agent --enable
        # Puppet agentin käyttöönotto
sudo service puppet restart
        # Puppet-palvelun uudelleenkäynnistys
TSCRIPT

Vagrant.configure(2) do |config|
 config.vm.box = "bento/ubuntu-16.04"
 config.vm.provision "shell", inline: $tscript

 config.vm.define "slave01" do |slave01|
   slave01.vm.hostname = "slave01"
 end

 config.vm.define "slave02" do |slave02|
   slave02.vm.hostname = "slave02"
 end

end

Tässä vaiheessa tuhosin vanhat virtuaalikoneet:

$ vagrant destroy

Ja poistin sertifikaattitiedot, jotta samannimisten agenttien lisäyksessä ei tulisi ongelmia:

$ sudo rm -r /var/lib/puppet/ssl

Ja loin koneet uudestaan:

$ vagrant up

Vagrantin luotua koneet, katsoin onko puppetmaster saanut sertifikaattipyynnöt:

$ sudo puppet cert list --all
"slave01.pp.htv.fi" (SHA256)
"slave02.pp.htv.fi" (SHA256)

Näyttäisi saaneen. Allekirjoitin ne:

$ sudo puppet cert sign slave01.pp.htv.fi slave02.pp.htv.fi

Ja kävin tarkastamassa hello-tiedoston paikallaanolon:

$ vagrant ssh slave01
vagrant@slave01:~$ cat /tmp/helloPuppet.txt
Moikkamoi!

Siellä on, joten skripti toimii!

4. Oikeaa elämää Puppetilla

Tehtävä e).

Tehtävänä oli ratkaista jokin kurssin ulkopuolinen asia Puppetilla. Halusin automatisoida Renki-serverini ylläpitoa Apachen ja Mumble serverin versionhallinnan osalta. Oli siis luotava moduulit, jotka pitävät huolen että demoneista on tuoreimmat versiot.

Testasin, että saan Puppetin palvelemaan itseään. Lisäsin "renki.bb.dnainternet.fi" nodeksi site.pp:hen hello-moduulin jakoon, ja puppet.conf:iin linet [agent] ja "server = renki"

Tämän jälkeen ajoin komennot:

$ puppet agent --enable
$ service puppet restart
$ cat /tmp/helloPuppet.txt
Moikkamoi!

Itsepalvelu toimii, sillä testitiedosto oli paikallaan. Seuraavaksi tuli luoda moduuli, joka pitää huolen että mumble ja apache ovat viimeisimmät versiot. Lähdin muuttamaan aikaisemmin luomaani apache-moduulia:

class renki {
	package { 'apache2':	#Install Apache
	ensure => 'latest',	#Ensure it is the latest version
	}

	service { 'apache2':	#Ensure it is running and starts on boot
		ensure => 'running',
		enable => 'true',
		require => Package['apache2'],
	}

        package { 'mumble-server':
                ensure => 'latest',
        }

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

Tämä moduuli asentaa apachen ja mumblen, pitää huolen että ne on päällä, ja että ne ovat viimeisimmät versiot. En halunnut testata moduulia tuotannossa olevalla koneella, joten testasin sitä Livetikulta ajetulla ubuntulla.

Rakensin ylläolevan moduulin kansioon /etc/puppet/modules/renki/manifests

Ja ajoin moduulin:

$ sudo puppet apply -e 'class {"renki":}'

Tein tehtävän 2 mukaiset testit joilla varmistin demonien asentuneen.

Latasin moduulin gittiin, jotta voin kopioida sen kätevästi Rengille.

Kloonasin sen Rengillä puppetin hakemistoon:

$ cd /etc/puppet/modules $ git clone https://github.com/matiasraisanen/renki.git

Ja lisäsin manifestiin seuraavan koodin:

$ sudoedit /etc/puppet/manifests/site.pp

node 'renki.bb.dnainternet.fi'{
	include renki
}

Nyt pystyin testien perusteella olettamaan, että moduuli ajetaan Rengillä, ja paketit päivitetään tarvittaessa.