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.

  • SatyrSack@quokk.au
    link
    fedilink
    English
    arrow-up
    3
    ·
    edit-2
    8 hours 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.