I find myself constantly installing new Ubuntu Desktop operating systems; from testing something in a VM, to updating one of my computers or reformatting my main. Reinstalling and configuring the same thing over and over gets tedious. So, why not automate the process?
I have set up a repository that contains two bash scripts; one for escalated privileges (installing packages) and one user changes. Using these two scripts as a basis, I am have an almost complete system for me to get up and go. After these scripts I would merely have to log into my services.
Privileges Script (ubuntu-deploy.sh) Explained
This script follows a basic step-by-step process. It can be easily replicated and reproduced. It is ordered as such:
- Update and Upgrade the operating system
- Install snaps
- Install repository packages
- Download and install manual packages
- Fix missing dependencies
Using the below sections you can easily make your own script. You can think of this as one of your most basic automation projects!
This script will not include the "sudo" aspect of each command because the script itself will be run with "sudo". That is why this is the escalation script.
Update and Upgrade the Operating System
If you have ever installed a package or followed a tutorial using the command line you have probably seen these.
Update the repositories (update), install the new version of the packages (upgrade) then clean up unnecessary packages (autoclean)
According to Canonical's Snapcraft, a "snap is a bundle of an app and its dependencies that works without modification across Linux distributions".
Installing the Discord snap looks like this.
echo =!=!=!= INSTALLING Snaps =!=!=!= echo ============================ echo ==== Installing Discord ==== echo ============================ snap install discord
Rinse and repeat for any snaps you wish to install. If you are curious if a snap is available visit snapcraft. If you click the install button on an application page it will even tell you what the command is to install.
Install Repository Packages
Grab those packages from the Ubuntu repositories the old school way.
I found some applications work better through the repository packages (or third party ppas) as they use the OS resources better than the container resources. Two examples of this are Flameshot and Rambox. In both cases, they reference container resources instead of the base operating system. Rambox seems to crash when I try to access photos to upload. I assume this may be the cause. Repos live on...
Download and Install Manual Packages
Change to the correct directory, download the correct package and install the package!
echo =!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=! echo =!=!=!= INSTALLING Manual Packages !=!=!=! echo =!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=! echo ======================================= echo ==== Moving to Downloads directory ==== echo ======================================= # executed with sudo, use absolute path! cd /home/seanland/Downloads/ echo ========================== echo ==== Downloading Zoom ==== echo ========================== wget https://zoom.us/client/latest/zoom_amd64.deb echo ========================= echo ==== Installing Zoom ==== echo ========================= dpkg -i zoom_amd64.deb
Once that is done...
Fix Missing Dependencies
The manual packages will not be installed with their dependencies. By running the below command it will install all broken packages by installing their missing dependencies.
echo ==================================== echo ==== Fixing Broken Dependencies ==== echo ==================================== sudo apt --fix-broken install -y
User Changes Script (ubuntu-tweak.sh) Explained
This is the script that is run without using escalated privileges. It is execute to modify the local user's workspace. I have set my user changes script into two sections:
- Automated Configuration
- Manual Configuration
Gsettings can be used to manipulate the application settings within gnome. If you see below the settings can be accessed via the command line. Here are a few examples of the ones I use in my script.
echo =!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!= echo =!=!=!= Automated Configuration =!=!=!= echo =!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!= echo ====================================== echo ==== Setting Dash Icon Size to 24 ==== echo ====================================== gsettings set org.gnome.shell.extensions.dash-to-dock dash-max-icon-size 24 echo ================================ echo ==== Setting Favourite Apps ==== echo ================================ gsettings set org.gnome.shell favorite-apps "['vivaldi-stable.desktop', 'org.remmina.Remmina.desktop', 'atom_atom.desktop', 'gimp_gimp.desktop', 'rambox_rambox.desktop', 'moonlight_moonlight.desktop', 'vlc_vlc.desktop', 'filezilla.desktop', 'org.gnome.Terminal.desktop', 'org.gnome.Nautilus.desktop', 'flameshot.desktop', 'putty.desktop', 'Zoom.desktop']"
Essentially this portion of the script resizes the icons on the dock and sets which icons are included on the dock. No more, adding each applications to favourite!
You can see which gsettings are available in a gui form by using dconf-editor. At the same time, you can also manipulate them in that tool.
The part of automation no one likes. The stuff you don't or can't automate! But, you can make it easier. I like to add a little section for the manual steps I have to complete after the scripts have run. It just makes life a little easier.
These two scripts alone can save quite a bit of time on a new install, especially if you are installing a large number of apps. Make your life easier! One reason to be less afraid of formatting your machine.