Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
download, build, and install aur packages with ansible


(Forked from:

When using ArchLinux, I typically prefer to use an AUR helper like pacaur or yaourt to automate away the process of installing a community package.

Ansible's pacman module is great, but it doesn't support AUR packages or pacman's -U flag. Installing AUR packages with Ansible seemed to be left as an exercise to the user, and since AUR helpers do not come with a fresh Arch install, I created this set of tasks to be a reusable way of installing AUR packages on my Arch hosts.

I should take the time to PR an AUR module for Ansible sometime soon, but this is a nice, resusable submodule for any Arch-based Ansible role.


- name: install yaourt on ArchLinux hosts
  hosts: my_archlinux_host_group
  gather_facts: yes
    makepkg_nonroot_user: "{{ ansible_ssh_user }}"
    - name: install package-query (a yaourt dependency)
      include: aur/pkg.yml pkg_name=package-query
    - name: install yaourt
      include: aur/pkg.yml pkg_name=yaourt

Reccommended Usage

  1. Add this gist as a submodule to your Ansible role or playbook
# Example ./roles directory structure for an existing Ansible playbook with a 'foobar' role 
#   roles/
#     foobar/
#       tasks/
#         aur/          # Source repo added as a submodule (cloned into an `aur` directory)
#           pkg.yml     # Include this file with vars 'pkg_name' and 'makepkg_nonroot_user' to install an AUR package
$ cd ./roles/foobar/tasks
$ git submodule add aur
  1. Now aur/pkg.yml may be included from any task or handler within the foobar role. Given the variables pkg_name and makepkg_nonroot_user, the tasks will validate, download, compile (as the makepkg_nonroot_user user), and install (as root) the pkg_name package.

Tip: Set makepkg_nonroot_user in your group_vars/all file to avoid repeating yourself.

- name: AUR | get metadata from AurJson api
connection: local
become: no
uri: >
url={{ pkg_name | mandatory }}
register: api_info
- assert:
- api_info.status == 200
- api_info.json is defined
- api_info.json.type == 'info'
- api_info.json.resultcount == 1
- api_info.json.results is defined
- name: AUR | get installed package version
become: no
shell: pacman -Q | grep {{ pkg_name }} | cut -d ' ' -f2
register: pacman_query_result
- name: AUR | Check if the AUR Version is already installed
become: no
when: api_info.json.results.Version != pacman_query_result.stdout
shell: echo "Needs Install"
register: version_check_result
- name: AUR | {{ pkg_name }} | download tarball
become: no
when: version_check_result.changed
connection: local
get_url: >
url='{{ api_info.json.results.URLPath }}'
register: aur_tarball
- name: AUR | {{ pkg_name }} | upload tarball to host and extract it
become: no
when: version_check_result.changed
unarchive: >
src={{ aur_tarball.dest }}
register: extracted_pkg
- name: AUR | {{ pkg_name }} | resolve dependencies
when: extracted_pkg is changed
become: yes
shell: |
source /tmp/{{ pkg_name }}/PKGBUILD
[[ -n "$depends" ]] && pacman --noconfirm --noprogressbar -Sy "${depends[@]}"
[[ -n "$makedepends" ]] && pacman --noconfirm --noprogressbar -Sy "${makedepends[@]}"
chdir: /tmp/{{ pkg_name }}
executable: /usr/bin/bash
register: aur_resolving_dependencies_result
# This will break if run as root. Set user to use with makepkg with 'makepkg_user' var
- name: AUR | {{ pkg_name }} | build package
when: extracted_pkg is changed
become: no
shell: |
makepkg --noconfirm --noprogressbar -mfs
chdir: /tmp/{{ pkg_name }}
register: aur_makepkg_result
- name: AUR | {{ pkg_name }} | uninstall makedepends
when: extracted_pkg is changed and aur_makepkg_result is changed
become: yes
shell: |
source /tmp/{{ pkg_name }}/PKGBUILD
[[ -n "$makedepends" ]] && pacman --noconfirm --noprogressbar -Rscnu "${makedepends[@]}"
chdir: /tmp/{{ pkg_name }}
executable: /usr/bin/bash
ignore_errors: yes
- name: AUR | {{ pkg_name }} | get package extension from /etc/makepkg.conf
when: extracted_pkg is changed
shell: "grep PKGEXT /etc/makepkg.conf | cut -d '=' -f 2 | tr -d \"'\""
register: package_extension
- name: AUR | {{ pkg_name }} | install newly-built aur package with pacman
when: aur_makepkg_result is changed
become: yes
shell: |
pacman --noconfirm --noprogressbar --needed -U *{{ package_extension.stdout }}
chdir: /tmp/{{ pkg_name }}
register: pacman_install_result
changed_when: pacman_install_result.stdout is defined and pacman_install_result.stdout.find('there is nothing to do') == -1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment