Smidig dator-setup med Ansible

Nu när jag äntligen hade fått min nya dator gick jag och drog mig för jobbet med att installera alla program och få inställningar på plats. Det borde gå att automatisera, tänkte jag. Och självklart går det. Jag har använt mig av ett verktyg som heter Ansible. Här beskriver jag hur man gör.

Förutsättningar och förberedelser

Vi utgår från en dator med ett nyinstallerat GNU/Linux-baserat operativsystem - i mitt fall ett Debian-baserat men det finns stöd för fler varianter. Det är också nödvändigt att installationen har skapat ett användarkonto som har administrationsbehörighet. Om inte, behöver man göra det själv.

Ansible använder ssh för att logga in på datorn, och därför installerar vi openssh-server. Ansible är ett python-program och det installerar man med pip som är en programhanterare för python.

sudo apt update && sudo apt install openssh-server python3-pip

Ofta använder man Ansible från en laptop hantera en, flera eller massor av servrar. Jag tänker i det här fallet köra Ansible på samma dator som allt ska installeras på. Vi skapar en ssh-nyckel som används för smidig inloggning.

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/jon/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/jon/.ssh/id_rsa
Your public key has been saved in /home/jon/.ssh/id_rsa.pub
The key fingerprint is:
[...]

För att kunna använda nyckeln till att logga in på ett system kan man föra över den med hjälp av ssh-copy-id. I detta fall “överför” vi den till det egna systemet, alltså localhost.

$ ssh-copy-id localhost
The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is SHA256:LhW[...]9xnenFw.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'localhost'"
and check to make sure that only the key(s) you wanted were added.

Nu kommer Ansible att kunna logga in automagiskt på localhost. (Om du som läser vet nåt snyggare sätt att hantera detta, så kontakta mig gärna. Jag är nybörjare på Ansible.)

Skapa en Ansible-playbook

Först skapar vi en katalog setup-laptop och i den katalogen en fil som heter ansible.cfg som innehåller följande två rader:

[defaults]
inventory = ./hosts

Nu har vi specat att vårt inventory, dvs listan över de datorer vi ska hantera, finns i filen hosts i samma katalog. Sen skapar vi en fil som heter hosts med föjande rvå rader:

[mindator]
localhost

Nu har vi specificerat en host som heter mindator och har adressen localhost.

Nu skapar vi själva playbooken, i en fil som heter playbook.yaml.

- hosts: mindator
  tasks:
    - name: install nice programs
      become: yes
      ansible.builtin.apt:
        update_cache: yes
        name: [pandoc, lynx, nmap, wireguard, tldr, keepassxc, signal-desktop]
        state: present

Förklaring:

  1. Första raden talar om vilka hosts, alltså datorer, som playbooken ska köras på. I detta fall bara mindator, så som den är definierad i filen hosts.
  2. Här ska vi definiera tasks. Än så länge har vi bara en:
  3. Namnet på tasken är install nice programs
  4. become: yes är ett märkligt sätt att säga att för den här uppgiften behöver vi nyttja adminbehörighet, dvs become root
  5. Vi vill använda en inbyggd modul som heter apt - alltså programhanteraren som finns på Debianbaserade system. Har din distribution nån annan pakethanterare finns moduler aur, dnf, yum m.fl.
  6. Vi vill updatera cachen innan vi försöker installera, precis som när vi skriver apt update innan vi skriver apt install när vi installerar nåt via terminalen.
  7. Här skriver vi namnen på de programpaket som vi vill installera. (Om man inte vet namnet på programaketet kan man söka i terminalen, ex: apt search netstat om det nu är programmet Netstat man är ute efter.)
  8. Vi specificerar här att efter operationen ska de listade programmen finnas, dvs vara present. (Skriver man istället absent kommer de att avinstalleras. Kan också vara bra att kunna göra.)

Nu kör vi playbooken och ser vad som händer. Växeln --ask-become-pass skriver vi för få tillfälle att skriva in lösenordet för att ansible ska få admin-behörighet (precis som man får göra när man skriver sudo apt ...).

ansible-playbook --ask-become-pass playbook.yaml

Om allt fungerar som det ska, kommer man att få ange lösenordet, sen kommer dina program att installeras.

Installera program som inte finns i repot

Vissa program går inte att installera med att skriva sudo apt install ... utan vidare eftersom det inte finns i distributionens repo. Ibland får man manuellt ladda hem och installera en .deb-fil. För att få Ansible att göra det, lägger vi till följande i vår playbook.yaml:

    - name: install mullvad vpn
      become: yes
      apt:
        deb: https://mullvad.net/download/app/deb/latest/

Ansibles apt-modul behöver bara veta adressen till deb-filen så laddas den ned och installeras.

Installera program från ett annat repo än distributionens

Vissa andra program som inte finns i distributionens repo går att installera genom att lägga till ytterligare ett repo. I exemplet nedan installerar vi Matrix-klienten Element (ett program för chatt samt ljud- och videosamtal). Vi gör det i tre steg:

  1. Lägga till repots signeringsnyckel
  2. Lägga till själva repot för apt
  3. Installera programmet

Vi kan samla ihop dessa tre sammanhörande tasks i ett block:

    - name: install element
      block:
        - name: add apt key for element
          become: yes
          apt_key:
            url: https://packages.element.io/debian/element-io-archive-keyring.gpg
            state: present
        - name: add repo for element 
          become: yes
          apt_repository:
            repo: deb https://packages.element.io/debian/ default main
            state: present
        - name: install element
          become: yes
          apt:
            update-cache: yes
            name: element-desktop
            state: present

Vilka värden som ska skrivas in har jag hittat i instruktionerna på nedladdninssidan för programmet.