As previously mentioned, I use Ansible a lot inside Virtual machines orchestrated with Vagrant. Today’s brief tip is how to make Vagrant install the absolutely latest version of Ansible on Ubuntu boxes with Pip.
Here’s your Vagrantfile
Vagrant.configure("2") do |config| config.vm.box = "ubuntu/focal64" config.vm.provision "ansible_local", run: "always" do |ansible| ansible.playbook = "setup.yml" ansible.playbook_command = "sudo ansible-playbook" ansible.install_mode = "pip" ansible.pip_install_cmd = "(until sudo apt update ; do sleep 1 ; done && sudo apt install -y python3-pip && sudo rm -f /usr/bin/pip && sudo ln -s /usr/bin/pip3 /usr/bin/pip && sudo -H pip install --upgrade pip) 2>&1 | tee -a /var/log/vagrant-init" end end
“But, that pip_install_cmd block is huge”, I hear you cry!
Well, yes, but let’s split that out into a slightly more readable code block! (Yes, I’ve removed the “&&” for clarity sake – it just means “only execute the next command if this one worked”)
( # Wait until we get the apt "package lock" released until sudo apt update do # By sleeping for 1 second increments until it works sleep 1 done # Then install python3-pip sudo apt install -y python3-pip # Just in case python2-pip is installed, delete it sudo rm -f /usr/bin/pip # And symbolically link pip3 to pip sudo ln -s /usr/bin/pip3 /usr/bin/pip # And then do a pip self-upgrade sudo -H pip install --upgrade pip # And output this to the end of the file /var/log/vagrant-init, including any error messages ) 2>&1 | tee -a /var/log/vagrant-init
What does this actually do? Well, pip is the python package manager, so we’re asking for the latest packaged version to be installed (it often isn’t particularly with older releases of, well, frankly any Linux distribution) – this is the “pip_install_cmd” block. Then, once pip is installed, it’ll run “pip install ansible” – which will give it the latest version available to Pip, and then when that’s all done, it’ll run “sudo ansible-playbook /vagrant/setup.yml”