Skip to content

Instantly share code, notes, and snippets.

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

About

(Forked from: https://gist.github.com/cahna/45bb9eee92c5f1fce66f)

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.

Example

---
- name: install yaourt on ArchLinux hosts
  hosts: my_archlinux_host_group
  gather_facts: yes
  vars:
    makepkg_nonroot_user: "{{ ansible_ssh_user }}"
  tasks:
    - 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 https://gist.github.com/39ecb1eb1ab8ee1d0ce1.git 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
sudo: no
uri: >
url=https://aur.archlinux.org/rpc.php?type=info&arg={{ pkg_name | mandatory }}
return_content=yes
timeout=6
register: api_info
- assert:
that:
- 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
sudo: no
shell: pacman -Q | grep {{ pkg_name }} | cut -d' ' -f2
register: pacman_query_result
- name: AUR | Check if the AUR Version is already installed
sudo: 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
sudo: no
when: version_check_result.changed
connection: local
get_url: >
url='https://aur.archlinux.org{{ api_info.json.results.URLPath }}'
dest='/tmp/'
register: aur_tarball
- name: AUR | {{ pkg_name }} | upload tarball to host and extract it
sudo: yes
when: version_check_result.changed
sudo_user: "{{ makepkg_nonroot_user }}"
unarchive: >
src={{ aur_tarball.dest }}
dest=/tmp/
register: extracted_pkg
# This will break if run as root. Set user to use with makepkg with 'makepkg_user' var
- name: AUR | {{ pkg_name }} | build package, including missing dependencies
when: extracted_pkg | changed
sudo: yes
sudo_user: "{{ makepkg_nonroot_user }}"
command: >
makepkg --noconfirm --noprogressbar -mfs
chdir=/tmp/{{ pkg_name }}
register: aur_makepkg_result
- name: AUR | {{ pkg_name }} | install newly-built aur package with pacman
when: aur_makepkg_result | changed
sudo: yes
shell: >
pacman --noconfirm --noprogressbar --needed -U *.pkg.tar.xz
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
@rightaway

This comment has been minimized.

Copy link

rightaway commented Sep 5, 2015

Looks great, have you tried making a pull request to be included in Ansible?

@The-Judge

This comment has been minimized.

Copy link

The-Judge commented Jul 4, 2017

When I copy&paste the example 1:1 I get an error with ansible 2.3.1.0:

10:06 root@judgepi:/etc/ansible# ansible-playbook arch-base.yml 
ERROR! no action detected in task. This often indicates a misspelled module name, or incorrect module path.

The error appears to have been in '/etc/ansible/roles/archlinux/tasks/main.yml': line 55, column 3, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

#  - zip
- name: install yaourt on ArchLinux hosts
  ^ here


The error appears to have been in '/etc/ansible/roles/archlinux/tasks/main.yml': line 55, column 3, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

#  - zip
- name: install yaourt on ArchLinux hosts
  ^ here

4 10:07 root@judgepi:/etc/ansible#

The file does not contains anything besides commented out lines.

@cyber-murmel

This comment has been minimized.

Copy link

cyber-murmel commented Nov 15, 2017

Hm,
but it doesn't install missing dependencies, does it?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.