FAIme Ein Dienst f ur individuelle Installationsmedien und VM Abbilder - GUUG-Frühjahrsfachgespräch

Die Seite wird erstellt Paul-Egon Voss
 
WEITER LESEN
FAIme Ein Dienst f ur individuelle Installationsmedien und VM Abbilder - GUUG-Frühjahrsfachgespräch
FAIme
Ein Dienst für individuelle Installationsmedien
               und VM Abbilder

         Thomas Lange, Debian Entwickler
        Sysadmin an der Universität zu Köln

                   lange@debian.org

                     FFG 2019

                                                   1 / 33
finger Mrfai@localhost

    ◮   whoami
         ◮   Diplominformatiker
         ◮   Systemadministrator an der Uni Köln seit über 25 Jahren
         ◮   SunOS 4.1.1 auf SPARC
         ◮   Solaris Jumpstart
         ◮   1999 erstes Cluster (16× Dual PII 400MHz)
         ◮   FAI seit über 19 Jahren
         ◮   Debian Entwickler seit 2000
         ◮   Mitglied im Debian Cloud Team, Web Team
         ◮   Vorträge und Tutorials auf zahlreichen Konferenzen:
             Linux Kongress, Linuxtag, DebConf, SLAC, LCA, FOSDEM,
             CeBit, OSDC, UKUUG, FrOSCon, Grazer Linuxtage,
             Chemnitzer Linuxtag, GUUG Frühjahrsfachgespräch
         ◮   FAI Schulungen

                                                                    2 / 33
Motivation

    ◮   Debian Installer ist nicht tauglich für Anfänger
    ◮   Mind. 24 Fragen, oft nur ENTER drücken
    ◮   Einige Fragen sind von einem Anfänger nicht zu beantworten
    ◮   Es fehlt ein Modus mit weniger Fragen
    ◮   Andere Distributionen machen Installation deutlich einfacher

                                                                       3 / 33
Die Idee

     ◮   Sollte die üblichen Installationen abdecken
     ◮   Ignoriere Spezialfälle
     ◮   Frage nur die wirklich wichtigen Dinge
     ◮   Frage alles am Anfang
     ◮   Erstelle ein maßgeschneidertes Installationsmedium
     ◮   Boote den Rechner und hole dir einen Kaffe
     ◮   Fertig! Arbeite mit dem neu aufgesetzten Rechner

                                                              4 / 33
Das klingt ein wenig nach FAI

    ◮   FAI = Fully Automatic Installation
    ◮   FAI ist ein Tool für erfahrene Syadmins
    ◮   FAI ist aber auch nicht tauglich für Anfänger :-(
    ◮   Wie kann man es nutzbar für Linux User machen?

                             FAI.me
             https://fai-project.org/FAIme

                                                              5 / 33
FAI.me

         6 / 33
FAI.me Installationsmedium

    ◮   Einfache Erstellung eines Installationsmediums
    ◮   Einfache Anpassungen möglich machen

    ◮   Sprache, Benutzer + Passwort, root Passwort, SSH Key
    ◮   Alle Desktops auswählbar
    ◮   Distributionen: stable, stable+backports, testing
    ◮   Tools, Non-free Firmware, Web, Print, SSH Server
    ◮   Eigene Paketliste
    ◮   Varianten für die Partitionierung (/home, LVM)

                                                               7 / 33
Cloud Images

    ◮   Keine Installation
    ◮   Diskimage kann direkt booten
    ◮   Plattengröße
    ◮   Format (raw.zst, qcow2, vmdk,vhdx, vdi)
    ◮   Hostname
    ◮   Immer nur eine Partition

                                                  8 / 33
FAI.me weitere Ideen

    ◮   FAI kann Diskimages auch cross Architektur bauen
    ◮   D.h. arm64 Plattenimage auf einem amd64 bauen
    ◮   Andere Distributionen (z.B. Ubuntu, CentOS)
    ◮   Einfacher Modus, weniger Boxen
    ◮   Generisches FAI.me Installationsmedium, ohne Pakete
    ◮   Wer noch mehr will, sollte einen eigenen FAI server aufsetzen

                                                                        9 / 33
KIWI

  OpenSUSE: KIWI, the OS image and appliance builder

   ◮   PREPARE (baut die chroot)
        1.   Create Target Root Directory
        2.   Install Packages
        3.   Apply the Overlay Tree
        4.   Apply Archives
        5.   Execute the User-defined Scripts config.sh
        6.   Manage The New Root Tree

   ◮   CREATE (erzeugt das Image)
        1. Execute the User-defined Script images.sh
        2. Create Requested Image Type

                                                          10 / 33
config.kiwi — openSUSE-Leap-42.3-EC2-HVM-Guest
  image schemaversion="6.2" name="openSUSE-Leap-42.3-EC2-HVM" displayname="openSUS
      
          Public Cloud Team
  public-cloud-dev@susecloud.net
  openSUSE Leap 42.3 guest for Amazon EC2 - HVM
config.kiwi
   users group="root">
           
   .
   .
   .
           
                                                                                    12 / 33
config.sh
   # These are all set   by YaST but not by KIWI
   baseUpdateSysConfig   /etc/sysconfig/bootloader LOADER_TYPE grub2
   baseUpdateSysConfig   /etc/sysconfig/console CONSOLE_ENCODING "UTF-8"
   baseUpdateSysConfig   /etc/sysconfig/kernel INITRD_MODULES "ext4"
   baseUpdateSysConfig   /etc/sysconfig/keyboard COMPOSETABLE "clear latin1.add"
   baseUpdateSysConfig   /etc/sysconfig/language INSTALLED_LANGUAGES ""
   baseUpdateSysConfig   /etc/sysconfig/language RC_LANG "en_US.UTF-8"
   baseUpdateSysConfig   /etc/sysconfig/network/config NETCONFIG_MODULES_ORDER "cloud-netconfig dns-resolver dn
   baseUpdateSysConfig   /etc/sysconfig/network/dhcp DHCLIENT_SET_HOSTNAME no
   baseUpdateSysConfig   /etc/sysconfig/network/dhcp WRITE_HOSTNAME_TO_HOSTS no
   baseUpdateSysConfig   /etc/sysconfig/SuSEfirewall2 FW_DEV_EXT "any eth0"
   baseUpdateSysConfig   /etc/sysconfig/SuSEfirewall2 FW_LOG_DROP_CRIT yes
   baseUpdateSysConfig   /etc/sysconfig/SuSEfirewall2 FW_LOG_DROP_ALL no
   baseUpdateSysConfig   /etc/sysconfig/windowmanager X_MOUSE_CURSOR ""
   baseUpdateSysConfig   /etc/sysconfig/windowmanager DEFAULT_WM ""

   echo ’DEFAULT_TIMEZONE="UTC"’ >> /etc/sysconfig/clock
   egrep -q ’^xvc0$’ /etc/securetty || echo xvc0 >> /etc/securetty

   sed -i ’s/#ChallengeResponseAuthentication yes/ChallengeResponseAuthentication no/’ /etc/ssh/sshd_config

   # Remove the password for root
   sed -i ’s/$1$wYJUgpM5$RXMMeASDc035eX.NbYWFl0/*/’ /etc/shadow

   suseInsertService   cloud-init-local
   suseInsertService   cloud-init
   suseInsertService   sshd
   suseRemoveService   boot.efivars
   suseRemoveService   boot.lvm
   suseRemoveService   kbd
   suseRemoveService   acpid

                                                                                                      13 / 33
config.sh
   function   hideSplash
   function   createInitialDevices {
   function   setupNFSServices {
   function   startPlymouth {
   function   readVolumeSetupAllFree {
   function   installBootLoader {
   function   pxeSetupDownloadServer {
   function   preparePartitionTable {
   function   createHybridGPT {
   function   luksResize {
   function   readVolumeSetupAllFree {
   function   setupNFSServices {
   function   deactivateVolumeGroup {
   function   setupKernelModules {
   function   setupBootPartitionPXE {

   baseCleanMount
   baseStripTranslations
   baseSetRunlevel 3
   baseStripLocales
   suseImportBuildKey
   suseInsertService sshd
   suseRemoveYaST
   baseInsertService network
   suseRemoveService avahi-daemon        14 / 33
config.kiwi
   
            yum
            en_US
KIWI
   ◮   Legacy KIWI war Perl, jetzt kiwi-ng 9.X in Python
   ◮   XML Konfig ist einfach nicht gut editierbar
   ◮   157 paketnamen bei SLES 12 based Amazon EC2 Image
   ◮   Davon 57 yast2 Pakete (keine Auflösung der Abhänigkeiten?)
   ◮   Als Konfig management nur Shell
   ◮   Viele Funktionen für config.sh verfügbar
   ◮   Doku unübersichtlich: Wie kann ich /etc/fstab.append und
       /etc/fstab.patch nutzen?
   ◮   RELAX NG Schema for the Extension, API Documentation
       9.x, Schema Documentation 6.9
   ◮   227 mal wird Python Command.run aufgerufen, cp, mkdir, ln
   ◮   Python als Shell wrapper?
   ◮   Guter Start:
       https://github.com/SUSE/kiwi-descriptions
                                                                      16 / 33
PACKER
  Packer is a tool for creating identical machine images for multiple
  platforms from a single source configuration
    ◮   Tool in Go von Hashicorp
    ◮   Vagrant, Terraform, Vault, Consult, Nomad
    ◮   Templates sind Konfiguration in JSON
    ◮   Builders: EC2, Azure, Hetzner Cloud, OpenStack, Qemu
    ◮   Provisioners: Ansible, Chef, Puppet, Shell, Salt, PowerShell
    ◮   Post-processors: z.B. Image komprimieren, Upload machen,
        Image registrieren
    ◮   Post-P: Alicould/Amazon/DigitalOcean/GCE,/Docker
        Import, Vagrant, vSphere, Shell (local), Compress, Checksum,
        Docker Push/Save/Tag
    ◮   Variablen werden auch im JSON definiert

                                                                        17 / 33
Packager builder

   Der Builder startet die VM und baut daraus ein Image. Braucht
   immer ein Image oder ISO zum booten. Entweder ein
   Installationsimage oder ein Base Image, das dann modifiziert wird.
     ◮   Läd ISO herunter
     ◮   Erzeugt leere VM und bootet von CD
     ◮   Autom. installation mit preseed/kickstart
     ◮   Preseed/kickstart kommt von packers eingebautem http server
     ◮   Packer wartet auf ssh connection
     ◮   OS Installer läuft und rebootet
     ◮   Packer connected via ssh und führt Provisioners aus
     ◮   Packer macht shutdown der VM und führt post-processors aus

                                                                        18 / 33
Packer Provisioner

    "provisioners": [{
      "type": "shell",
      "inline": [
        "sleep 30",
        "sudo apt-get update",
        "sudo apt-get install -y redis-server"
      ]
    }]

                                                 19 / 33
Packer
   {
       "builders":
       [
         {
           "type": "qemu",
           "iso_url": "http://abc.de/centos/6/CentOS-6.9-x86_64-minimal.iso",
           "iso_checksum": "af4a1640c0c6f348c6c41f1ea9e192a2",
           "iso_checksum_type": "md5",
           "output_directory": "output_centos_tdhtest",
           "shutdown_command": "echo ’packer’ | sudo -S shutdown -P now",
           "disk_size": 5000,
           "format": "qcow2",
           "accelerator": "kvm",
           "http_directory": "path/to/httpdir",
           "ssh_username": "root",
           "ssh_password": "s0m3password",
           "ssh_timeout": "20m",
           "vm_name": "tdhtest",
           "net_device": "virtio-net",
           "disk_interface": "virtio",
           "boot_wait": "10s",
           "boot_command": [
             " text ks=http://{{ .HTTPIP }}:/centos6-ks.cfg"
           ]
         }                                                                     20 / 33
Packer
     "builders" : [
         {
             "type" : "amazon-ebs",
             "profile" : "default",
             "region" : "{{user ‘region‘}}",
             "instance_type" : "t2.micro",
             "source_ami" : "ami-1853ac65",
             "ssh_username" : "ec2-user",
             "ami_name" : "docker-17.12.1-ce",
             "ami_description" : "Amazon Linux Image with Docker-CE",
             "run_tags" : {
                 "Name" : "packer-builder-docker",
                 "Tool" : "Packer",
                 "Author" : "mlabouardy"
             }
         }
     ],
     "provisioners" : [
         {
             "type" : "shell",
             "script" : "./setup.sh"
         }
     ]

                                                                        21 / 33
Packer
   "provisioners": [
     {
       "type": "shell",
       "inline": [
         "mkdir .ssh",
         "echo ’{{user ‘public_key‘}}’ >> .ssh/authorized_keys"
       ]
     },
     {
       "type": "shell",
       "execute_command": "echo ’{{user ‘ssh_pass‘}}’ | {{ .Vars }} sudo -E -S sh
       "inline": [
         "add-apt-repository ppa:rquillo/ansible",
         "apt-get update",
         "apt-get install -y ansible",
         "echo ’%sudo    ALL=(ALL) NOPASSWD:ALL’ >> /etc/sudoers"
       ]
     },
     {
       "type": "ansible-local",
       "playbook_file": "site.yml"
     }
   ]

                                                                            22 / 33
Packer
       "builders": [
          {
            "type": "amazon-ebs",
            "access_key": "{{user ‘aws_access_key‘}}",
            "secret_key": "{{user ‘aws_secret_key‘}}",
            "region": "us-east-1",
            "source_ami_filter": {
               "filters": {
                  "virtualization-type": "hvm",
                  "name": "ubuntu/images/*ubuntu-xenial-16.04-amd64-server-*",
                  "root-device-type": "ebs"
               },
               "owners": ["099720109477"],
               "most_recent": true
            },
            "instance_type": "t2.micro",
            "ssh_username": "ubuntu",
            "ami_name": "packer-vault-example {{timestamp}}"
          }
       ],
       "provisioners": [
          {
            "type": "shell",
            "inline": [
               "git clone --branch master https://github.com/hashicorp/terraform-aws-vault.git /tmp/terraform",
               "/tmp/terraform/modules/install-vault/install-vault --version 0.10.4"
            ],
            "pause_before": "30s"
          }
       ]
   }

                                                                                                        23 / 33
Packer

    ◮    Nachteil/Vorteil: Image bauen passiert in der Ziel VM
    ◮    Overhead
    ◮    Nutzung des OS Installer ist nicht so flexibel
    ◮    Vorhandenes Config Management kann vielleicht genutzt
         werden
    ◮    Viele Builder, Provisioner, Post-Processors vorhanden
    ◮    Dokumentation gut
    ◮    Plugins sind in Go zu schreiben

                                                                 24 / 33
Packer

    ◮    https://github.com/chef/bento
    ◮    Packer templates for building minimal Vagrant baseboxes
    ◮    Viele OSes: amazonlinux, centos, freebsd, ubuntu, debian,
         macos, opensuse, sles, windows, fedora, hardenedbsd,
         oraclelinux, rhel, solaris
    ◮    Provisioner in shell gemacht
    ◮    Problem: 6 JSON Varianten f. Ubuntu
    ◮    Ca. 310 Zeilen, aber nur 6 Zeilen diff

                                                                     25 / 33
FAI.me im Hintergrund

    ◮   Webserver 6= Buildserver
    ◮   Perl CGI das die Eingaben validiert
    ◮   Je Auftrag ein Unterverzeichnis
    ◮   Schreibt eine config und eine meta Datei
    ◮   Status im Web sichtbar (waiting, processing, done, error)
    ◮   Shellskript auf dem Build Server verarbeitet neue Jobs
    ◮   Neue nfsroot, monitoring, cleanup alter Jobs

                                                                    26 / 33
FAI Architektur
     install server                                          install client
                                                              /
                                                              /usr
           nfsroot       mounted by kernel
                                                              /bin
                                                              /var

         config space    NFS, svn, git, HTTP
     ./hooks                                                 .../fai/config/
     ./class                                                 /target/
     ./disk_config
                                                             /target/usr
     ./package_config
     ./scripts                                               /target/var
     ./files

                                                          or NFS
                                                  , FTP
                                      d via   HTTP
                              provide
         Debian mirror                                                 local
                                                                     hard disk

                                                                                 27 / 33
FAI Architektur

    ◮   FAI Config Space
    ◮   FAI Klassen
    ◮   AMD64 DEBIAN STRETCH HOME LVM BACKPORTS SSH SERVER
        NONFREE GNOME FAIME
    ◮   Installations ISO
        fai-mirror -cDEBIAN,GNOME,BACKPORTS,FAIME /tmp/mirror
        fai-cd -m /tmp/mirror ABC.iso
    ◮   Cloud Image
        fai-diskimage -S5G -cDEBIAN,GNOME,FAIME AB12.raw.zst

                                                             28 / 33
Plattenpartitionierung

   Example: .../disk config/HOME LVM:

   # entire disk with LVM, separate /home
   disk_config disk1 fstabkey:uuid align-at:1M

   primary /boot     200      ext2    rw,noatime
   primary -         4G-      -       -

   disk_config lvm
   vg vg1 disk1.2
   vg1-root     /          3G-50G    ext4   noatime,rw
   vg1-swap     swap       200-4G    swap   sw
   vg1-home     /home      600-      ext4   noatime,nosuid,nodev,rw

     ◮   File systems: ext[2,3,4], vfat, xfs, ReiserFS, NTFS, btrfs

                                                                      29 / 33
Softwareinstallation
   Beispiel: .../package config/DEBIAN:

   PACKAGES install-norec
   apt-transport-https # is only needed for stretch
   sudo debconf-utils
   file less linuxlogo rsync openssh-client
   time procinfo
   nullmailer
   console-setup kbd pciutils usbutils
   unattended-upgrades

   PACKAGES install NONFREE
   firmware-bnx2 firmware-bnx2x firmware-realtek
   firmware-linux-nonfree

   PACKAGES install AMD64
   linux-image-amd64
   memtest86+

                                                      30 / 33
FAI Referenzen

                 31 / 33
FAI Nutzer
    ◮ Anonymous, financial industry, 32.000 hosts
    ◮ LVM insurance, 10.000 hosts
    ◮ City of Munich, 16.000 hosts
    ◮ Albert Einstein Institute, 1725 hosts
    ◮ Mobile.de, ∼600 hosts
    ◮ StayFriends, 700+ hosts
    ◮ XING AG, 300-400 hosts
    ◮ Opera Software, ∼300 hosts
    ◮ Stanford University, 450 hosts
    ◮ MIT Computer science research lab, 200 hosts
    ◮ The Welcome Trust Sanger Institute, 540 hosts
    ◮ Deutsches Elektronen-Synchrotron, 273 hosts
    ◮ Archive.org, 200+ hosts
    ◮ Electricité de France (EDF), 1500 hosts
    ◮ BUF, digital visual effects company, 1000 hosts
    ◮ Zivit, 260 hosts on two IBM z10 EC mainframes
    ◮ ETH Zurich, systems group, ∼300 hosts
    ◮ Grml, creating eight different ISOs, daily builds

                                                          32 / 33
https://fai-project.org/FAIme

                              n ?
                      ra   ge
                     F
                                    33 / 33
Sie können auch lesen