hiera-eyaml – caveat emptor

Ik gebruik Puppet voor mijn persoonlijk serverpark, en ben daar best tevreden over. Maar af en toe …

Zoals nu dus. In het kader van een herstructurering wordt de Puppetmaster gemigreerd van een VPS naar een fysieke server. Wanneer ik zeg gemigreerd, bedoel ik eigenlijk opnieuw opgezet, met een aantal verbeteringen, zoals daar zijn verschillende environments en r10k voor de synchronisatie van repositories en modules.

Omdat alles in git zit (uiteraard) en ik een beetje paranoïde ben, versleutel ik mijn wachtwoorden en SSH-sleutels (opgeslagen in Hiera) met hiera-eyaml.

De gem (Ruby …) was mooi geïnstalleerd, en mijn hiera.yaml (geconfigureerd per environment) leek in orde.

:hierarchy:
 - "%{::osfamily}"
 - webservers
 - databases
 - roles
 - common
:backends:
 - eyaml
 - yaml
:yaml:
 :datadir: "/etc/puppetlabs/code/environments/%{::environment}/hieradata"
:eyaml:
 :datadir: "/etc/puppetlabs/code/environments/%{::environment}/hieradata"
 :pkcs7_private_key: "/etc/puppetlabs/puppet/keys/private_key.pkcs7.pem"
 :pkcs7_public_key: "/etc/puppetlabs/puppet/keys/public_key.pkcs7.pem"

Maar … Het werkte toch niet (anders was er nu geen blogpost). Na een (vruchteloze) speurtocht doorheen /etc om alle mogelijke hiera.yaml-bestanden die de Puppetserver (foutief) zou kunnen inladen te verwijderen, bleef dezelfde foutmelding terugkomen.

Sep 1 21:14:40 stock puppet-agent[6330]: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: Function lookup() did not find a value for the name 'account_data' on node s1.admin.dc.nidavellir.be

Maar dan, in de krochten van de README (…), bleek dat het niet voldoende was om de gem te installeren via gem install hiera-eyaml. Neen. Dat moest gebeuren via de Puppetserver:

/opt/puppetlabs/bin/puppetserver gem install hiera-eyaml

En jawel …

Sep 2 12:32:53 stock puppet-agent[23914]: Applied catalog in 152.87 seconds

Hoera!

Kerberos: een tragikomedie

Prelude: Vandaag een update uitgevoerd van Fedora 25 naar Fedora 26, en alles ging goed. Alles? Neen, niet alles. Kerberos bleef weerstand bieden aan de overweldigers. Alles is geconfigureerd om via Kerberos en SSH passwordless te kunnen inloggen op het serverpark, maar SSH weigerde koppig dienst.

Confrontatie: De eerste foutmelding leek te wijzen naar het ontbreken van /etc/krb5.keytab (Server not found in Kerberos database). En inderdaad, het vermaledijde bestand was niet aanwezig. Helaas is het niet zo eenvoudig (“onmogelijk”) om te vinden hoe je dat bestand moet aanmaken. Wel wat er moet instaan, maar niet hoe je het moet maken. Ik bespaar u de details, als het /etc/krb5.conf-bestand hetzelfde is als toen het nog werkte, dan moet het zo (ktutil: moet je niet overtypen):

ktutil
ktutil: addent -password -p pieter@dc.helptux.be -k 1 -e RC4-HMAC
ktutil: wkt /etc/krb5.keytab
ktutil: q

kinit pieter@dc.helptux.be

Catharsis: En toch bleef het probleem bestaan. De ontbrekende keytab was dus niet het probleem. Na het raadplegen van een orakel bleek het probleem, zoals altijd, DNS. Ik gebruik korte hostnames om in te loggen (i.e. web1 ipv. web1.dc.helptux.be), maar Kerberos verwacht lange hostnames. Je kan dat oplossen door altijd ssh web1.dc.helptux.be te gebruiken, maar dat was vroeger niet nodig, en dus gaan we dat ook nu niet zo doen. Gelukkig is er in /etc/krb5.conf een instelling die het probleem oplost: dns_canonicalize_hostname. Dit staat standaard op true, maar om onbekende redenen stond het op false. Een kleine aanpassing later werkte alles terug. Zeus zij geprezen!

dns_canonicalize_hostname = true

Puppet: invalid byte sequence in US-ASCII

Puppet probeert een bestand te parsen, denkt dat het ASCII is, maar dat is het niet en faalt dus. Een é gebruiken doe je niet ongestraft.

Dit is geen probleem met Puppet, maar met de locale die ingesteld staat op het systeem. Op zich eenvoudig op te lossen, ware het niet dat het “systeem” in kwestie een docker container is, gebaseerd op Red Hat Enterprise Linux 7.3.

Om een lang verhaal kort te maken, je moet in de Dockerfile de locale-environment variables toevoegen (het uitvoeren van localegen is op RHEL 7.3 niet nodig).

ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8
ENV LANGUAGE en_US:en

En zo staat de locale ingesteld op UTF-8, waardoor de puppet parser dit overneemt en de foutmelding magisch verdwijnt.

Hoera!

NT_STATUS_NO_SUCH_GROUP

De foutmelding NT_STATUS_NO_SUCH_GROUP uit Samba betekent dat één van de groepen die je gebruikt bij de share die je probeert te mounten niet bestaat.

Dat kan er één zijn uit valid users, write list, maar ook force group.

En uiteraard was ik die laatste vergeten. Dag voormiddag!

RPM’s van Python-libraries

Het is niet zo moeilijk als het lijkt. Tenminste, wanneer je setup.py gebruikt, wat de nieuwe (Python 2.7+, dus niet meer zo nieuw) manier is om Pythonpackages te maken. setup.py bevat een call naar de setup-functie, wat een deel is van setuptools.

Hoe je zo’n functie opbouwt kan je in de documentatie vinden, of in de fantastische Python packaging tutorial. Met setup.py kan je de package installeren, maar om te delen met vrienden (die toevallig een RPM-distro gebruiken), kan je ook een echte OS-package maken.

python setup.py bdist_rpm

Je kan eventueel nog extra opties toevoegen, zoals dependencies (–requires) of een specifieke release tag (de RPM-versie, bv. -1) (–release). Zo wordt het heel simpel om een repository op te bouwen van extra, custom, libraries die je zelf hebt gefabriceerd en gebruikt voor jouw projecten. Ook applicaties kan je zo verspreiden.

SELinux Policy op Fedora 25

Bij het gebruik van SELinux is het al eens nodig om een bepaalde aanpassing te doen omdat iets niet werkt. Je kan SELinux simpelweg afleggen natuurlijk, maar dat is niet zo verstandig.

Beter is het om een policy te maken voor de applicatie. Stel dat Samba bijvoorbeeld toegang moet hebben tot een bestandssysteem dat via FUSE gemount wordt. Normaal heeft smbd_t geen toegang tot fusefs_t, maar dat kan met een module snel verholpen worden. Het bestand moet dezelfde naam hebben als de parameter van policy_module (i.e. samba_fuse_access.te in dit geval). Op de Gentoo Wiki staat meer uitleg over de syntax.

policy_module(samba_fuse_access, 1.0)

gen_require(`
        type smbd_t;
        type fusefs_t;
')

allow smbd_t fusefs_t:file { getattr read write unlink open lock };

(Ik geef hier smbd_t het recht om de attr van bestanden met als type fusefs_t te bekijken, om ze te openen, te locken, te verwijderen en ze te lezen en te schrijven. Welke rechten het proces nodig heeft hangt van de applicatie af. Kijk in /var/audit/audit.log om te weten welke nodig zijn en voor welke types. Zoek naar avc: denied { write } of soortgelijk.)

Compileer (met make) de module tot een .pp-bestand (het is dat bestand dat je zal inladen met SELinux).

make -f /usr/share/selinux/devel/Makefile samba_fuse_access.pp

Inladen van de module doe je met semodule.

semodule -i samba_fuse_access.pp

Het is misschien een beetje moeilijker dan gewoon SELinux afleggen, maar het is wel een stuk veiliger.

Rootwachtwoord vergeten?

Je kan dat oplossen!

Of toch als je Grub2 gebruikt. En ik heb het eigenlijk enkel getest op Fedora 25 (met systemd uiteraard).

Pas tijdens het booten je grub-menu aan (druk op ESC en dan e). Op de linux-lijn voeg je single en init=/bin/bash toe, zodat die er zo uit ziet:

 linux /vmlinuz-4.4.0-78-generic root=/dev/mapper/kubuntu--vg-root ro quiet single init=/bin/bash

Hiermee zorg je ervoor dat je systeem opstart in single user mode en dat je init-systeem de shell is. Hierdoor krijg je een root-terminal zonder dat je moet inloggen. Volg de instructies om verder op te starten.

Vooraleer je het rootwachtwoord (of jouw eigen wachtwoord als je sudo gebruikt en dus het rootwachtwoord niet kent) kan resetten, moet je wel eerst het rootbestandssysteem als read-write aankoppelen, want anders kan je de wachtwoorddatabase niet updaten.

Je doet dat met:

mount -o remount,rw /

En dan enkel nog het wachtwoord wijzigen:

passwd root

En dan heropstarten (reboot werkt niet, dus ik exit de shell en reset de PC met een hard reset – uit de shell gaan geeft een toffe kernel panic).

Naar ’t schijnt moet je dit kunnen voor het RHCSA-examen. U weet het nu.

Back-ups met Duplicity

Back-ups maken is zoals naar de tandarts gaan. Iedereen weet dat het moet, maar er is altijd wel een reden om het niet te doen. Tot het te laat is natuurlijk …

Na het opruimen van de server room was dit het volgende project. Uiteraard volgens de regels van de kunst: 2 verschillende locaties, waarvan één lokaal (voor snelle recovery) en één elders (tegen overstromingen, inbraken of andere rampen).

Lokaal is op de NAS in de server room, met een simpel rdiff-backup-script. Het werkt wel nog niet helemaal, maar het is simpel en efficiënt (en natuurlijk automatisch en regelmatig, maar wat had u gedacht).

De kopie elders (ofte de remote) is bij Backblaze, met hun B2 Cloud Storage-product. Waarom? Omdat een server speciaal voor back-ups te huren een hassle is, ik hen al gebruik voor persoonlijke back-ups en er content van ben en omdat ze, in tegenstelling tot Crashplan, wel back-ups van Linux-servers ondersteunen.  Hun back-end integreert immers mooi met Duplicity, dat meteen ook de back-ups versleutelt. Dubbele win!

Het proces is simpel:

  1. Je maakt een GPG-sleutel aan (opgelet: gebruik gpg, niet gpg2!).
  2. Je voert de back-up uit.
  3. (Optioneel, maar aangeraden) Maak een back-up van je GPG-sleutels. Geen sleutels = geen back-ups.

Het zal u goed doen om te horen dat ik stap 2 geautomatiseerd heb; het script is beschikbaar op Github.

Wat is de catch?

  • GPG loopt niet over de gebruiksvriendelijkheid.
  • Je moet je sleutel bijhouden (back-uppen) en importeren voor je het script kan uitvoeren.
  • Duplicity ondersteunt geen GPG2. Het kostte mij een halve dag om dat uit te vissen.
  • Je moet de exclude-opties goed configureren, want opladen gaat traag. Tenzij je een symmetrische verbinding hebt natuurlijk. In dit geval: I want!

Maar toch, better safe than sorry!

“Man Cave” for nerds

Nerds hebben geen “man cave”, die hebben een datacenter. In hun huis. En uiteraard … In iets wat eigenlijk de traphal naar de zolder moet worden. En vandaag, vrije dag, helemaal opgeruimd!

Orde!

Kabels, DVD’s , USB-kabels (een mens vindt die overal) en genoeg RAM-geheugen voor een PC of tien.

Orde!

Rommel-om-computers-mee-samen-te-steken (langlopend project).

Discipline!

Ik heb absoluut niet te veel computers. Alleen te weinig stopcontacten (maar één in gebruik). En ze werken ook niet allemaal …

Ubuntu & AMD Radeon RX 580

Ik ben een gamer. Of beter, ik ben iemand met een game-pc. En op gezette tijden moet je die eens een upgrade geven, want anders ben je niet meer “mee” natuurlijk.

Een paar maanden geleden zijn CPU, moederbord en RAM-geheugen vervangen, nu was het de beurt aan de grafische kaart: van een nVidia GeForce 640T naar een AMD Radeon RX 580. Volgens ’t Internet hoef je daarvoor eigenlijk niet veel te doen: oude kaart eruit, nieuwe kaart erin en klaar.

Gigabyte AMD Radeon RX 580

Was het maar waar. nVidia geeft zich niet zo eenvoudig gewonnen: bij een eerste boot is er uiteraard geen beeld en moet je eerst de nvidia-drivers verwijderen:

apt-get remove nvidia-graphics-drivers-375 && apt-get autoremove

En dan is er wel beeld. Maar toch klopt er iets niet. Een cursory check van de output van lsmod leert dat de amdgpu-driver niet is ingeladen: we gebruiken de i915_bpo-driver, wat de driver is van de embedded graphics chip van de CPU, niettegenstaande de kaart wel herkend wordt en het scherm aangesloten is op de uitgang van de kaart. Ik wist niet dat Ubuntu dat kon.

Na een tweetal avonden zoeken (ik bespaar u de details) naar hoe Ubuntu/X11 kan gedwongen worden om de amdgpu-driver te laden heb ik het helaas opgegeven: in plaats van de Open-Source-driver te gebruiken ben ik naar de site van AMD gegaan en heb daar de proprietary AMDGPU-PRO-driver gedownload en geïnstalleerd. En daarmee werkt het wel, afgezien van een vreemde lichtflits helemaal in het begin van het bootproces. Maar zo’n groot probleem is dat nu ook weer niet.

En wat doet een mens dan? Een ouderwetse game-avond organiseren natuurlijk, maar dan met de graphics maxxed-out. Allez, niet dat het bij Civilization V veel uitmaakt, maar de andere games staan op de Windowspartitie. En daar heb ik de driver nog niet geïnstalleerd …