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:
- 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
. - Här ska vi definiera tasks. Än så länge har vi bara en:
- Namnet på tasken är install nice programs
- 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
- 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.
- Vi vill updatera cachen innan vi försöker installera, precis som när vi skriver
apt update
innan vi skriverapt install
när vi installerar nåt via terminalen. - 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.) - Vi specificerar här att efter operationen ska de listade programmen finnas, dvs vara
present
. (Skriver man iställetabsent
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:
- Lägga till repots signeringsnyckel
- Lägga till själva repot för apt
- 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.