I frequently reinstall Linux. Is there a tool to say what to install and configure that I can just run once after OS install? Things like

  • Install neovim, signal, steam
  • Configure firefox, desktop environment

I'm using this for just me, on my personal machine.

I don't anticipate it's possible between different distros, so assume I'm reinstalling the same distro.

EDIT: thanks for replies. I'm mostly seeing Ansible and NixOS. I'll start looking at those.

you are viewing a single comment's thread
view the rest of the comments
[–] 2 points 3 months ago* (last edited 3 months ago)

I had found myself reinstalling and reconfiguring a lot of the same things over and over while distro hopping, so I came up with a bash script with some of the most common configuration changes and such. As an example, here is my Fedora post=install script:

script

#!/usr/bin/env bash  

# remove all permission restrictions from current directory  
#sudo chmod -R a+rwX .  

sudo hostnamectl set-hostname [redacted]  

# prompt for ssh password to use later  
if [[ $1 == "" ]]; then  
    read -p "Enter ssh password: " ssh_pass  
else  
    ssh_pass=$1  
fi  

# default dnf prompts to 'y'  
sudo sh -c "echo 'defaultyes=True' >> /etc/dnf/dnf.conf"  

# install packages that are needed to add repos and other packages  
sudo dnf up -y && sudo dnf in curl flatpak wget -y  

#add repos  
sudo dnf copr enable lilay/topgrade -y  
sudo dnf copr enable aflyhorse/libjpeg -y  
sudo dnf config-manager addrepo --from-repofile=https://repository.mullvad.net/rpm/stable/mullvad.repo  
sudo dnf in https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm -y  
sudo dnf in https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm -y  
sudo sh -c 'curl -fsSL https://repo.librewolf.net/librewolf.repo | pkexec tee /etc/yum.repos.d/librewolf.repo'  
sudo flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo  
echo -e "[gitlab.com_paulcarroty_vscodium_repo]\nname=gitlab.com_paulcarroty_vscodium_repo\nbaseurl=https://paulcarroty.gitlab.io/vscodium-deb-rpm-repo/rpms/\nenabled=1\ngpgcheck=1\nrepo_gpgcheck=1\ngpgkey=https://gitlab.com/paulcarroty/vscodium-deb-rpm-repo/raw/master/pub.gpg\nmetadata_expire=1h" | sudo tee -a /etc/yum.repos.d/vscodium.repo  

#install packages  
sudo dnf in augeas-devel btop cairo-devel cairo-gobject-devel cargo cmake codium dbus-devel expat-devel gifsicle gimp git kde-connect kdenlive libavcodec-freeworld librewolf libxkbcommon-devel lightdm-gtk-greeter-settings mpv mullvad-vpn ninja-build openssh-server openssl openssl-devel pipx python3-dbus python3-devel python3-pip rpmbuild syncthing thunderbird topgrade vlc sshpass -y  
sudo dnf in $(curl -s https://raw.githubusercontent.com/teervo/bitwig-fedora/refs/heads/main/bitwig-rpm.sh | bash -s 4.4.10) -y  
sudo dnf swap ffmpeg-free ffmpeg --allowerasing -y  
export PATH="$HOME/.cargo/bin:$PATH" && echo $'export PATH= \"$HOME/.cargo/bin:$PATH \"' >> ~/.bashrc  
cargo install gifski cargo-updateflatpak install com.github.iwalton3.jellyfin-media-player -y  
#pipx install numlockw  
pip install pandas odfpy  

#create ssh key, copy to servers  
ssh-keygen -q -t rsa -N '' <<< $'\ny' >/dev/null 2>&1  
hosts=("10.0.0.10" "10.0.0.11")  
for host in "${hosts[@]}"; do  
    ssh-keyscan -H $host >> ~/.ssh/known_hosts && sshpass -p "$ssh_pass" ssh-copy-id -o StrictHostKeyChecking=no [redacted]@$host && ssh -q [redacted]@$host exit  
done  

#enable/start ssh server  
sudo systemctl enable sshd  
sudo systemctl start sshd  

#add external drive to fstab to automount  
directory_secondary_drive=$HOME/nvme  
uuid=[redacted]  
sudo blkid  
sudo cp /etc/fstab /etc/fstab.bak  
sudo sh -c "echo 'UUID=$uuid $directory_secondary_drive       btrfs    rw,auto,user,exec 0 0' >> /etc/fstab"  
sudo mount -a  

#copy over custom config files  
directory_software=$directory_secondary_drive/sync/software  
cp -r $directory_software/setup/configs/* $HOME/.local/share/  

#install fonts  
cp $directory_software/fonts/* $HOME/.fonts  
fc-cache -vf  

#set git credentials  
git config --global user.name "[redacted]" && git config --global user.email "[redacted]@yourdomain.com"  

#add aliases to bashrc  
echo $'alias pipup=\'pip list -o | cut -f1 -d\'\\\'\' \'\\\'\' | tr " " " " | awk \'\\\'\'{if(NR>=3)print}\'\\\'\' | cut -d\'\\\'\' \'\\\'\' -f1 | xargs -n1 pip install -U\'' >> ~/.bashrc  
echo $'alias up=\"topgrade -y && echo \'\\nChecking pip\\n\' && pipup\"' >> ~/.bashrc  
echo $'alias e=\"exit\"' >> ~/.bashrc  

#https://support.mozilla.org/en-US/kb/compact-mode-workaround-firefox  

#print ssh key  
echo $'\nPublic SSH key:'  
cat $HOME/.ssh/*.pub  

Note that I used [redacted] here in places for anonymity reasons. This could give you a decent starting point to do something similar.

  • source