AnsiblePilot — Master Ansible Automation

AnsiblePilot is the leading resource for learning Ansible automation, DevOps, and infrastructure as code. Browse over 1,400 tutorials covering Ansible modules, playbooks, roles, collections, and real-world examples. Whether you are a beginner or an experienced engineer, our step-by-step guides help you automate Linux, Windows, cloud, containers, and network infrastructure.

Popular Topics

About Luca Berton

Luca Berton is an Ansible automation expert, author of 8 Ansible books published by Apress and Leanpub including "Ansible for VMware by Examples" and "Ansible for Kubernetes by Example", and creator of the Ansible Pilot YouTube channel. He shares practical automation knowledge through tutorials, books, and video courses to help IT professionals and DevOps engineers master infrastructure automation.

Ansible on macOS 14 Sonoma Automation Complete Guide

By Luca Berton · Published 2024-01-01 · Category: installation

Automate macOS 14 (Sonoma) developer workstations and CI agents with Ansible: Homebrew, mas, defaults, launchd, dotfiles, FileVault, and Xcode tooling.

macOS 14 (Sonoma) released October 2023 and remains widely deployed across developer laptops, CI build agents, and design workstations in 2026. Ansible automates the parts of macOS that MDM cannot easily reach: developer tooling, Homebrew packages, dotfiles, environment variables, launchd jobs, and per-project SDKs. This is the master Ansible guide for macOS 14 Sonoma.

macOS 14 Sonoma release facts

ItemValue
Code nameSonoma
GA2023-09-26
Last security update support~2026
Default shellzsh
System Pythonnone (install via Homebrew or Xcode CLT)
ArchitecturesApple silicon (arm64), Intel (x86_64)

Ansible-core compatibility

Run the control node on Linux or macOS with ansible-core 2.18+. Managed macOS nodes need:

xcode-select --install                     # Command Line Tools
sudo softwareupdate --install-rosetta --agree-to-license   # Intel-only deps on M-series

Install Python via Homebrew:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install python@3.13

See also: Ansible on macOS 15 Sequoia Automation Complete Guide

Inventory

[macos14]
mac-build-01.lab.example.com
mac-build-02.lab.example.com

[macos14:vars]
ansible_user=ansible
ansible_python_interpreter=/opt/homebrew/bin/python3   ; M-series
; ansible_python_interpreter=/usr/local/bin/python3    ; Intel
ansible_become_method=sudo

Baseline playbook

- name: macOS 14 Sonoma baseline
  hosts: macos14
  tasks:
    - name: Set hostname
      become: true
      ansible.builtin.command: scutil --set ComputerName "{{ inventory_hostname_short }}"
      changed_when: false

    - name: Install Homebrew packages
      community.general.homebrew:
        name:
          - git
          - jq
          - htop
          - wget
          - python@3.13
          - node@20
          - go
          - tmux
          - mas
        state: present

    - name: Install macOS apps from App Store
      community.general.mas:
        id: "{{ item.id }}"
        state: present
      loop:
        - { id: 1333542190 }   # 1Password 7
        - { id: 497799835 }    # Xcode

    - name: Install cask apps
      community.general.homebrew_cask:
        name:
          - visual-studio-code
          - iterm2
          - docker
          - rectangle
          - google-chrome
        state: present

See also: Ansible on macOS 26 Tahoe Automation Complete Guide

Defaults (preferences) management

- name: Apply macOS user defaults
  hosts: macos14
  tasks:
    - name: Show hidden files in Finder
      community.general.osx_defaults:
        domain: com.apple.finder
        key: AppleShowAllFiles
        type: bool
        value: true
        state: present

    - name: Auto-hide dock
      community.general.osx_defaults:
        domain: com.apple.dock
        key: autohide
        type: bool
        value: true

    - name: Restart Finder & Dock
      ansible.builtin.shell: killall Finder; killall Dock
      changed_when: false

launchd jobs

- name: Schedule a daily build cache cleaner
  hosts: macos14
  tasks:
    - name: Drop launchd plist
      ansible.builtin.copy:
        dest: "/Users/{{ ansible_user }}/Library/LaunchAgents/com.example.cleanbuild.plist"
        owner: "{{ ansible_user }}"
        mode: "0644"
        content: |
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
          <plist version="1.0">
            <dict>
              <key>Label</key><string>com.example.cleanbuild</string>
              <key>ProgramArguments</key>
              <array>
                <string>/bin/zsh</string>
                <string>-lc</string>
                <string>rm -rf "$HOME/Library/Developer/Xcode/DerivedData/*"</string>
              </array>
              <key>StartCalendarInterval</key>
              <dict><key>Hour</key><integer>3</integer><key>Minute</key><integer>0</integer></dict>
            </dict>
          </plist>

    - name: Load agent
      ansible.builtin.command: launchctl bootstrap gui/$(id -u {{ ansible_user }}) /Users/{{ ansible_user }}/Library/LaunchAgents/com.example.cleanbuild.plist
      changed_when: false

See also: Task Manager in macOS X with Ansible Automation

FileVault and security

- name: Verify FileVault is on
  hosts: macos14
  become: true
  tasks:
    - name: Check FileVault
      ansible.builtin.command: fdesetup status
      register: fv
      changed_when: false
      failed_when: "'FileVault is On' not in fv.stdout"

Best practices

  • Bootstrap Homebrew once, then drive everything with homebrew, homebrew_cask, mas, and osx_defaults.
  • For MDM-managed fleets, let MDM own identity, FileVault, and Gatekeeper; let Ansible own developer tooling.
  • Pin Homebrew package versions for CI builders to keep build reproducibility.
  • Test on both arm64 and x86_64 if you maintain a mixed fleet.

Conclusion

macOS 14 Sonoma + Ansible turns a fresh Mac into a fully provisioned developer or CI workstation in minutes. Combine homebrew, mas, osx_defaults, and launchd to capture every preference and tool in code.

Category: installation

Browse all Ansible tutorials · AnsiblePilot Home