Pragmatism in the real world

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:

Swift1