wayofdev.homebrew
Ansible Role: Homebrew
Installs Homebrew on macOS or Linux, and configures taps, packages and casks. Package uses retry loops to deal with connectivity issues.
If you like/use this role, please consider starring it. Thanks!
๐ Table of Contents
- Requirements
 - Role Variables
 - Example Playbook
 - Development
 - Testing
 - Dependencies
 - Compatibility
 - License
 - Author Information
 - Credits and Resources
 - Sponsors
 
๐ Requirements
- Up-to-date version of ansible. During maintenance/development, we stick to ansible versions and will use new features if they are available (and update 
meta/main.ymlfor the minimum version). - Compatible OS. See compatibility table.
 jmespathlibrary needs to be installed on the host running the playbook (needed for thejson_queryfilter).- Role has dependencies on third-party roles on different operating systems. See 
requirements.ymland dependencies section. 
๐ง Role Variables
Available variables are listed below, along with example values (see defaults/main.yml). Additional variables are stored in vars/main.yml.
โ Structure
GitHub repository variable for Homebrew core. By default, role checks for latest release from official Homebrew repository, if you are changing homebrew_repository to your  fork and want to use master branch and turn off latest release autodetect, then set homebrew_repository_use_master variable to true
# From which repository should we install homebrew?
homebrew_repository: https://github.com/Homebrew/brew
# Set to true if you want to use master branch instead of release auto-detect,
# or you use custom fork specified in homebrew_repository
homebrew_repository_use_master: false
When set to true, will update Homebrew itself and upgrade all homebrew packages:
# Run task to upgrade all packages
homebrew_upgrade_all: true
Variable controls retry times and delay to wait between retries, if homebrew install task failed:
# How much times to retry, if installation of package / tap / cask fails ?
# This can happen during network problems.
homebrew_retries: 32
# Delay between each retry attempt.
homebrew_delay: 3
Set to true to remove the Homebrew cache after any new software is installed or updated.
homebrew_clear_cache: false
Directory where applications installed via cask should be installed.
homebrew_cask_appdir: /Applications
If set to true, passes --greedy to brew cask outdated when checking if an installed cask has a newer version available.
homebrew_cask_greedy_mode: false
Turn off homebrew analytics, which are collected by default.
homebrew_collect_analytics: false
โ Tapping repositories
Adding (tapping) repositories
homebrew_taps:
  - homebrew/core
  - homebrew/cask-versions
  - homebrew/cask-fonts
Adding (tapping) repositories, in more verbose way, defining urls and states:
homebrew_taps:
  # just tap
  - name: homebrew/core
  # tap from custom repository
  - name: denji/nginx
    url: https://github.com/denji/homebrew-nginx
  # tap with defined custom state
  - name: homebrew/cask-fonts
    state: present
Removing taps:
homebrew_taps:
  # define state: absent to delete taps
  - name: homebrew/cask-fonts
    state: absent
  - name: denji/nginx
    state: absent
โ Packages: Installing, updating and removing
Adding packages in simple way:
homebrew_packages:
  - wget
  - curl
  - nano
Adding packages in advanced way, defining state, path, and other options:
homebrew_packages:
  # install to custom path
  - name: wget
    state: present
    path: /opt/custom/path/bin
Updating packages:
homebrew_packages:
  # update homebrew first and install formula wget with 'brew' in default path
  - name: wget
    state: present
    update_homebrew: true
  # update homebrew first and upgrade formula curl to the latest available with 'brew' in default path
  - name: curl
    state: latest
    update_homebrew: true
Removing packages:
homebrew_packages:
  - name: wget
    state: absent
  - name: curl
    state: absent
โ Casks: installing, updating and removing
:warning: Notice: Casks are supported only on macOS. See this post.
Adding casks in simple way:
homebrew_casks:
  # Installing list of casks
  - firefox
  - google-chrome
  - alfred
  - 1password
Adding casks with advanced options:
homebrew_casks:
  # Installing firefox cask
  - name: firefox
    state: present
Removing casks:
homebrew_casks:
  # define state: absent to delete
  - name: firefox
    state: absent
  - name: google-chrome
    state: absent
๐ Example Playbook
โ for macOS machines
---
- hosts: all
  connection: local
  # is needed when running over SSH
  environment:
    - PATH: "{{ homebrew_search_paths | join(':') }}:{{ ansible_env.PATH }}"
  vars:
    homebrew_taps:
      - homebrew/core
      - homebrew/cask
      - homebrew/cask-fonts
      - yt-dlp/taps
    homebrew_packages:
      - ssh-copy-id  # from homebrew/core
      - yt-dlp  # from yt-dlp/taps
    homebrew_casks:
      - firefox
      - google-chrome
      - font-fira-code-nerd-font  # from homebrew/cask-fonts
    homebrew_retries: 12
    homebrew_delay: 3
    homebrew_clear_cache: false
    homebrew_collect_analytics: false
  roles:
    - elliotweiser.osx-command-line-tools  # only on macOS machines
    - wayofdev.homebrew
โ for Linux machines
---
- hosts: all
  connection: local
  # is needed when running over SSH
  environment:
    - PATH: "{{ homebrew_search_paths | join(':') }}:{{ ansible_env.PATH }}"
  vars:
    homebrew_user: linuxbrew  # FYI: can be skipped, as automatically detected, but linuxbrew user is recommended way for installing Homebrew with Linux
    homebrew_group: linuxbrew  # same as homebrew_user
    homebrew_taps:
      - homebrew/core
      - yt-dlp/taps
    homebrew_packages:
      - ssh-copy-id  # from homebrew/core
      - yt-dlp  # from yt-dlp/taps
    homebrew_retries: 12
    homebrew_delay: 3
    homebrew_clear_cache: false
    homebrew_collect_analytics: false
  roles:
    - geerlingguy.git  # only on linux machines, and can be skipped if machine has git
    - wayofdev.homebrew
โ๏ธ Development
To install dependencies and start development you can check contents of our Makefile
Install poetry using poetry-bin and all dev python dependencies:
$ make install
Install only python dependencies, assuming that you already have poetry:
$ make install-deps
Install all git hooks:
$ make hooks
Lint all role files:
$ make lint
๐งช Testing
You can check Makefile to get full list of commands for remote and local testing. For local testing you can use these comands to test whole role or separate tasks:
โ on localhost
:warning: Notice: By defaut all tests are running against your local machine!
# run all tags with scenario from ./tests/test.yml
$ make test
# or test-tag without any parameters
$ make test-tag
# run idempotency check
$ make test-idempotent
# run tasks that validate config file and does installation
$ export TASK_TAGS="brew-install,brew-update"
$ make test-tag
# run by predefined command that executes only one tag
$ make test-install
$ make test-analytics
$ make test-update
$ make test-taps
$ make test-packages
$ make test-casks
# run molecule tests on localhost
$ poetry run molecule test --scenario-name default-macos-on-localhost -- -vvv
# or with make command
$ make m-local
# runs molecule with docker driver
$ poetry run molecule test --scenario-name default -- -vvv
# or with make file
$ make m-linux
โ over SSH
# run molecule scenarios against remote machines over SSH
# this will need VM setup and configuration
$ poetry run molecule test --scenario-name default-macos-over-ssh -- -vvv
$ make m-remote
# tags also can be passed
$ export TASK_TAGS="brew-install,brew-update"
$ make m-remote
๐ฆ Dependencies
Installation handled by Makefile and requirements are defined in requirements.yml
โ for all
โ only macOS
โ only Linux
๐งฉ Compatibility
This role has been tested on these systems:
| system / container | tag | 
|---|---|
| macos | monterey | 
| macos | big-sur | 
| ubuntu | jammy | 
| ubuntu | focal | 
| debian | bullseye | 
| debian | buster | 
| fedora | 36 | 
| fedora | 35 | 
| centos | 8 | 
| centos | 7 | 
๐ค License
๐๐ผโโ๏ธ Author Information
This role was created in 2022 by lotyp / wayofdev.
๐งฑ Credits and Resources
Inspired by:
- role-homebrew-retry by @niall-byrne
 - homebrew role created by @geerlingguy as a part of ansible-collection-mac
 - official Homebrew installer script
 
๐ซก Contributors
๐ค Sponsors
Role development and testing was done on Parallels Desktop Pro Edition and License was provided by Parallels
Ansible role that uses loops and retries to install Homebrew apps and casks.
ansible-galaxy install wayofdev.homebrew