├── .ansible-lint ├── .github ├── FUNDING.yml ├── stale.yml └── workflows │ └── ci.yml ├── .gitignore ├── .yamllint ├── LICENSE ├── README.md ├── ansible.cfg ├── default.config.yml ├── files ├── Mac-Dev-Playbook-Logo.png ├── sublime │ ├── Cobalt (SL).tmTheme │ ├── Markdown.sublime-settings │ ├── Plain text.sublime-settings │ ├── Preferences.sublime-settings │ └── WordCount.sublime-settings └── terminal │ └── JJG-Term.terminal ├── inventory ├── main.yml ├── requirements.yml ├── tasks ├── extra-packages.yml ├── osx.yml ├── sublime-text.yml ├── sudoers.yml └── terminal.yml ├── templates └── Package_Control.sublime-settings.j2 └── tests ├── ansible.cfg ├── config.yml ├── inventory └── uninstall-homebrew.sh /.ansible-lint: -------------------------------------------------------------------------------- 1 | --- 2 | skip_list: 3 | - experimental 4 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | --- 3 | github: geerlingguy 4 | patreon: geerlingguy 5 | -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | # Configuration for probot-stale - https://github.com/probot/stale 2 | 3 | # Number of days of inactivity before an Issue or Pull Request becomes stale 4 | daysUntilStale: 90 5 | 6 | # Number of days of inactivity before an Issue or Pull Request with the stale label is closed. 7 | # Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. 8 | daysUntilClose: 30 9 | 10 | # Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled) 11 | onlyLabels: [] 12 | 13 | # Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable 14 | exemptLabels: 15 | - pinned 16 | - security 17 | - planned 18 | 19 | # Set to true to ignore issues in a project (defaults to false) 20 | exemptProjects: false 21 | 22 | # Set to true to ignore issues in a milestone (defaults to false) 23 | exemptMilestones: false 24 | 25 | # Set to true to ignore issues with an assignee (defaults to false) 26 | exemptAssignees: false 27 | 28 | # Label to use when marking as stale 29 | staleLabel: stale 30 | 31 | # Limit the number of actions per hour, from 1-30. Default is 30 32 | limitPerRun: 30 33 | 34 | pulls: 35 | markComment: |- 36 | This pull request has been marked 'stale' due to lack of recent activity. If there is no further activity, the PR will be closed in another 30 days. Thank you for your contribution! 37 | 38 | Please read [this blog post](https://www.jeffgeerling.com/blog/2020/enabling-stale-issue-bot-on-my-github-repositories) to see the reasons why I mark pull requests as stale. 39 | 40 | unmarkComment: >- 41 | This pull request is no longer marked for closure. 42 | 43 | closeComment: >- 44 | This pull request has been closed due to inactivity. If you feel this is in error, please reopen the pull request or file a new PR with the relevant details. 45 | 46 | issues: 47 | markComment: |- 48 | This issue has been marked 'stale' due to lack of recent activity. If there is no further activity, the issue will be closed in another 30 days. Thank you for your contribution! 49 | 50 | Please read [this blog post](https://www.jeffgeerling.com/blog/2020/enabling-stale-issue-bot-on-my-github-repositories) to see the reasons why I mark issues as stale. 51 | 52 | unmarkComment: >- 53 | This issue is no longer marked for closure. 54 | 55 | closeComment: >- 56 | This issue has been closed due to inactivity. If you feel this is in error, please reopen the issue or file a new issue with the relevant details. 57 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: CI 3 | 'on': 4 | pull_request: 5 | push: 6 | branches: 7 | - master 8 | schedule: 9 | - cron: "0 5 * * 4" 10 | 11 | jobs: 12 | 13 | lint: 14 | name: Lint 15 | runs-on: ubuntu-latest 16 | steps: 17 | - name: Check out the codebase. 18 | uses: actions/checkout@v2 19 | 20 | - name: Set up Python 3. 21 | uses: actions/setup-python@v2 22 | with: 23 | python-version: '3.x' 24 | 25 | - name: Install test dependencies. 26 | run: pip3 install yamllint ansible ansible-lint 27 | 28 | - name: Lint code. 29 | run: | 30 | yamllint . 31 | ansible-lint 32 | 33 | integration: 34 | name: Integration 35 | runs-on: ${{ matrix.os }} 36 | strategy: 37 | matrix: 38 | os: 39 | - macos-10.15 40 | 41 | steps: 42 | - name: Check out the codebase. 43 | uses: actions/checkout@v2 44 | 45 | - name: Uninstall GitHub Actions' built-in Homebrew. 46 | run: tests/uninstall-homebrew.sh 47 | 48 | - name: Uninstall GitHub Actions' built-in browser installs. 49 | run: | 50 | sudo rm -rf /Applications/Firefox.app 51 | sudo rm -rf /Applications/Google\ Chrome.app 52 | 53 | - name: Install test dependencies. 54 | run: sudo pip3 install ansible 55 | 56 | - name: Set up the test environment. 57 | run: | 58 | cp tests/ansible.cfg ./ansible.cfg 59 | cp tests/inventory ./inventory 60 | cp tests/config.yml ./config.yml 61 | ansible-galaxy install -r requirements.yml 62 | 63 | - name: Test the playbook's syntax. 64 | run: ansible-playbook main.yml --syntax-check 65 | 66 | - name: Test the playbook. 67 | run: ansible-playbook main.yml 68 | env: 69 | ANSIBLE_FORCE_COLOR: '1' 70 | 71 | - name: Idempotence check. 72 | run: | 73 | idempotence=$(mktemp) 74 | ansible-playbook main.yml | tee -a ${idempotence} 75 | tail ${idempotence} | grep -q 'changed=0.*failed=0' && (echo 'Idempotence test: pass' && exit 0) || (echo 'Idempotence test: fail' && exit 1) 76 | env: 77 | ANSIBLE_FORCE_COLOR: '1' 78 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.vagrant 2 | .DS_Store 3 | *.retry 4 | roles* 5 | config.yml 6 | -------------------------------------------------------------------------------- /.yamllint: -------------------------------------------------------------------------------- 1 | --- 2 | extends: default 3 | 4 | rules: 5 | line-length: 6 | max: 180 7 | level: warning 8 | 9 | ignore: | 10 | .github/stale.yml 11 | roles/**/* 12 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2013 Michael Griffin 2 | http://mwgriffin.com 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 5 | 6 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 7 | 8 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Mac Dev Playbook Logo 2 | 3 | # Mac Development Ansible Playbook 4 | 5 | [![CI][badge-gh-actions]][link-gh-actions] 6 | 7 | This playbook installs and configures most of the software I use on my Mac for web and software development. Some things in macOS are slightly difficult to automate, so I still have a few manual installation steps, but at least it's all documented here. 8 | 9 | ## Installation 10 | 11 | 1. Ensure Apple's command line tools are installed (`xcode-select --install` to launch the installer). 12 | 2. [Install Ansible](https://docs.ansible.com/ansible/latest/installation_guide/index.html): 13 | 14 | 1. Run the following command to add Python 3 to your $PATH: `export PATH="$HOME/Library/Python/3.8/bin:/opt/homebrew/bin:$PATH"` 15 | 2. Upgrade Pip: `sudo pip3 install --upgrade pip` 16 | 3. Install Ansible: `pip3 install ansible` 17 | 18 | 3. Clone or download this repository to your local drive. 19 | 4. Run `ansible-galaxy install -r requirements.yml` inside this directory to install required Ansible roles. 20 | 5. Run `ansible-playbook main.yml --ask-become-pass` inside this directory. Enter your macOS account password when prompted for the 'BECOME' password. 21 | 22 | > Note: If some Homebrew commands fail, you might need to agree to Xcode's license or fix some other Brew issue. Run `brew doctor` to see if this is the case. 23 | 24 | ### Use with a remote Mac 25 | 26 | You can use this playbook to manage other Macs as well; the playbook doesn't even need to be run from a Mac at all! If you want to manage a remote Mac, either another Mac on your network, or a hosted Mac like the ones from [MacStadium](https://www.macstadium.com), you just need to make sure you can connect to it with SSH: 27 | 28 | 1. (On the Mac you want to connect to:) Go to System Preferences > Sharing. 29 | 2. Enable 'Remote Login'. 30 | 31 | > You can also enable remote login on the command line: 32 | > 33 | > sudo systemsetup -setremotelogin on 34 | 35 | Then edit the `inventory` file in this repository and change the line that starts with `127.0.0.1` to: 36 | 37 | ``` 38 | [ip address or hostname of mac] ansible_user=[mac ssh username] 39 | ``` 40 | 41 | If you need to supply an SSH password (if you don't use SSH keys), make sure to pass the `--ask-pass` parameter to the `ansible-playbook` command. 42 | 43 | ### Running a specific set of tagged tasks 44 | 45 | You can filter which part of the provisioning process to run by specifying a set of tags using `ansible-playbook`'s `--tags` flag. The tags available are `dotfiles`, `homebrew`, `mas`, `extra-packages` and `osx`. 46 | 47 | ansible-playbook main.yml -K --tags "dotfiles,homebrew" 48 | 49 | ## Overriding Defaults 50 | 51 | Not everyone's development environment and preferred software configuration is the same. 52 | 53 | You can override any of the defaults configured in `default.config.yml` by creating a `config.yml` file and setting the overrides in that file. For example, you can customize the installed packages and apps with something like: 54 | 55 | ```yaml 56 | homebrew_installed_packages: 57 | - cowsay 58 | - git 59 | - go 60 | 61 | mas_installed_apps: 62 | - { id: 443987910, name: "1Password" } 63 | - { id: 498486288, name: "Quick Resizer" } 64 | - { id: 557168941, name: "Tweetbot" } 65 | - { id: 497799835, name: "Xcode" } 66 | 67 | composer_packages: 68 | - name: hirak/prestissimo 69 | - name: drush/drush 70 | version: '^8.1' 71 | 72 | gem_packages: 73 | - name: bundler 74 | state: latest 75 | 76 | npm_packages: 77 | - name: webpack 78 | 79 | pip_packages: 80 | - name: mkdocs 81 | 82 | configure_dock: true 83 | dockitems_remove: 84 | - Launchpad 85 | - TV 86 | dockitems_persist: 87 | - name: "Sublime Text" 88 | path: "/Applications/Sublime Text.app/" 89 | pos: 5 90 | ``` 91 | 92 | Any variable can be overridden in `config.yml`; see the supporting roles' documentation for a complete list of available variables. 93 | 94 | ## Included Applications / Configuration (Default) 95 | 96 | Applications (installed with Homebrew Cask): 97 | 98 | - [ChromeDriver](https://sites.google.com/chromium.org/driver/) 99 | - [Docker](https://www.docker.com/) 100 | - [Dropbox](https://www.dropbox.com/) 101 | - [Firefox](https://www.mozilla.org/en-US/firefox/new/) 102 | - [Google Chrome](https://www.google.com/chrome/) 103 | - [Handbrake](https://handbrake.fr/) 104 | - [Homebrew](http://brew.sh/) 105 | - [LICEcap](http://www.cockos.com/licecap/) 106 | - [LimeChat](http://limechat.net/mac/) 107 | - [MacVim](http://macvim-dev.github.io/macvim/) 108 | - [nvALT](http://brettterpstra.com/projects/nvalt/) 109 | - [Sequel Ace](https://sequel-ace.com) (MySQL client) 110 | - [Skitch](https://evernote.com/skitch/) 111 | - [Slack](https://slack.com/) 112 | - [Sublime Text](https://www.sublimetext.com/) 113 | - [Transmit](https://panic.com/transmit/) (S/FTP client) 114 | - [Vagrant](https://www.vagrantup.com/) 115 | 116 | Packages (installed with Homebrew): 117 | 118 | - autoconf 119 | - bash-completion 120 | - doxygen 121 | - gettext 122 | - gifsicle 123 | - git 124 | - go 125 | - gpg 126 | - hub 127 | - httpie 128 | - iperf 129 | - libevent 130 | - sqlite 131 | - mcrypt 132 | - nmap 133 | - node 134 | - nvm 135 | - php 136 | - ssh-copy-id 137 | - cowsay 138 | - readline 139 | - openssl 140 | - pv 141 | - wget 142 | 143 | My [dotfiles](https://github.com/geerlingguy/dotfiles) are also installed into the current user's home directory, including the `.osx` dotfile for configuring many aspects of macOS for better performance and ease of use. You can disable dotfiles management by setting `configure_dotfiles: no` in your configuration. 144 | 145 | Finally, there are a few other preferences and settings added on for various apps and services. 146 | 147 | ## Future additions 148 | 149 | ### Things that still need to be done manually 150 | 151 | It's my hope that I can get the rest of these things wrapped up into Ansible playbooks soon, but for now, these steps need to be completed manually (assuming you already have Xcode and Ansible installed, and have run this playbook). 152 | 153 | 1. Set JJG-Term as the default Terminal theme (it's installed, but not set as default automatically). 154 | 3. Install all the apps that aren't yet in this setup (see below). 155 | 4. Remap Caps Lock to Escape (requires macOS Sierra 10.12.1+). 156 | 5. Set trackpad tracking rate. 157 | 6. Set mouse tracking rate. 158 | 7. Configure extra Mail and/or Calendar accounts (e.g. Google, Exchange, etc.). 159 | 160 | ### Configuration to be added: 161 | 162 | - I have vim configuration in the repo, but I still need to add the actual installation: 163 | ``` 164 | mkdir -p ~/.vim/autoload 165 | mkdir -p ~/.vim/bundle 166 | cd ~/.vim/autoload 167 | curl https://raw.githubusercontent.com/tpope/vim-pathogen/master/autoload/pathogen.vim > pathogen.vim 168 | cd ~/.vim/bundle 169 | git clone git://github.com/scrooloose/nerdtree.git 170 | ``` 171 | 172 | ## Testing the Playbook 173 | 174 | Many people have asked me if I often wipe my entire workstation and start from scratch just to test changes to the playbook. Nope! Instead, I posted instructions for how I build a [Mac OS X VirtualBox VM](https://github.com/geerlingguy/mac-osx-virtualbox-vm), on which I can continually run and re-run this playbook to test changes and make sure things work correctly. 175 | 176 | Additionally, this project is [continuously tested on GitHub Actions' macOS infrastructure](https://github.com/geerlingguy/mac-dev-playbook/actions?query=workflow%3ACI). 177 | 178 | ## Ansible for DevOps 179 | 180 | Check out [Ansible for DevOps](https://www.ansiblefordevops.com/), which teaches you how to automate almost anything with Ansible. 181 | 182 | ## Author 183 | 184 | This project was created by [Jeff Geerling](https://www.jeffgeerling.com/) (originally inspired by [MWGriffin/ansible-playbooks](https://github.com/MWGriffin/ansible-playbooks)). 185 | 186 | [badge-gh-actions]: https://github.com/geerlingguy/mac-dev-playbook/workflows/CI/badge.svg?event=push 187 | [link-gh-actions]: https://github.com/geerlingguy/mac-dev-playbook/actions?query=workflow%3ACI 188 | -------------------------------------------------------------------------------- /ansible.cfg: -------------------------------------------------------------------------------- 1 | [defaults] 2 | nocows = True 3 | roles_path = ./roles:/etc/ansible/roles 4 | inventory = inventory 5 | become = true 6 | stdout_callback = yaml 7 | -------------------------------------------------------------------------------- /default.config.yml: -------------------------------------------------------------------------------- 1 | --- 2 | downloads: ~/.ansible-downloads/ 3 | 4 | configure_dotfiles: true 5 | configure_terminal: true 6 | configure_osx: true 7 | 8 | # Set to 'true' to configure the Dock via dockutil. 9 | configure_dock: false 10 | dockitems_remove: [] 11 | # - Launchpad 12 | # - TV 13 | # - Podcasts 14 | # - 'App Store' 15 | dockitems_persist: [] 16 | # - name: "Sublime Text" 17 | # path: "/Applications/Sublime Text.app/" 18 | # pos: 5 19 | 20 | configure_sudoers: true 21 | sudoers_custom_config: | 22 | amagalhaes ALL=(root) NOPASSWD: /opt/homebrew/bin/yabai --load-sa 23 | 24 | dotfiles_repo: https://github.com/armand1m/dotfiles.git 25 | dotfiles_repo_accept_hostkey: true 26 | dotfiles_repo_local_destination: ~/Projects/Personal/dotfiles 27 | dotfiles_files: 28 | - .yabairc 29 | - .skhdrc 30 | - .config 31 | - .zshrc 32 | - .gitignore 33 | - .gitconfig 34 | - .inputrc 35 | - .osx 36 | - .vimrc 37 | 38 | homebrew_installed_packages: 39 | - dockutil 40 | - bash-completion 41 | - gpg 42 | - sqlite 43 | - nmap 44 | - eza 45 | - openssl 46 | - htop 47 | - bat 48 | - istioctl 49 | - terraform 50 | - pwgen 51 | - pgcli 52 | - dbmate 53 | - neovim 54 | - ffmpeg 55 | - pure 56 | - koekeishiya/formulae/yabai 57 | - koekeishiya/formulae/skhd 58 | - FelixKratz/formulae/sketchybar 59 | 60 | homebrew_taps: 61 | 62 | homebrew_cask_appdir: /Applications 63 | homebrew_cask_apps: 64 | - google-chrome 65 | - google-drive 66 | - zed 67 | - warp 68 | - chromedriver 69 | - docker 70 | - telegram 71 | - visual-studio-code 72 | - discord 73 | - spotify 74 | - google-cloud-sdk 75 | - karabiner-elements 76 | - remarkable 77 | - elgato-control-center 78 | - displaylink 79 | - ubersicht 80 | - font-hack-nerd-font 81 | - sf-symbols 82 | - raycast 83 | 84 | # See `geerlingguy.mas` role documentation for usage instructions. 85 | mas_installed_apps: [] 86 | mas_email: '' 87 | mas_password: '' 88 | 89 | osx_script: ~/.osx --no-restart 90 | 91 | # Install packages from other package managers. 92 | # Note: You are responsible for making sure the required package managers are 93 | # installed, eg. through homebrew. 94 | composer_packages: [] 95 | # - name: drush 96 | # state: present # present/absent, default: present 97 | # version: "^8.1" # default: N/A 98 | gem_packages: [] 99 | # - name: bundler 100 | # state: present # present/absent/latest, default: present 101 | # version: "~> 1.15.1" # default: N/A 102 | npm_packages: [] 103 | # - name: webpack 104 | # state: present # present/absent/latest, default: present 105 | # version: "^2.6" # default: N/A 106 | pip_packages: [] 107 | # - name: mkdocs 108 | # state: present # present/absent/latest, default: present 109 | # version: "0.16.3" # default: N/A 110 | 111 | # Set to 'true' to configure Sublime Text. 112 | configure_sublime: false 113 | 114 | # Glob pattern to ansible task files to run after all other tasks are finished. 115 | post_provision_tasks: [] 116 | -------------------------------------------------------------------------------- /files/Mac-Dev-Playbook-Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/armand1m/mac-dev-playbook/922f211cef82977ee13820f32edc5c9978077032/files/Mac-Dev-Playbook-Logo.png -------------------------------------------------------------------------------- /files/sublime/Cobalt (SL).tmTheme: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | comment 6 | Created by Jacob Rus. Based on ‘Slate’ by Wilson Miner 7 | author 8 | Jacob Rus 9 | name 10 | Cobalt 11 | settings 12 | 13 | 14 | settings 15 | 16 | background 17 | #002240 18 | caret 19 | #FFFFFF 20 | foreground 21 | #FFFFFF 22 | invisibles 23 | #FFFFFF26 24 | lineHighlight 25 | #00000059 26 | selection 27 | #B36539BF 28 | 29 | 30 | 31 | name 32 | Punctuation 33 | scope 34 | punctuation - (punctuation.definition.string || punctuation.definition.comment) 35 | settings 36 | 37 | fontStyle 38 | 39 | foreground 40 | #E1EFFF 41 | 42 | 43 | 44 | name 45 | Constant 46 | scope 47 | constant 48 | settings 49 | 50 | fontStyle 51 | 52 | foreground 53 | #FF628C 54 | 55 | 56 | 57 | name 58 | Entity 59 | scope 60 | entity 61 | settings 62 | 63 | fontStyle 64 | 65 | foreground 66 | #FFDD00 67 | 68 | 69 | 70 | name 71 | Keyword 72 | scope 73 | keyword 74 | settings 75 | 76 | fontStyle 77 | 78 | foreground 79 | #FF9D00 80 | 81 | 82 | 83 | name 84 | Storage 85 | scope 86 | storage 87 | settings 88 | 89 | fontStyle 90 | 91 | foreground 92 | #FFEE80 93 | 94 | 95 | 96 | name 97 | String 98 | scope 99 | string -string.unquoted.old-plist -string.unquoted.heredoc, string.unquoted.heredoc string 100 | settings 101 | 102 | fontStyle 103 | 104 | foreground 105 | #3AD900 106 | 107 | 108 | 109 | name 110 | Comment 111 | scope 112 | comment 113 | settings 114 | 115 | fontStyle 116 | italic 117 | foreground 118 | #0088FF 119 | 120 | 121 | 122 | name 123 | Support 124 | scope 125 | support 126 | settings 127 | 128 | fontStyle 129 | 130 | foreground 131 | #80FFBB 132 | 133 | 134 | 135 | name 136 | Variable 137 | scope 138 | variable 139 | settings 140 | 141 | fontStyle 142 | 143 | foreground 144 | #CCCCCC 145 | 146 | 147 | 148 | name 149 | Lang Variable 150 | scope 151 | variable.language 152 | settings 153 | 154 | fontStyle 155 | 156 | foreground 157 | #FF80E1 158 | 159 | 160 | 161 | name 162 | Function Call 163 | scope 164 | meta.function-call 165 | settings 166 | 167 | foreground 168 | #FFEE80 169 | 170 | 171 | 172 | name 173 | Invalid 174 | scope 175 | invalid 176 | settings 177 | 178 | background 179 | #800F00 180 | foreground 181 | #F8F8F8 182 | 183 | 184 | 185 | name 186 | Embedded Source 187 | scope 188 | text source, string.unquoted.heredoc, source source 189 | settings 190 | 191 | background 192 | #223545 193 | fontStyle 194 | 195 | foreground 196 | #FFFFFF 197 | 198 | 199 | 200 | name 201 | Entity inherited-class 202 | scope 203 | entity.other.inherited-class 204 | settings 205 | 206 | fontStyle 207 | italic 208 | foreground 209 | #80FCFF 210 | 211 | 212 | 213 | name 214 | String embedded-source 215 | scope 216 | string.quoted source 217 | settings 218 | 219 | fontStyle 220 | 221 | foreground 222 | #9EFF80 223 | 224 | 225 | 226 | name 227 | String constant 228 | scope 229 | string constant 230 | settings 231 | 232 | foreground 233 | #80FF82 234 | 235 | 236 | 237 | name 238 | String.regexp 239 | scope 240 | string.regexp 241 | settings 242 | 243 | foreground 244 | #80FFC2 245 | 246 | 247 | 248 | name 249 | String variable 250 | scope 251 | string variable 252 | settings 253 | 254 | foreground 255 | #EDEF7D 256 | 257 | 258 | 259 | name 260 | Support.function 261 | scope 262 | support.function 263 | settings 264 | 265 | fontStyle 266 | 267 | foreground 268 | #FFB054 269 | 270 | 271 | 272 | name 273 | Support.constant 274 | scope 275 | support.constant 276 | settings 277 | 278 | fontStyle 279 | 280 | foreground 281 | #EB939A 282 | 283 | 284 | 285 | name 286 | Exception 287 | scope 288 | support.type.exception 289 | settings 290 | 291 | foreground 292 | #FF1E00 293 | 294 | 295 | 296 | name 297 | C/C++ Preprocessor Line 298 | scope 299 | meta.preprocessor.c 300 | settings 301 | 302 | foreground 303 | #8996A8 304 | 305 | 306 | 307 | name 308 | C/C++ Preprocessor Directive 309 | scope 310 | meta.preprocessor.c keyword 311 | settings 312 | 313 | foreground 314 | #AFC4DB 315 | 316 | 317 | 318 | name 319 | Doctype/XML Processing 320 | scope 321 | meta.sgml.html meta.doctype, meta.sgml.html meta.doctype entity, meta.sgml.html meta.doctype string, meta.xml-processing, meta.xml-processing entity, meta.xml-processing string 322 | settings 323 | 324 | foreground 325 | #73817D 326 | 327 | 328 | 329 | name 330 | Meta.tag.A 331 | scope 332 | meta.tag, meta.tag entity 333 | settings 334 | 335 | foreground 336 | #9EFFFF 337 | 338 | 339 | 340 | name 341 | css tag-name 342 | scope 343 | meta.selector.css entity.name.tag 344 | settings 345 | 346 | foreground 347 | #9EFFFF 348 | 349 | 350 | 351 | name 352 | css#id 353 | scope 354 | meta.selector.css entity.other.attribute-name.id 355 | settings 356 | 357 | foreground 358 | #FFB454 359 | 360 | 361 | 362 | name 363 | css.class 364 | scope 365 | meta.selector.css entity.other.attribute-name.class 366 | settings 367 | 368 | foreground 369 | #5FE461 370 | 371 | 372 | 373 | name 374 | css property-name: 375 | scope 376 | support.type.property-name.css 377 | settings 378 | 379 | foreground 380 | #9DF39F 381 | 382 | 383 | 384 | name 385 | css property-value; 386 | scope 387 | meta.property-group support.constant.property-value.css, meta.property-value support.constant.property-value.css 388 | settings 389 | 390 | foreground 391 | #F6F080 392 | 393 | 394 | 395 | name 396 | css @at-rule 397 | scope 398 | meta.preprocessor.at-rule keyword.control.at-rule 399 | settings 400 | 401 | foreground 402 | #F6AA11 403 | 404 | 405 | 406 | name 407 | css additional-constants 408 | scope 409 | meta.property-value support.constant.named-color.css, meta.property-value constant 410 | settings 411 | 412 | foreground 413 | #EDF080 414 | 415 | 416 | 417 | name 418 | css constructor.argument 419 | scope 420 | meta.constructor.argument.css 421 | settings 422 | 423 | foreground 424 | #EB939A 425 | 426 | 427 | 428 | name 429 | diff.header 430 | scope 431 | meta.diff, meta.diff.header 432 | settings 433 | 434 | background 435 | #000E1A 436 | fontStyle 437 | 438 | foreground 439 | #F8F8F8 440 | 441 | 442 | 443 | name 444 | diff.deleted 445 | scope 446 | markup.deleted 447 | settings 448 | 449 | background 450 | #4C0900 451 | foreground 452 | #F8F8F8 453 | 454 | 455 | 456 | name 457 | diff.changed 458 | scope 459 | markup.changed 460 | settings 461 | 462 | background 463 | #806F00 464 | foreground 465 | #F8F8F8 466 | 467 | 468 | 469 | name 470 | diff.inserted 471 | scope 472 | markup.inserted 473 | settings 474 | 475 | background 476 | #154F00 477 | foreground 478 | #F8F8F8 479 | 480 | 481 | 482 | name 483 | Raw Markup 484 | scope 485 | markup.raw 486 | settings 487 | 488 | background 489 | #8FDDF630 490 | 491 | 492 | 493 | name 494 | Block Quote 495 | scope 496 | markup.quote 497 | settings 498 | 499 | background 500 | #004480 501 | 502 | 503 | 504 | name 505 | List 506 | scope 507 | markup.list 508 | settings 509 | 510 | background 511 | #130D26 512 | 513 | 514 | 515 | name 516 | Bold Markup 517 | scope 518 | markup.bold 519 | settings 520 | 521 | fontStyle 522 | bold 523 | foreground 524 | #C1AFFF 525 | 526 | 527 | 528 | name 529 | Italic Markup 530 | scope 531 | markup.italic 532 | settings 533 | 534 | fontStyle 535 | italic 536 | foreground 537 | #B8FFD9 538 | 539 | 540 | 541 | name 542 | Heading Markup 543 | scope 544 | markup.heading 545 | settings 546 | 547 | background 548 | #001221 549 | fontStyle 550 | bold 551 | foreground 552 | #C8E4FD 553 | 554 | 555 | 556 | name 557 | SublimeLinter Error 558 | scope 559 | sublimelinter.mark.error 560 | settings 561 | 562 | foreground 563 | #DA2000 564 | 565 | 566 | name 567 | SublimeLinter Warning 568 | scope 569 | sublimelinter.mark.warning 570 | settings 571 | 572 | foreground 573 | #EDBA00 574 | 575 | 576 | name 577 | SublimeLinter Gutter Mark 578 | scope 579 | sublimelinter.gutter-mark 580 | settings 581 | 582 | foreground 583 | #FFFFFF 584 | 585 | 586 | uuid 587 | 06CD1FB2-A00A-4F8C-97B2-60E131980454 588 | 589 | -------------------------------------------------------------------------------- /files/sublime/Markdown.sublime-settings: -------------------------------------------------------------------------------- 1 | { 2 | "auto_complete": false, 3 | "extensions": 4 | [ 5 | "txt" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /files/sublime/Plain text.sublime-settings: -------------------------------------------------------------------------------- 1 | { 2 | "extensions": 3 | [ 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /files/sublime/Preferences.sublime-settings: -------------------------------------------------------------------------------- 1 | { 2 | "added_words": 3 | [ 4 | "Kubernetes", 5 | "Ansible", 6 | "Mesos", 7 | "de", 8 | "K8s", 9 | "stateful", 10 | "filesystem", 11 | "cron", 12 | "kubeadm", 13 | "kops", 14 | "Terraform", 15 | "geerlingguy", 16 | "kubernetes", 17 | "playbooks", 18 | "Vagrantfile", 19 | "lang", 20 | "config", 21 | "debian9", 22 | "vm", 23 | "virtualbox", 24 | "cpus", 25 | "ip", 26 | "hostname", 27 | "k8s", 28 | "ansible", 29 | "playbook", 30 | "yml", 31 | "terabyte", 32 | "plugin", 33 | "kube", 34 | "pre", 35 | "kubelet", 36 | "playbook's", 37 | "dev", 38 | "debian", 39 | "ce", 40 | "amd64", 41 | "src", 42 | "cidr", 43 | "kubectl", 44 | "sudo", 45 | "su", 46 | "v1", 47 | "etcd", 48 | "Ansible's", 49 | "openshift", 50 | "nginx", 51 | "metadata", 52 | "apps", 53 | "app", 54 | "namespace", 55 | "a4d", 56 | "yaml", 57 | "linenos", 58 | "3m", 59 | "inline", 60 | "http", 61 | "api", 62 | "ok", 63 | "init", 64 | "rbac", 65 | "gz", 66 | "linux", 67 | "v2", 68 | "https", 69 | "unarchive", 70 | "usr", 71 | "dest", 72 | "tmp", 73 | "cp", 74 | "stdout", 75 | "admin", 76 | "io", 77 | "dns", 78 | "phpmyadmin", 79 | "wordpress", 80 | "jenkins", 81 | "drupal", 82 | "Ceph", 83 | "Gluster", 84 | "Dramble", 85 | "Plugins", 86 | "Jinja", 87 | "templating", 88 | "Dockerfiles", 89 | "Dockerfile", 90 | "Geerling", 91 | "busybox", 92 | "rmi", 93 | "ps", 94 | "localhost", 95 | "python2", 96 | "ubuntu1604", 97 | "angstwad", 98 | "Ubuntu", 99 | "Angstwad's", 100 | "www", 101 | "mysql", 102 | "env", 103 | "py", 104 | "mkdir", 105 | "Werkzeug", 106 | "sqlalchemy", 107 | "html", 108 | "Jinja2", 109 | "libmysqlclient", 110 | "j2", 111 | "ubuntu16", 112 | "awk", 113 | "sbin", 114 | "everything's", 115 | "cd", 116 | "plugins", 117 | "winrm", 118 | "saltstack", 119 | "Hubot", 120 | "hubot", 121 | "args", 122 | "js", 123 | "npm", 124 | "chdir", 125 | "lineinfile", 126 | "json", 127 | "regexp", 128 | "redis", 129 | "heroku", 130 | "a4dbot", 131 | "Slack's", 132 | "bot's", 133 | "lifecycle", 134 | "microservices", 135 | "wildcard", 136 | "Encrypt's", 137 | "crypto", 138 | "ssl", 139 | "privkey", 140 | "pem", 141 | "csr", 142 | "fullchain", 143 | "selfsigned", 144 | "pyopenssl", 145 | "libssl", 146 | "distros", 147 | "iptables", 148 | "cfg", 149 | "tcp", 150 | "python3", 151 | "distro", 152 | "vhosts", 153 | "docroot", 154 | "dir", 155 | "refactor", 156 | "idempotently", 157 | "conf", 158 | "Keychain", 159 | "webservers", 160 | "xyz", 161 | "dbservers", 162 | "httpd", 163 | "rgb", 164 | "dict", 165 | "jinja", 166 | "blog", 167 | "Mazer's", 168 | "Cisco", 169 | "mv", 170 | "endif", 171 | "plugin's", 172 | "versioning", 173 | "namespaced", 174 | "md", 175 | "ruleset", 176 | "ntp", 177 | "parseable", 178 | "foo", 179 | "apache2", 180 | "Diff", 181 | "diffing", 182 | "drush", 183 | "php", 184 | "url", 185 | "multiline", 186 | "nocows", 187 | "java", 188 | "workflows", 189 | "devops", 190 | "username", 191 | "online", 192 | "github", 193 | "awx", 194 | "cowsay", 195 | "workflow", 196 | "Rackspace", 197 | "Uninstalling", 198 | "uninstall", 199 | "walkthrough", 200 | "webhooks", 201 | "Grafana", 202 | "Rundeck", 203 | "Drupal's", 204 | "Symfony", 205 | "Laravel", 206 | "Joomla", 207 | "idempotence", 208 | "Drush's", 209 | "Solr", 210 | "solr", 211 | "sha512", 212 | "Solr's", 213 | "openjdk", 214 | "jdk", 215 | "Ubuntu's", 216 | "org", 217 | "lucene", 218 | "tgz", 219 | "wget", 220 | "txt", 221 | "Andretti", 222 | "devel", 223 | "chkconfig", 224 | "dicts", 225 | "atl", 226 | "subdomains", 227 | "janedoe", 228 | "vvvv", 229 | "Vagrantfiles", 230 | "admins", 231 | "Remi", 232 | "repo", 233 | "epel", 234 | "remi", 235 | "rpms", 236 | "remirepo", 237 | "pki", 238 | "gpg", 239 | "enablerepo", 240 | "nogpgcheck", 241 | "firewalld", 242 | "Remi's", 243 | "disablerepo", 244 | "req", 245 | "scp", 246 | "rsync", 247 | "stderr", 248 | "Forever's", 249 | "nohup", 250 | "app's", 251 | "nodejs", 252 | "pycurl", 253 | "acl", 254 | "ondrej", 255 | "ppa", 256 | "sendmail", 257 | "php7", 258 | "cli", 259 | "gd", 260 | "opcache", 261 | "xml", 262 | "mbstring", 263 | "pdo", 264 | "apcu", 265 | "libpcre3", 266 | "libapache2", 267 | "mysqldb", 268 | "ufw", 269 | "a2enmod", 270 | "virtualhost", 271 | "a2ensite", 272 | "a2dissite", 273 | "symlinking", 274 | "webmaster", 275 | "ini", 276 | "codebase", 277 | "priv", 278 | "cnf", 279 | "phar" 280 | ], 281 | "auto_complete_commit_on_tab": true, 282 | "auto_complete_delay": 200, 283 | "auto_indent": true, 284 | "auto_match_enabled": true, 285 | "binary_file_patterns": 286 | [ 287 | "generated/*", 288 | "*.tbz2", 289 | "*.gzip", 290 | "*.jpg", 291 | "*.jpeg", 292 | "*.png", 293 | "*.gif", 294 | "*.ttf", 295 | "*.tga", 296 | "*.dds", 297 | "*.ico", 298 | "*.eot", 299 | "*.pdf", 300 | "*.swf", 301 | "*.jar", 302 | "*.zip" 303 | ], 304 | "close_windows_when_empty": true, 305 | "color_scheme": "Packages/User/Cobalt (SL).tmTheme", 306 | "create_window_at_startup": false, 307 | "detect_indentation": true, 308 | "draw_minimap_border": false, 309 | "draw_white_space": "selection", 310 | "ensure_newline_at_eof_on_save": false, 311 | "fade_fold_buttons": true, 312 | "file_exclude_patterns": 313 | [ 314 | "*.pyc", 315 | "*.pyo", 316 | "*.exe", 317 | "*.dll", 318 | "*.obj", 319 | "*.o", 320 | "*.a", 321 | "*.lib", 322 | "*.so", 323 | "*.dylib", 324 | "*.ncb", 325 | "*.sdf", 326 | "*.suo", 327 | "*.pdb", 328 | "*.idb", 329 | ".DS_Store", 330 | "*.class", 331 | "*.psd", 332 | "*.db", 333 | "*.sublime-workspace" 334 | ], 335 | "fold_buttons": true, 336 | "folder_exclude_patterns": 337 | [ 338 | "node_modules", 339 | ".svn", 340 | ".git", 341 | ".hg", 342 | "CVS", 343 | "vendor", 344 | ".bundle", 345 | ".vagrant" 346 | ], 347 | "font_size": 15.0, 348 | "gpu_window_buffer": false, 349 | "gutter": true, 350 | "highlight_line": true, 351 | "ignored_packages": 352 | [ 353 | "Vintage", 354 | ], 355 | "ignored_words": 356 | [ 357 | "0000ff", 358 | "00f", 359 | "12m", 360 | "13m", 361 | "5d", 362 | "5m", 363 | "6d", 364 | "Phergie", 365 | "Sutcliffe's", 366 | "Uvh", 367 | "ansicolor", 368 | "awxcompose", 369 | "configfile", 370 | "examplenodeapp", 371 | "getcomposer", 372 | "googleapis", 373 | "johndoe", 374 | "johndoe1234", 375 | "modifyvm", 376 | "modulename", 377 | "msg", 378 | "node1", 379 | "node2", 380 | "oo", 381 | "phergie", 382 | "rf", 383 | "rolename", 384 | "si", 385 | "v1beta1", 386 | "var1", 387 | "var2", 388 | "varname", 389 | "vg" 390 | ], 391 | "line_numbers": true, 392 | "margin": 4, 393 | "match_brackets": true, 394 | "match_selection": true, 395 | "rulers": 396 | [ 397 | 80 398 | ], 399 | "smart_indent": true, 400 | "spell_check": false, 401 | "tab_size": 2, 402 | "theme": "auto", 403 | "translate_tabs_to_spaces": true, 404 | "trim_automatic_white_space": false, 405 | "trim_trailing_white_space_on_save": false, 406 | } 407 | -------------------------------------------------------------------------------- /files/sublime/WordCount.sublime-settings: -------------------------------------------------------------------------------- 1 | { 2 | "whitelist_syntaxes": ["Plain text", "Markdown"] 3 | } 4 | -------------------------------------------------------------------------------- /files/terminal/JJG-Term.terminal: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ANSIBlackColor 6 | 7 | YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS 8 | AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGmCwwXHR4lVSRudWxs1Q0ODxAR 9 | EhMUFRZcTlNDb21wb25lbnRzVU5TUkdCXE5TQ29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29s 10 | b3JTcGFjZVYkY2xhc3NPECgwLjM4NDE0MzI4NDQgMC4zOTIzMTY1NDU4IDAuMzkyMzE2 11 | NTQ1OCAxTxAmMC4zMTA5OTExNjggMC4zMTg2NzQ4NjI0IDAuMzE4NTE0MDQ5MQAQAYAC 12 | gAXTGBkRGhscVE5TSURVTlNJQ0MQB4ADgARPEQxIAAAMSExpbm8CEAAAbW50clJHQiBY 13 | WVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAAAAAAAPbW 14 | AAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 15 | AAAAAAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAA 16 | AgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQA 17 | AABwZG1kZAAAAsQAAACIdnVlZAAAA0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAU 18 | bWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAABDwAAAgMZ1RSQwAABDwAAAgMYlRS 19 | QwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3bGV0dC1QYWNrYXJk 20 | IENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAS 21 | c1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 22 | AAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAA 23 | AAAAAABYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAA 24 | AAAAACSgAAAPhAAAts9kZXNjAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAA 25 | AAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 26 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYxOTY2LTIuMSBE 27 | ZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2 28 | LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAA 29 | AAAAAAAAAGRlc2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJ 30 | RUM2MTk2Ni0yLjEAAAAAAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24g 31 | aW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAAT 32 | pP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMA 33 | AAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAA 34 | AAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0A 35 | cgB3AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDw 36 | APYA+wEBAQcBDQETARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIB 37 | mgGhAakBsQG5AcEByQHRAdkB4QHpAfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJx 38 | AnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34D 39 | igOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATT 40 | BOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkG 41 | agZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgy 42 | CEYIWghuCIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0K 43 | VApqCoEKmAquCsUK3ArzCwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgyn 44 | DMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EP 45 | Xg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJF 46 | EmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgV 47 | mxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkg 48 | GUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUd 49 | Hh1HHXAdmR3DHeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFI 50 | IXUhoSHOIfsiJyJVIoIiryLdIwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl 51 | 9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrP 52 | KwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4w 53 | NTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXC 54 | Nf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o7 55 | 6DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIw 56 | QnJCtUL3QzpDfUPARANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJ 57 | HUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAn 58 | UHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX 59 | 4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+z 60 | YAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+lo 61 | P2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDg 62 | cTpxlXHwcktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6 63 | RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6 64 | hB2EgITjhUeFq4YOhnKG14c7h5+IBIhpiM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN 65 | /45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhM 66 | mLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowaj 67 | dqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6h 68 | rxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6 69 | tbsuu6e8IbybvRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbD 70 | x0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TT 71 | xtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC9 72 | 4UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb6uXrcOv77IbtEe2c7iju 73 | tO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY 74 | /Sn9uv5L/tz/bf//0h8gISJaJGNsYXNzbmFtZVgkY2xhc3Nlc1xOU0NvbG9yU3BhY2Wi 75 | IyRcTlNDb2xvclNwYWNlWE5TT2JqZWN00h8gJidXTlNDb2xvcqImJAAIABEAGgAkACkA 76 | MgA3AEkATABRAFMAWgBgAGsAeAB+AIsAoACnANIA+wD9AP8BAQEIAQ0BEwEVARcBGQ1l 77 | DWoNdQ1+DYsNjg2bDaQNqQ2xAAAAAAAAAgEAAAAAAAAAKAAAAAAAAAAAAAAAAAAADbQ= 78 | 79 | ANSIBrightBlackColor 80 | 81 | YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS 82 | AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGmCwwXHR4lVSRudWxs1Q0ODxAR 83 | EhMUFRZcTlNDb21wb25lbnRzVU5TUkdCXE5TQ29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29s 84 | b3JTcGFjZVYkY2xhc3NPECgwLjU5MjQ0MjEwMzggMC41OTI0NDIxMDM4IDAuNTkyNDQy 85 | MTAzOCAxTxAnMC41MjE1MTQ1OTQ2IDAuNTIxNDk5MDM3NyAwLjUyMTUwNzc5OTYAEAGA 86 | AoAF0xgZERobHFROU0lEVU5TSUNDEAeAA4AETxEMSAAADEhMaW5vAhAAAG1udHJSR0Ig 87 | WFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD2 88 | 1gABAAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 89 | AAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQA 90 | AAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJU 91 | AAAAcGRtZGQAAALEAAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAA 92 | FG1lYXMAAAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJU 93 | UkMAAAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2Fy 94 | ZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAA 95 | EnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 96 | AAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAA 97 | AAAAAAAAWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAA 98 | AAAAAAAkoAAAD4QAALbPZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAA 99 | AAAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEg 101 | RGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2 102 | Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAA 103 | AAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4g 104 | SUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9u 105 | IGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAA 106 | E6T+ABRfLgAQzxQAA+3MAAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFz 107 | AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAA 108 | AAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABt 109 | AHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA 110 | 8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGS 111 | AZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcC 112 | cQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+ 113 | A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE 114 | 0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZ 115 | BmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8I 116 | MghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9 117 | ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4M 118 | pwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9B 119 | D14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYS 120 | RRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4 121 | FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZ 122 | IBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1 123 | HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwh 124 | SCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXH 125 | JfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsq 126 | zysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+ 127 | MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1 128 | wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuq 129 | O+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5C 130 | MEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjX 131 | SR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91Q 132 | J1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeS 133 | V+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ff 134 | s2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fp 135 | aD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw 136 | 4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnn 137 | ekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eD 138 | uoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Y 139 | jf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CY 140 | TJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMG 141 | o3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2u 142 | oa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7 143 | urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbG 144 | w8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE 145 | 08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4Dbg 146 | veFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o 147 | 7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8 148 | mP0p/br+S/7c/23//9IfICEiWiRjbGFzc25hbWVYJGNsYXNzZXNcTlNDb2xvclNwYWNl 149 | oiMkXE5TQ29sb3JTcGFjZVhOU09iamVjdNIfICYnV05TQ29sb3KiJiQACAARABoAJAAp 150 | ADIANwBJAEwAUQBTAFoAYABrAHgAfgCLAKAApwDSAPwA/gEAAQIBCQEOARQBFgEYARoN 151 | Zg1rDXYNfw2MDY8NnA2lDaoNsgAAAAAAAAIBAAAAAAAAACgAAAAAAAAAAAAAAAAAAA21 152 | 153 | BackgroundAlphaInactive 154 | 0.73865855823863635 155 | BackgroundBlur 156 | 0.0 157 | BackgroundBlurInactive 158 | 0.50397283380681823 159 | BackgroundColor 160 | 161 | YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS 162 | AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGjCwwTVSRudWxs0w0ODxARElVO 163 | U1JHQlxOU0NvbG9yU3BhY2VWJGNsYXNzTxAqMC4wNzg3MTk0MjkzNSAwLjA3ODcxOTQy 164 | OTM1IDAuMDc4NzE5NDI5MzUAEAGAAtIUFRYXWiRjbGFzc25hbWVYJGNsYXNzZXNXTlND 165 | b2xvcqIWGFhOU09iamVjdAgRGiQpMjdJTFFTV11kand+q62vtL/I0NMAAAAAAAABAQAA 166 | AAAAAAAZAAAAAAAAAAAAAAAAAAAA3A== 167 | 168 | BackgroundSettingsForInactiveWindows 169 | 170 | CursorColor 171 | 172 | YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS 173 | AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGjCwwTVSRudWxs0w0ODxAREldO 174 | U1doaXRlXE5TQ29sb3JTcGFjZVYkY2xhc3NLMC4zMDI0MTkzNgAQA4AC0hQVFhdaJGNs 175 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohYYWE5TT2JqZWN0CBEaJCkyN0lMUVNXXWRs 176 | eYCMjpCVoKmxtAAAAAAAAAEBAAAAAAAAABkAAAAAAAAAAAAAAAAAAAC9 177 | 178 | Font 179 | 180 | YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS 181 | AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGkCwwVFlUkbnVsbNQNDg8QERIT 182 | FFZOU1NpemVYTlNmRmxhZ3NWTlNOYW1lViRjbGFzcyNALAAAAAAAABAQgAKAA11TRk1v 183 | bm8tTWVkaXVt0hcYGRpaJGNsYXNzbmFtZVgkY2xhc3Nlc1ZOU0ZvbnSiGRtYTlNPYmpl 184 | Y3QIERokKTI3SUxRU1heZ253foWOkJKUoqeyu8LFAAAAAAAAAQEAAAAAAAAAHAAAAAAA 185 | AAAAAAAAAAAAAM4= 186 | 187 | FontAntialias 188 | 189 | FontWidthSpacing 190 | 0.99596774193548387 191 | Linewrap 192 | 193 | ProfileCurrentVersion 194 | 2.0699999999999998 195 | RestoreLines 196 | 2000 197 | ScrollbackLines 198 | 50000 199 | SelectionColor 200 | 201 | YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS 202 | AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGjCwwTVSRudWxs0w0ODxAREldO 203 | U1doaXRlXE5TQ29sb3JTcGFjZVYkY2xhc3NLMC4yNTQwMzIyNQAQA4AC0hQVFhdaJGNs 204 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohYYWE5TT2JqZWN0CBEaJCkyN0lMUVNXXWRs 205 | eYCMjpCVoKmxtAAAAAAAAAEBAAAAAAAAABkAAAAAAAAAAAAAAAAAAAC9 206 | 207 | ShouldLimitScrollback 208 | 1 209 | ShowWindowSettingsNameInTitle 210 | 211 | TerminalType 212 | xterm-color 213 | TextBoldColor 214 | 215 | YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS 216 | AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGjCwwTVSRudWxs0w0ODxAREldO 217 | U1doaXRlXE5TQ29sb3JTcGFjZVYkY2xhc3NCMQAQA4AC0hQVFhdaJGNsYXNzbmFtZVgk 218 | Y2xhc3Nlc1dOU0NvbG9yohYYWE5TT2JqZWN0CBEaJCkyN0lMUVNXXWRseYCDhYeMl6Co 219 | qwAAAAAAAAEBAAAAAAAAABkAAAAAAAAAAAAAAAAAAAC0 220 | 221 | TextColor 222 | 223 | YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS 224 | AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGjCwwTVSRudWxs0w0ODxAREldO 225 | U1doaXRlXE5TQ29sb3JTcGFjZVYkY2xhc3NLMC45NDc1ODA2NAAQA4AC0hQVFhdaJGNs 226 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohYYWE5TT2JqZWN0CBEaJCkyN0lMUVNXXWRs 227 | eYCMjpCVoKmxtAAAAAAAAAEBAAAAAAAAABkAAAAAAAAAAAAAAAAAAAC9 228 | 229 | UseBrightBold 230 | 231 | columnCount 232 | 120 233 | name 234 | JJG-Term 235 | rowCount 236 | 30 237 | shellExitAction 238 | 1 239 | type 240 | Window Settings 241 | 242 | 243 | -------------------------------------------------------------------------------- /inventory: -------------------------------------------------------------------------------- 1 | [all] 2 | 127.0.0.1 ansible_connection=local 3 | -------------------------------------------------------------------------------- /main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - hosts: all 3 | 4 | vars_files: 5 | - default.config.yml 6 | 7 | pre_tasks: 8 | - name: Include playbook configuration. 9 | include_vars: "{{ item }}" 10 | with_fileglob: 11 | - "{{ playbook_dir }}/config.yml" 12 | tags: ['always'] 13 | 14 | roles: 15 | - role: elliotweiser.osx-command-line-tools 16 | - role: geerlingguy.mac.homebrew 17 | tags: ['homebrew'] 18 | - role: geerlingguy.dotfiles 19 | when: configure_dotfiles 20 | tags: ['dotfiles'] 21 | - role: geerlingguy.mac.mas 22 | when: mas_installed_apps or mas_installed_app_ids 23 | tags: ['mas'] 24 | - role: geerlingguy.mac.dock 25 | when: configure_dock 26 | tags: ['dock'] 27 | 28 | tasks: 29 | - import_tasks: tasks/sudoers.yml 30 | when: configure_sudoers 31 | tags: ['sudoers'] 32 | 33 | - import_tasks: tasks/terminal.yml 34 | when: configure_terminal 35 | tags: ['terminal'] 36 | 37 | - import_tasks: tasks/osx.yml 38 | when: configure_osx 39 | tags: ['osx'] 40 | 41 | - import_tasks: tasks/extra-packages.yml 42 | tags: ['extra-packages'] 43 | 44 | - import_tasks: tasks/sublime-text.yml 45 | when: configure_sublime 46 | tags: ['sublime-text'] 47 | 48 | - name: Run configured post-provision ansible task files. 49 | include_tasks: "{{ outer_item }}" 50 | loop_control: 51 | loop_var: outer_item 52 | with_fileglob: "{{ post_provision_tasks|default(omit) }}" 53 | tags: ['post'] 54 | -------------------------------------------------------------------------------- /requirements.yml: -------------------------------------------------------------------------------- 1 | --- 2 | roles: 3 | - name: elliotweiser.osx-command-line-tools 4 | - name: geerlingguy.dotfiles 5 | 6 | collections: 7 | - name: geerlingguy.mac 8 | -------------------------------------------------------------------------------- /tasks/extra-packages.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Install global Composer packages. 3 | composer: 4 | command: "{{ (item.state | default('present') == 'absent') | ternary('remove', 'require') }}" 5 | arguments: "{{ item.name | default(item) }} {{ item.version | default('@stable') }}" 6 | # Ansible 2.4 supports `global_command` making `working_dir` optional. 7 | working_dir: "{{ lookup('env', 'COMPOSER_HOME') | default('~/.composer', true) }}" 8 | loop: "{{ composer_packages }}" 9 | 10 | - name: Install global NPM packages. 11 | npm: 12 | name: "{{ item.name | default(item) }}" 13 | state: "{{ item.state | default('present') }}" 14 | version: "{{ item.version | default(omit) }}" 15 | global: true 16 | executable: "{{ item.executable | default(omit) }}" 17 | loop: "{{ npm_packages }}" 18 | 19 | - name: Install global Pip packages. 20 | pip: 21 | name: "{{ item.name | default(item) }}" 22 | state: "{{ item.state | default('present') }}" 23 | version: "{{ item.version | default(omit) }}" 24 | executable: "{{ item.executable | default(omit) }}" 25 | loop: "{{ pip_packages }}" 26 | 27 | - name: Install global Ruby gems. 28 | gem: 29 | name: "{{ item.name | default(item) }}" 30 | state: "{{ item.state | default('present') }}" 31 | version: "{{ item.version | default(omit) }}" 32 | user_install: false 33 | executable: "{{ item.executable | default(omit) }}" 34 | loop: "{{ gem_packages }}" 35 | -------------------------------------------------------------------------------- /tasks/osx.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # TODO: Use sudo once .osx can be run via root with no user interaction. 3 | - name: Run .osx dotfiles. 4 | command: "{{ osx_script }}" 5 | changed_when: false 6 | -------------------------------------------------------------------------------- /tasks/sublime-text.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Ensure Sublime Text directories exist. 3 | file: 4 | path: "{{ item }}" 5 | state: directory 6 | loop: 7 | - "{{ sublime_base_path }}/{{ sublime_config_path }}" 8 | - "{{ sublime_base_path }}/Installed Packages" 9 | 10 | - name: Ensure Sublime Package Control is installed. 11 | get_url: 12 | url: "https://packagecontrol.io/Package%20Control.sublime-package" 13 | dest: "{{ sublime_base_path }}/Installed Packages/Package Control.sublime-package" 14 | 15 | - name: Ensure Sublime Package Control Packages are configured. 16 | template: 17 | src: templates/Package_Control.sublime-settings.j2 18 | dest: "{{ sublime_base_path }}/{{ sublime_config_path }}/Package Control.sublime-settings" 19 | 20 | - name: Ensure Sublime text user Preferences and theme are set. 21 | copy: 22 | src: "files/sublime/{{ item }}" 23 | dest: "{{ sublime_base_path }}/{{ sublime_config_path }}/{{ item }}" 24 | loop: 25 | - "Cobalt (SL).tmTheme" 26 | - "Markdown.sublime-settings" 27 | - "Plain text.sublime-settings" 28 | - "Preferences.sublime-settings" 29 | - "WordCount.sublime-settings" 30 | -------------------------------------------------------------------------------- /tasks/sudoers.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # If the user installs GNU sed through homebrew the path is different. 3 | - name: Register path to sed. 4 | command: which sed 5 | register: sed_which_result 6 | changed_when: false 7 | when: sed_path is undefined 8 | 9 | - name: Define sed_path variable. 10 | set_fact: 11 | sed_path: "{{ sed_which_result.stdout }}" 12 | when: sed_path is undefined 13 | 14 | # Sudoers configuration. 15 | - name: Copy sudoers configuration into place. 16 | copy: 17 | content: "{{ sudoers_custom_config }}" 18 | dest: /private/etc/sudoers.d/custom 19 | mode: 0440 20 | validate: 'visudo -cf %s' 21 | become: true 22 | -------------------------------------------------------------------------------- /tasks/terminal.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # Custom Terminal theme. 3 | - name: Get current Terminal profile. 4 | command: defaults read com.apple.terminal 'Default Window Settings' 5 | register: terminal_theme 6 | changed_when: false 7 | check_mode: false 8 | 9 | - name: Ensure custom Terminal profile is added. 10 | copy: 11 | src: files/terminal/JJG-Term.terminal 12 | dest: /tmp/JJG-Term.terminal 13 | changed_when: false 14 | when: "'JJG-Term' not in terminal_theme.stdout" 15 | 16 | - name: Ensure custom Terminal profile is added. 17 | command: open /tmp/JJG-Term.terminal 18 | changed_when: false 19 | when: "'JJG-Term' not in terminal_theme.stdout" 20 | 21 | # TODO: This doesn't work in Yosemite. Consider a different solution? 22 | - name: Ensure custom Terminal profile is set as default. 23 | command: "{{ item }}" 24 | with_items: 25 | - defaults write com.apple.terminal 'Default Window Settings' -string JJG-Term 26 | - defaults write com.apple.terminal 'Startup Window Settings' -string JJG-Term 27 | changed_when: false 28 | when: "'JJG-Term' not in terminal_theme.stdout" 29 | -------------------------------------------------------------------------------- /templates/Package_Control.sublime-settings.j2: -------------------------------------------------------------------------------- 1 | { 2 | "auto_upgrade_last_run": null, 3 | "bootstrapped": true, 4 | "in_process_packages": 5 | [ 6 | ], 7 | "installed_packages": 8 | [ 9 | {% for package in sublime_package_control %} 10 | "{{ package }}"{% if not loop.last %},{% endif %} 11 | {% endfor %} 12 | ], 13 | } 14 | -------------------------------------------------------------------------------- /tests/ansible.cfg: -------------------------------------------------------------------------------- 1 | [defaults] 2 | inventory = inventory 3 | -------------------------------------------------------------------------------- /tests/config.yml: -------------------------------------------------------------------------------- 1 | --- 2 | downloads: ~/.ansible-downloads/ 3 | 4 | configure_dotfiles: true 5 | configure_terminal: true 6 | configure_osx: true 7 | 8 | # Set to 'true' to configure the Dock via dockutil. 9 | configure_dock: false 10 | dockitems_remove: [] 11 | # - Launchpad 12 | # - TV 13 | # - Podcasts 14 | # - 'App Store' 15 | dockitems_persist: [] 16 | # - name: "Sublime Text" 17 | # path: "/Applications/Sublime Text.app/" 18 | # pos: 5 19 | 20 | configure_sudoers: false 21 | sudoers_custom_config: | 22 | amagalhaes ALL = (root) NOPASSWD: /opt/homebrew/bin/yabai --load-sa 23 | 24 | dotfiles_repo: https://github.com/armand1m/dotfiles.git 25 | dotfiles_repo_accept_hostkey: true 26 | dotfiles_repo_local_destination: ~/Projects/Personal/dotfiles 27 | dotfiles_files: 28 | - .yabairc 29 | - .skhdrc 30 | - .config 31 | - .zshrc 32 | - .gitignore 33 | - .gitconfig 34 | - .inputrc 35 | - .osx 36 | - .vimrc 37 | 38 | homebrew_installed_packages: 39 | - dockutil 40 | - bash-completion 41 | - gpg 42 | - sqlite 43 | - nmap 44 | - openssl 45 | - htop 46 | - exa 47 | - bat 48 | - istioctl 49 | - terraform 50 | - pwgen 51 | - pgcli 52 | - dbmate 53 | - neovim 54 | - koekeishiya/formulae/yabai 55 | - koekeishiya/formulae/skhd 56 | 57 | homebrew_taps: 58 | - homebrew/core 59 | - homebrew/cask 60 | - homebrew/cask-drivers 61 | - koekeishiya/formulae 62 | 63 | homebrew_cask_appdir: /Applications 64 | homebrew_cask_apps: 65 | - chromedriver 66 | - docker 67 | - telegram 68 | - visual-studio-code 69 | - discord 70 | - spotify 71 | - google-cloud-sdk 72 | - karabiner-elements 73 | - remarkable 74 | - elgato-control-center 75 | - displaylink 76 | - ubersicht 77 | - lens 78 | 79 | # See `geerlingguy.mas` role documentation for usage instructions. 80 | mas_installed_apps: [] 81 | mas_email: '' 82 | mas_password: '' 83 | 84 | osx_script: ~/.osx --no-restart 85 | 86 | # Install packages from other package managers. 87 | # Note: You are responsible for making sure the required package managers are 88 | # installed, eg. through homebrew. 89 | composer_packages: [] 90 | # - name: drush 91 | # state: present # present/absent, default: present 92 | # version: "^8.1" # default: N/A 93 | gem_packages: [] 94 | # - name: bundler 95 | # state: present # present/absent/latest, default: present 96 | # version: "~> 1.15.1" # default: N/A 97 | npm_packages: [] 98 | # - name: webpack 99 | # state: present # present/absent/latest, default: present 100 | # version: "^2.6" # default: N/A 101 | pip_packages: [] 102 | # - name: mkdocs 103 | # state: present # present/absent/latest, default: present 104 | # version: "0.16.3" # default: N/A 105 | 106 | # Set to 'true' to configure Sublime Text. 107 | configure_sublime: false 108 | 109 | # Glob pattern to ansible task files to run after all other tasks are finished. 110 | post_provision_tasks: [] 111 | -------------------------------------------------------------------------------- /tests/inventory: -------------------------------------------------------------------------------- 1 | [local] 2 | localhost ansible_connection=local 3 | -------------------------------------------------------------------------------- /tests/uninstall-homebrew.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Uninstalls Homebrew using the official uninstall script. 4 | 5 | # Download and run the uninstall script. 6 | curl -sLO https://raw.githubusercontent.com/Homebrew/install/master/uninstall.sh 7 | chmod +x ./uninstall.sh 8 | sudo ./uninstall.sh --force 9 | 10 | # Clean up Homebrew directories. 11 | sudo rm -rf /usr/local/Homebrew 12 | sudo rm -rf /usr/local/Caskroom 13 | sudo rm -rf /usr/local/bin/brew 14 | sudo rm -rf /usr/local/bin/chromedriver 15 | --------------------------------------------------------------------------------