An Ansible playbook for Swift
I’ve been learning Swift recently and now that it’s Open Source, I’m looking at using it on my Linux server.
Firstly however, I wanted to run it within a Vagrant box locally and as I provision all my boxes via Ansible, I created a simple playbook and am recording it here in case its useful to anyone else!
The installation instructions are easy to follow, so I simply replicated them as a set of actions. Note that the filename of the latest snapshot has the version and date included into it, so I created those as variables so that I could change them and just re-provision.
I usually run Ansible on my Vagrant VM directly as this means that I don’t need it installed locally and that my boxes are usable by people who have Windows. Hence, I use the shell provisioner to install Ansible first and then run the playbook. These are the files I use:
Vagrantfile:
Vagrant.configure("2") do |c|
c.vm.define "swiftdev", primary: true do |config|
config.vm.box = "ubuntu/trusty64"
config.vm.network "private_network", ip: "192.168.99.202"
config.vm.hostname = "swiftdev.localhost"
# Prevent Vagrant 1.7 from asking for the vagrant user's password
config.ssh.insert_key = false
# Install ansible on guest & run playbook
config.vm.provision :shell,
:keep_color => true,
:inline => <<SCRIPT
if [ $(dpkg-query -W -f='${Status}' ansible 2>/dev/null | grep -c "ok installed") -eq 0 ];
then
export DEBIAN_FRONTEND=noninteractive
echo "Add Ansible repository"
apt-add-repository ppa:ansible/ansible &> /dev/null || exit 1
apt-get update -qq
echo "Installing Ansible"
apt-get install -qq ansible &> /dev/null || exit 1
echo "Runing apt-get upgrade"
apt-get update -qq &> /dev/null || exit 1
apt-get upgrade -y &> /dev/null || exit 1
fi
echo "Running Ansible playbook"
export PYTHONUNBUFFERED=1
export ANSIBLE_FORCE_COLOR=1
su vagrant -c "ansible-playbook -i 127.0.0.1, --connection=local /vagrant/vm-provisioning/init.yml"
SCRIPT
end
end
Notice that I run the init.yml playbook as the vagrant user so that the correct home directory is used. This is the main playbook:
vm-provisioning/init.yml:
---
- hosts: all
vars:
swift_snapshot: "swift-2.2-SNAPSHOT-2015-12-10-a"
tasks:
- name: Install useful packages
apt: pkg={{ item }} state=latest
with_items:
# - curl
- vim
sudo: yes
include: swift.yml
This doesn’t do much. It sets the variables for the swift snapshot that we want and also installs vim and curl as they are always useful!
Finally, we then install Swift itself into our home directory:
vm-provisioning/swift.yml:
---
- hosts: all
tasks:
- name: Create swift directory
file: path=~/swift state=directory owner=vagrant group=vagrant
- name: Install packages for swift
apt: pkg={{ item }} state=latest
with_items:
- clang-3.6
- libicu-dev
sudo: yes
- name: Use clang 3.6
alternatives: name=clang link=/usr/bin/clang path=/usr/bin/clang-3.6
sudo: yes
- name: Use clang++ 3.6
alternatives: name=clang++ link=/usr/bin/clang++ path=/usr/bin/clang++-3.6
sudo: yes
- name: Grab gpg keys
shell: gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys '7463 A81A 4B2E EA1B 551F FBCF D441 C977 412B 37AD' '1BE1 E29A 084C B305 F397 D62A 9F59 7F4D 21A5 6D5F'
args:
chdir: /home/vagrant
- name: Refresh gpg keys
shell: gpg --keyserver hkp://pool.sks-keyservers.net --refresh-keys Swift
- name: Create swift directory
file: path=~/swift state=directory owner=vagrant group=vagrant
- name: Download Swift snapshot
get_url: >
url=https://swift.org/builds/ubuntu1404/{{ swift_snapshot }}/{{ swift_snapshot }}-ubuntu14.04.tar.gz
dest=~/swift/swift-snapshot.tar.gz
mode=0444
owner=vagrant
- name: Download Swift snapshot signature file
get_url: >
url=https://swift.org/builds/ubuntu1404/{{ swift_snapshot }}/{{ swift_snapshot }}-ubuntu14.04.tar.gz.sig
dest=~/swift/swift-snapshot.tar.gz.sig
mode=0444
owner=vagrant
- name: Verify snapshot file
command: gpg --verify swift-snapshot.tar.gz.sig swift-snapshot.tar.gz
args:
chdir: ~/swift
- name: Remove current version
shell: rm -rf usr
args:
chdir: ~/swift
- name: Extract archive
shell: tar xzf swift-snapshot.tar.gz --strip-components 1
args:
chdir: ~/swift
- name: Update bashrc
lineinfile:
dest=~/.bashrc
line='export PATH=~/swift/usr/bin:"${PATH}"'
regexp="^export PATH=~/swift/usr/bin"
owner=vagrant
state=present
insertafter=EOF
create=True
That’s it. You can now vagrant ssh into the VM and run swift on the command line:



