From fcc392b0b50a45646365f9313122d6394bacca9b Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Wed, 13 Nov 2019 11:14:21 -0600 Subject: [PATCH 001/115] For macOS 10.15, I've switched to ZSH from Bash. --- default.config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/default.config.yml b/default.config.yml index 1757e5999..cbf4ec40f 100644 --- a/default.config.yml +++ b/default.config.yml @@ -10,7 +10,7 @@ dotfiles_repo: https://github.com/geerlingguy/dotfiles.git dotfiles_repo_accept_hostkey: yes dotfiles_repo_local_destination: ~/Dropbox/Development/GitHub/dotfiles dotfiles_files: - - .bash_profile + - .zshrc - .gitignore - .inputrc - .osx From ceb8264b89dd871dbd2ec5be3ca4a633aee25028 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Wed, 11 Dec 2019 09:44:43 -0600 Subject: [PATCH 002/115] Create FUNDING.yml --- .github/FUNDING.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..af7a1e022 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,4 @@ +# These are supported funding model platforms + +github: geerlingguy +patreon: geerlingguy From b2496fefc0c91ad9f7fd20cb055460bb52432d09 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Wed, 12 Feb 2020 11:43:05 -0600 Subject: [PATCH 003/115] Add GitHub CLI to default packages. --- default.config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/default.config.yml b/default.config.yml index cbf4ec40f..b7312ff89 100644 --- a/default.config.yml +++ b/default.config.yml @@ -24,9 +24,9 @@ homebrew_installed_packages: - gettext - gifsicle - git + - github/gh/gh - go - gpg - - hub - httpie - iperf - libevent From d624aae2ee26669917936a0d6990df8798056308 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Thu, 5 Mar 2020 10:47:50 -0600 Subject: [PATCH 004/115] Add probot/stale configuration. --- .github/stale.yml | 56 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 .github/stale.yml diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 000000000..c7ff12754 --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,56 @@ +# Configuration for probot-stale - https://github.com/probot/stale + +# Number of days of inactivity before an Issue or Pull Request becomes stale +daysUntilStale: 90 + +# Number of days of inactivity before an Issue or Pull Request with the stale label is closed. +# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. +daysUntilClose: 30 + +# Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled) +onlyLabels: [] + +# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable +exemptLabels: + - pinned + - security + - planned + +# Set to true to ignore issues in a project (defaults to false) +exemptProjects: false + +# Set to true to ignore issues in a milestone (defaults to false) +exemptMilestones: false + +# Set to true to ignore issues with an assignee (defaults to false) +exemptAssignees: false + +# Label to use when marking as stale +staleLabel: stale + +# Limit the number of actions per hour, from 1-30. Default is 30 +limitPerRun: 30 + +pulls: + markComment: |- + 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! + + 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. + + unmarkComment: >- + This pull request is no longer marked for closure. + + closeComment: >- + 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. + +issues: + markComment: |- + 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! + + 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. + + unmarkComment: >- + This issue is no longer marked for closure. + + closeComment: >- + 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. From fe4c606aeff156cce8da72d7e01f2510305ef039 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Fri, 20 Mar 2020 13:38:40 -0500 Subject: [PATCH 005/115] Don't use Dropbox for git repos. --- default.config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/default.config.yml b/default.config.yml index b7312ff89..950efdf50 100644 --- a/default.config.yml +++ b/default.config.yml @@ -8,7 +8,7 @@ configure_osx: yes dotfiles_repo: https://github.com/geerlingguy/dotfiles.git dotfiles_repo_accept_hostkey: yes -dotfiles_repo_local_destination: ~/Dropbox/Development/GitHub/dotfiles +dotfiles_repo_local_destination: ~/Development/GitHub/dotfiles dotfiles_files: - .zshrc - .gitignore From 7526535c803f57f5dd04f49177f40a845eb167ea Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Sat, 28 Mar 2020 23:00:55 -0500 Subject: [PATCH 006/115] Update tests to use macOS 10.14 instead of 10.13. --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index dc520a12d..17efbd705 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,8 @@ --- sudo: required language: objective-c -# 10.13 (see https://docs.travis-ci.com/user/osx-ci-environment/#OS-X-Version) -osx_image: xcode9.3 +# 10.14 (see https://docs.travis-ci.com/user/osx-ci-environment/#OS-X-Version) +osx_image: xcode11.3 before_install: # Uninstall existing Homebrew installation. From 66eaab634349e96adb436cba3a0459636cabd7b1 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Sat, 28 Mar 2020 23:17:40 -0500 Subject: [PATCH 007/115] Issue #82: Remove macvim so tests can pass again. --- default.config.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/default.config.yml b/default.config.yml index 950efdf50..e897ac4c3 100644 --- a/default.config.yml +++ b/default.config.yml @@ -57,9 +57,7 @@ homebrew_cask_apps: - google-chrome - handbrake - licecap - - macvim - sequel-pro - - skitch - slack - sublime-text - transmit From 6e9abccb39de3422c98553fb3909e187f9f1395c Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Sun, 29 Mar 2020 20:14:21 -0500 Subject: [PATCH 008/115] Issue #82: Remove macvim so tests can pass again - from the right place. --- tests/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/config.yml b/tests/config.yml index d67f3bc0b..fefa4b33c 100644 --- a/tests/config.yml +++ b/tests/config.yml @@ -12,4 +12,4 @@ homebrew_installed_packages: homebrew_cask_apps: - firefox - - macvim + - licecap From ec2720104761a16fb82e4b2bb4e30e71bb4f4c0d Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Tue, 14 Apr 2020 16:05:24 -0500 Subject: [PATCH 009/115] Use new homebrew uninstaller - fixes CI failure. --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 17efbd705..597863f03 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,9 +6,9 @@ osx_image: xcode11.3 before_install: # Uninstall existing Homebrew installation. - - curl -sLO https://raw.githubusercontent.com/Homebrew/install/master/uninstall - - chmod +x ./uninstall - - ./uninstall --force + - curl -sLO https://raw.githubusercontent.com/Homebrew/install/master/uninstall.sh + - chmod +x ./uninstall.sh + - ./uninstall.sh --force - sudo rm -rf /usr/local/Homebrew - sudo rm -rf /usr/local/Caskroom - sudo rm -rf /usr/local/bin/brew From d4718c3efe0d4a36a88de3483c5a2c54899db3de Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Tue, 21 Apr 2020 17:19:52 -0500 Subject: [PATCH 010/115] Fancy. Logo. --- README.md | 2 ++ files/Mac-Dev-Playbook-Logo.png | Bin 0 -> 8630 bytes 2 files changed, 2 insertions(+) create mode 100644 files/Mac-Dev-Playbook-Logo.png diff --git a/README.md b/README.md index 1b3768f25..fc610abe3 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +Mac Dev Playbook Logo + # Mac Development Ansible Playbook [![Build Status](https://travis-ci.org/geerlingguy/mac-dev-playbook.svg?branch=master)](https://travis-ci.org/geerlingguy/mac-dev-playbook) diff --git a/files/Mac-Dev-Playbook-Logo.png b/files/Mac-Dev-Playbook-Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e08e64675de43c99db4d3d8d2210e6eaf87fb1b1 GIT binary patch literal 8630 zcmcI}cTiN@v+f2|FaV;+5dje;8GwUih9rn&kT^tbOL2?*!8sc4e>b_sy_x`(8Z>n}d&GcHkSFi4`zwUnjQdx%l%AG3^1d+?hK39Vv zq8;#vlU)Melo7a3z#m!{X>AvEdvg~zBPTQHnW??8**!U1BMUP%Gb2+E#||?Q2x8Kf zd;UzreQXs+>P>BS+O}zUZ|BZf$7SY^x%ZSL?p0mbpuQywNgJkTWNAaHo79%bx7*ME zp?(QOZJm?clQ!^#!R-6}_M9(&uqjq}p};6GoU zm~~~ZyHr4}|IJ65-T%h%3o{d|)H7$nIS5LN|9oaq$eqH}M`fwlxJ4oo=mhz5n9Y)U z|HJ)-sqZA@%G!H^(W^vYhAJmk@j?MyW^t$R<)#SpzNk@OW7?XTxeP&qk2H7}{a@5bz%kw5uWn!JP8LYm*l@T^LBa2L z2|7p}9MtIO>WZD6HQip2l#gdD&AYiMc3(ui&)})UltiMSV`gArU|AmIA8u-D+CJM6 z!@|#x{M-H}Q}eYw$#m@IqW(p9Z*LKq8R)h1@*AJN^k?QRD2d&ZyVB`iX~M;>hhueD zHnX#t3-l8=bsz~+i=NLP-@PM)t9-{E>eh2cev!U04?(*ygA+Tq&0_296l@8a>M-y3 z59fs-{b>kd%!}yLt9moNgAOYQGQbvpr}8v&thkx@D@*3)Je1D83-j&ImQ!wiBCakd zxgYJ|_{nPNiH;;y*vQyOW-N&%)3gi^3rUB`Mv^=iA$5fgz9m4-HE1%DGOn zm!1o0E&MfG8YJvNGE|HVupX8>xOYsbm?sK z*-6rU5}>DBh+EbR0Xa+wE*r6;b;I*J`3?QNhzl1k2=0nK8hNa#rY>D~df0qAe|EUD zcCy{;;o)JPZvnik!~n(2!lFZQ_c$zy6e!)pZb7e8V~tVv+*@Wb`kBU|TNP#8D&iKT z=%bnsFD(&5tPE?W`s}Sc?JjE)b_P_;+9DXDqoQ7)dQ5-2s6_*;dBBHAYEVchxxsLf z9vBpq=(o?Zd{r79&(Xc~ONKFSy;+*aBI$UD&9OvhRy%gYQwOaUw1T z{2t@q5=h%gPEv~1groIl!$_SR+{G*K8v&#@q5HnT?C;{DLAM88$VDoE={f za$T)`Vo>pXEF{Ph^8!)#`u#7YNn0dZT}70`tTWcE6<9W%6cK|};A(urrji=_P@NTx zz??`Q@f+?ZG`Ck-s?R0cE4MrMidqbxJJg6X>0>R$RA0}}-beVF`IO%|@^M?JI~v8> zs;|5^rL!(gb_~q?bbNFdXyNrfEHpYSOfgY-mr)J*BripiR6zY~ld_||E0#TrANX2J zUQlpw=g)9Dmea=lY*)N4^{kr}rjTWwwpx|%3VCC|Kfs}<^fb6^BE=3rW#{E7)Y#$J z-(A$q+S!rX8Zn7fy#~DA`+K+mjv3~*7MsXp!u)sCX%c;o)vcR1ALt=%;-aFiUm?D} z=)b?ShLaJ)Rm#}a&C!HTXGSo<+P}Ufo!i5%r{4w#bC0k8WqY`TF`Mgj%W+xir_PS* zjD7gvY~SyU-?~#N@Lc5i?lK=U6O-zT$h)m3+H1!_rh{rjyxiQsin&2}u|Kt%<>AZD zzY}y#I?EbUQn4bA3e$C_CArrZaNnVg!R^z74?%$!)Wh!6+@QA^^o-GQK0h5l*jFxTRStxh!cH`09NH#AQ^*%!yK{rM>ZwNiqb9fBL? zTo-$eC_P#(I^!Mg#+|>5$lAyV-@VW^oqXfw&1|2eJ!)d0fVFjBSw^wpSpYRx&)Rfl zb8YCY7)mj1F7j~1MPT<+34~C+9bWgLVUtMfhT|MMA*R|IL%R~jMhVPukP`Ugd4XZG zSWwyf!`+p{yh)<#i!HsZ%1O+)`u>z6T)v$#n^KY@lSH~Yu|$^0!u~mV_8r$?Mt4%iO%B|VdCZD;lq>NGE zp6l@TelhDRX~Tsn_RS~AQDvaxv4)M!=fV6}252NXqnM<5m-`9j+3EDpa3>VivT)s6 z{fg=4?^c^WU;@8EzZU5IJ2Fg#Ep1|=d9M|w!fW5oV;>i%TP^hTsaib(6;4hEZcN2$ zFrR6_&`SxsCo1mSFgrJQOHie&>vo;fT&Nb_cjZgaeEmgmO)84XdnyGbO9gu~ZIKGz z$9K>Kq&=1uc;!$b9$1PW!vQYLR{}vN{93}#7F*-8^t8@_37z3_wt5GJD?lh<%79+o z1w>+}yQO||K+$R&LuI>?C;GK5(*#VZA(u>q=^IUwYP%s}t(7}KRte|a+t{D0LtcW-zmeS?5;OXC;R{v}08gG_rTgZMI+urfDBXO- zmti5GRMOIVN? z(9q-}=qBAwv@#}5T4C$$gzbguA|-8Ym;n!}F;-|I4cr403&1N*(SZHz= zV`w;a=I8u7uvn+^#enS;x9bJ)#uUv`RVmNC)dB>a#m^twJp+ZB*3RsjkGZ*ds*6>7 zQyUj&7{GQG4}vKZLT^2`!ZyXQsmObKH_UlU1z-C}MHwFD@9$5%fNeYyudv2&;+Hkb zjV~@uoG81Jf$a^*?}})H1L;=lDyIl*PKf}xjLwh>kqz3KV-Xe}+Y+@9bogP9wl!*h z{bvCKpVgqYq?A;(-Au90u)ue6I(~g(5|Zw;5DEr!AwOfuOd;cBJK-vOuH6-kMH{fl zNVm^EE)Q`O9TQ`AcIp$q4gCCgAq`tY8FNT}WsQUD@k&FncDZD;p?hm6NS_9y+~9&; zZ_?5hAdYA__1_4o%={DpDO=!de)1AIy(yty`U6eJP!YVkNJm418g>b|vhqLw{BwHU zR9H3d$IQ$ZMs7M`mqo@?+u8OIKe3B`97p@>2_WNH!E4I)@ZGlOfRbFh@TxJSM;~dE zs9zfePR^nbf7rdWm!?suA-9HF_eJ-+VX1NAm?B{pGpz?l96;A>ql#ogEi6A(#TS z$AC|PxkU$)+dtXZ9Zlfu_*O$>1#kA<-!ma40=9bgGVYPu7hO$T>_U5%)$+$iS6eKN zU~iexu*}k#=dNZ)PtS0nuNC$smJAq4Y^?;f){nGBxvj^GdhG#yK+vE)?)n}Wp-*vK zv@%QE3%!_<2si77aDX*cza(aQq|AF$O@w-PtF7cB@4D&rz>zjOOA9TPht9n8T5%NS zU|asaT1OKOEP}9Qrc>`yFz2oMQPo@-;ZadLKkvY>u~gvpB*O_rO;pb6mq(lt3?h~@SOVt|i`p(4$J3IlG6Yf1ej1~ALv z;zadznA5B*+C!t)aiOxJs=$m-sfG%8CjUQDl2tZvHMI(F!d!yg<%P+WUs)l?0B1NH z?hcW!eim}BDzuc9Wrtk@O2GMS`!&$6jY8{6Xb%8?M!}VpopF!Z_J#W@Uv*t;4A!*m z&%XSxD9+tP3P0wuH7n=Q7VxXrb2pS1g+R2XA*hbL+9FQi!zFrozmQH3{*^AsQo=QC z{-mSmUg!kgG43*;)SvTVw=eT5uP1AxeqF`t-{7jPfCOZuPx&0m-^ke6l}LThK27p$;CS>%K36#fa5{ZQ zLM5Z;A`{v}EjnhdFT(|S3%FM3i&w8wY4F+=rteMb`i2Vcw9F-1q<%zs?L^r(5q{?M zYNZSaIysNi*>{=h5s|s1znQ%)gB1S6XYHEt>g?;$x$Hyc0)iQv;eSc~-$iD5;kadUOhJAW^dKhgr zlRV=xq6IE$>~Q|aWj(GlfP$u@6*=+S7cXjl1kfsc++?*lR93dP1)v&soFv2OGw781 zmXt!)N&d>8`&ctuu&(d?Rx=U(`7=G5@XB*ZdYh^mP$%KziDh12EYh}H{V<~TWDm>2 zyK@OmINj`gZ1WgEWGzOMZnCae`F(TcZw54BP|12(d8e%G@6qZN@&0^AlMwNlgUy+r zD`Op~$8g=ABF~5w9I9r{n@+$k79h)?8yH_WD4#(Z?18-9`73LM*|^{Nj*2o7GjjE*b+xUn5X-ROHfhE18ipTWDJTd!;27zuFYy`cKQ@6(>jr@DRe*KDH&$;xm z9DDPUrKRPch%iJ z4|g$ZJihIH8N)It!2Of>E+Y#GfcuUZ0Vi)-&UB1D_)aN4VpnI;6Xy7)3H);F;LL5( zC&Bx8vrVn}8A*uv(azF<6QHo|u@C)x11B?lya2OnBC#z~>2(x8c98xcb`@N$u0r)_ z!61mf4zJD4`0Y4OgE6ulruc1~`%L)!jA_Jp-=6idr$=w9=-ldPrQbob%-wR|K>SRk zTPItZw{eUua~#7(K(JPjb~vk|IfH7?>d(R+{Z3*C9{tzpCM2O3E?w%hn(;AA7Q+>o zsS3=4np2m8UT_1|d)K@vFOHVSc;p4p!y)o!8-B>B{RydkFx@FCd77TveCN$*m1T^_ z%;&781OZN*3EYQ^v3{vsQ$k!5}QWTMvKbG1_3H%z!8gc%{L(4x%g-KOhxT zXe(v=0C??z;4M~0{K)h++T-}g<@at==7K{e*gnZi^=g&oN}~-PF=4bkKMOEE2h$cPH~79Y5tXMCt=_{ba#wDuA@hdSop< z__+_h8e=+KtTX@DMVUmYa-^;GseXm29Gbv@XKtgT;nMj=0n$p@2f#uOcD4%E;0s(1 z#V8G#h|m;1kX1(OZIcI!;Jworz~$4tx8xpbbsfUn>JexB%@+yIBIKL2PZUU|P`; za7324l?4F*UOG!H?~Es&;=V3?2Si9M8?9Pxb!%I=sS-29Kt)Gq5pi!p0ckT$a0ZzT z@BLEZY<9wB@n!va-QSZ};#kyU8k)2mplkq#W8zbmNGCesh79~|Hv24(Cv?6>5P>r$ z4;5(<#;GzhgYR^Abd-O#Z}BIxL(%q7QQl6=Bd&GDkJ)+kCi3_!%-24krLCCBiX8dF zqp~EO^;lvFnr_HeH;uWvoaGcj4*FF<9`_v+BdvAX^sx#7!#vTFLrVqb(N%?I!HBA+-~nsD@XoT!sN_Ixyjc2c%2Oia69TA zP=B&b`s}A*5@xzR?1g#L>S=pY+>-y&0;ZoG7}T%?u#H}y?l#gKs)u9GyG#6TAlvHz zss~S)9xPC=_>He&NOGHMc_s$`E?jM${1&ydHqe%XVH8bz$Y?h<8)s&Sw5h8j2Z53v zK+9t;>x$gJYm~h7dU75=7IaQhy(@wP0s`i<{0H)y*ZNlk?8X;2&3c-=N457$D@lL_ zT|R#N$fS_qY5y`phvL#<`$x(nZw{HryDT8l@!NlP{)v%k-aDw^G^qHYzYmV}W;PD~ ziaT;d1dp$obX|-K0@WLsm&CqERM6Rdl=b-!h1>TvXcS zu*-`e$56RVAo2it{l&jq46iA%87X^Jk64-SJ5GTi_747fSlvT3@^<+;toK)k4oG<( zJq_ZZ7-eE&^04Sl?cRrxC!umzax;Tjtg6C>bzyzK#wh_TV@ebp#ZuV}>(5*S#~ zZOvaW+0o;)#S^`HCpf^H(Z5+0qi$ksYYIdLYD#Aj_MWQg-bblbu4`On|q z*!p%=J=+$AoOfOcp=3NIoPj>u<4DoHPl`#r9a-q?VaFFgsrcOw!Xc%IzV8evgf=eg zh!5}HMS=b-lDhkxk@xrS$vZeOgif1VT|2~MYtZE;ZQU6BH=2{?Ui^gE8x=2PXUfpk_s$7+oe7GaZ}~xdDYZR02E<6 zm}7AobTwF3jy#+WtyURR(e0)1ZDrqz2BDqQemntQ9GQrzA@kha)v zMCLI0dA8El(uxlZk!fGUp&kY&6b!7oO^o97+0HvXmVjEtylTA9!p9eG>@FwYNn^sW z^K|$kt{y1;lB_L~ktbphh6awv9vo7Tw7)#0uAC;O^rsyq!q?>5?0dq@X~*5Vab43| z)A=Vq=zq3+0gYF764DpwTF041t17aBvBEo)cX<1Xh0c#~V<1;4M$G4^6OdOG?s3JT zs!~-wO_RGypnaX*{zVU^rCZaaDR%gVwACR7bQu&@^z3tBa9~)Gm7-D#^yH~)vLi1+ zrK8&{n;%{ zYEjm*SQK2?b@k0eM~T&?bAavN!(+Q1^iF@5X;0*_V3!rs{4o9Ch3vL@w<#cs)aUi1 z*C%nmRDCxCr9=_4Q2o7`h2h>57@K<7oqXM{G=WI+^D_3R&Ra;2Rp~SPP@!f_f}yVt zr$PO!fGr$XEhgaGFj%ak&U%OMW%W4-BI6OK4I=yF&Nry3nIlEE-gy&pnj$Rj{2p1aApBPbbhrMR&#(&4OAAX^)9}4DUwf^PjJHY9}-$6c7t- zq=MZ0NgZ^$OgEyKoX&jqi@3sG!@iVUiwVdo{Z-dp&6Z`tJXPRAYvz-ZCTxRHa0->r=*uZ!5H;YhO z9LwbCx}Ve9_~>yZ@uY(1A(Ndk@JwhT`ycm7vHGNo$Fz}Oi2gJ2`0w!ru+abS;fRC& zJr;It7niEQkPvk;XoKkM*RRymcZhl4NJVoCeXa!qiDCq_k(Yke;n8w*_``1z_}N$( z1fBQo{@y%X)bv!&W&!3kK6Sb&-GW}&S#v^XBeL(Pc;IN-9CnVoR&Of@_-v z3f7k*79wWy^BNKivS{?%t9aI~?D*e*qtYNKWEEDAHNfpsK>h{=bd7*b83vSUc9M?3u19G;D1zROIEO!SE7E2KnRj^N^XDpT+vL^005m ztFK89C3qEAa^2>A6II!ZCxWIBk5C%H9`_$NQY|V^-bybKt<}B`K@GXrNwe)5A2+zG z`WSKNUN^B?>-r#ecI*slzo|hO)I!6mlKRAXp$DbX_B+D4KD?0aZPpgxW+whvcNknTKv zagpImOeT-;^7+n(4A7MIpyi&Vh~1Zn&LM#S8#gYvKj~PBaN>J6LhHwm^A8UI##G)S zf*R)YP@`9c%Ct39=~EuJioATw7o_8^SxdvATl>_L9D?jJp30i3GJO|8=6@Sk4=BkW zxJp~nq%GP{Lq%mIR@HlZ8G=+)6SFF0%w95W%Y=`pW#ck0xtDP+Q`9g!R*=?-XRY}& z@>x*}bQ3|Lfp@r-$g48#e4R-UG46r2mgCNbWG*=`F#~5CrvGp)=S872ZQ}3Q+9fc*oNv0dC?4dQ#EoO(bP*we{3+E0 zT5$G?k3~+t5{dP>BZ}(lRXGFk5cJxlfFLtpFmbS9ET-m9^E&_r5kc(t%YO&R40xZA zonQv}5Qs|plLlgFbxQG6wGKlm|AC-wr15Mp%Bi$69K3&g_PA^7Jx^DwPnm?(g{0lB znU?is*_5>@FuY~f@?CnuiiOiWYPl42l{;5;Yo>DLb0{g~{yp*dUK&%-?c^VmBqtb+ z{QVoLhT!X9;VUZFDaF;-C<9Kd9}NyI9rXO9?%^ke9NwCm$akFaj4EHfoBm6ljDWiU n`NxG#f++c4eKssk4gHBA#1RQRt0J!ad=EKk<>w`mumAZk%&>Hd literal 0 HcmV?d00001 From c45f980140d0d4fa59c29b578a9d0d3bfae8c4cf Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Tue, 21 Apr 2020 17:20:42 -0500 Subject: [PATCH 011/115] Logo contained. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fc610abe3..eba1a2b21 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Mac Dev Playbook Logo +Mac Dev Playbook Logo # Mac Development Ansible Playbook From 7d7453f5417527cea58ffd9febd3754274966a22 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Mon, 28 Sep 2020 13:56:51 -0500 Subject: [PATCH 012/115] Update tests for better Python 3 compatibility. --- .travis.yml | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 597863f03..dc302f6b0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,17 @@ --- sudo: required language: objective-c -# 10.14 (see https://docs.travis-ci.com/user/osx-ci-environment/#OS-X-Version) -osx_image: xcode11.3 + +# Reference for OS X Versions: +# https://docs.travis-ci.com/user/reference/osx/#macos-version +matrix: + include: + # Catalina (10.15) + - os: osx + osx_image: xcode11.4 + # Mojave (10.14) + - os: osx + osx_image: xcode11.3 before_install: # Uninstall existing Homebrew installation. @@ -13,12 +22,17 @@ before_install: - sudo rm -rf /usr/local/Caskroom - sudo rm -rf /usr/local/bin/brew -install: - # Install pip. - - sudo easy_install pip + # Install Python 3. + - curl "https://www.python.org/ftp/python/3.7.9/python-3.7.9-macosx10.9.pkg" -o "python3.pkg" + - sudo installer -pkg python3.pkg -target / + - export PATH=/Library/Frameworks/Python.framework/Versions/3.7/bin:$PATH + # Install pip3. + - curl https://bootstrap.pypa.io/get-pip.py | sudo python3 + +install: # Install Ansible. - - sudo pip install ansible + - sudo -H pip3 install ansible # Add ansible.cfg to pick up roles path. - "{ echo '[defaults]'; echo 'roles_path = ../'; } >> ansible.cfg" From cebc6ce94dcde8b5853884bba7a609477914d831 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Mon, 28 Sep 2020 15:40:43 -0500 Subject: [PATCH 013/115] Fix roles path usage in CI. --- .travis.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index dc302f6b0..a0898759c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,9 +34,6 @@ install: # Install Ansible. - sudo -H pip3 install ansible - # Add ansible.cfg to pick up roles path. - - "{ echo '[defaults]'; echo 'roles_path = ../'; } >> ansible.cfg" - # Add a hosts file. - sudo mkdir -p /etc/ansible - sudo touch /etc/ansible/hosts From 5b15ad988124c7d94617fd736a8e2a9f2df8eed6 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Mon, 28 Sep 2020 17:57:53 -0500 Subject: [PATCH 014/115] Fix SSL: CERTIFICATE_VERIFY_FAILED issue with Galaxy when running tests. --- .travis.yml | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index a0898759c..cf6414302 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,6 +14,19 @@ matrix: osx_image: xcode11.3 before_install: + # Install role dependencies. Do this here, using newer OpenSSL version and a + # virtualenv because older macOS versions will fail with the system version of + # OpenSSL and Python if done later. + - brew upgrade openssl || brew install openssl || true + - brew upgrade python3 || brew install python3 || true + - sudo -H pip3 install -U virtualenv + - virtualenv --python=/usr/local/bin/python3 .venv + - source .venv/bin/activate + - pip3 install ansible + - python -c "import ssl; print(ssl.OPENSSL_VERSION)" + - ansible-galaxy install -r requirements.yml -p ./roles + - deactivate + # Uninstall existing Homebrew installation. - curl -sLO https://raw.githubusercontent.com/Homebrew/install/master/uninstall.sh - chmod +x ./uninstall.sh @@ -40,9 +53,6 @@ install: - "echo -e '[local]\nlocalhost ansible_connection=local' | sudo tee -a /etc/ansible/hosts > /dev/null" script: - # Install dependencies. - - "ansible-galaxy install -r requirements.yml" - # Check the role/playbook's syntax. - "ansible-playbook main.yml --syntax-check" From 2dc641d81b5eb83d28b7763c6cd09c985a7ac9d1 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Mon, 28 Sep 2020 20:20:52 -0500 Subject: [PATCH 015/115] Fixes #33: Don't overwrite sudoers file by default, and use sudoers.d. --- .travis.yml | 8 +++++-- ansible.cfg | 1 + default.config.yml | 8 ++++++- tasks/sudoers.yml | 8 +++---- templates/sudoers.j2 | 53 -------------------------------------------- 5 files changed, 18 insertions(+), 60 deletions(-) delete mode 100644 templates/sudoers.j2 diff --git a/.travis.yml b/.travis.yml index cf6414302..152ecbfda 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,10 @@ sudo: required language: objective-c +env: + global: + - ANSIBLE_FORCE_COLOR=true + # Reference for OS X Versions: # https://docs.travis-ci.com/user/reference/osx/#macos-version matrix: @@ -60,11 +64,11 @@ script: - "cp tests/config.yml config.yml" # Test the playbook. - - "travis_wait 30 ansible-playbook --extra-vars '{\"configure_sudoers\":\"false\"}' main.yml" + - "travis_wait 30 ansible-playbook main.yml" # Test the playbook's idempotence. - idempotence=$(mktemp) - - "ansible-playbook --extra-vars '{\"configure_sudoers\":\"false\"}' main.yml | tee -a ${idempotence}" + - "ansible-playbook main.yml | tee -a ${idempotence}" - > tail ${idempotence} | grep -q 'changed=0.*failed=0' diff --git a/ansible.cfg b/ansible.cfg index e3954851e..d7af23af0 100644 --- a/ansible.cfg +++ b/ansible.cfg @@ -1,4 +1,5 @@ [defaults] +nocows = True roles_path = ./roles:/etc/ansible/roles [ssh_connection] diff --git a/default.config.yml b/default.config.yml index e897ac4c3..f4768e4e8 100644 --- a/default.config.yml +++ b/default.config.yml @@ -2,10 +2,16 @@ downloads: ~/.ansible-downloads/ configure_dotfiles: yes -configure_sudoers: yes configure_terminal: yes configure_osx: yes +configure_sudoers: no +sudoers_custom_config: '' +# Example: +# sudoers_custom_config: | +# # Allow users in admin group to use sudo with no password. +# %admin ALL=(ALL) NOPASSWD: ALL + dotfiles_repo: https://github.com/geerlingguy/dotfiles.git dotfiles_repo_accept_hostkey: yes dotfiles_repo_local_destination: ~/Development/GitHub/dotfiles diff --git a/tasks/sudoers.yml b/tasks/sudoers.yml index 4a39c2010..34894afdb 100644 --- a/tasks/sudoers.yml +++ b/tasks/sudoers.yml @@ -11,11 +11,11 @@ sed_path: "{{ sed_which_result.stdout }}" when: sed_path is undefined -# Sudoers configuration (enables more convenient Vagrant usage). +# Sudoers configuration. - name: Copy sudoers configuration into place. - template: - src: templates/sudoers.j2 - dest: /etc/sudoers + copy: + content: "{{ sudoers_custom_config }}" + dest: /private/etc/sudoers.d/custom mode: 0440 validate: 'visudo -cf %s' become: yes diff --git a/templates/sudoers.j2 b/templates/sudoers.j2 deleted file mode 100644 index ea4be0c18..000000000 --- a/templates/sudoers.j2 +++ /dev/null @@ -1,53 +0,0 @@ -# sudoers file. -# -# This file MUST be edited with the 'visudo' command as root. -# Failure to use 'visudo' may result in syntax or file permission errors -# that prevent sudo from running. -# -# See the sudoers man page for the details on how to write a sudoers file. -# - -# Host alias specification - -# User alias specification - -# Cmnd alias specification - -# Defaults specification -Defaults env_reset -Defaults env_keep += "BLOCKSIZE" -Defaults env_keep += "COLORFGBG COLORTERM" -Defaults env_keep += "__CF_USER_TEXT_ENCODING" -Defaults env_keep += "CHARSET LANG LANGUAGE LC_ALL LC_COLLATE LC_CTYPE" -Defaults env_keep += "LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME" -Defaults env_keep += "LINES COLUMNS" -Defaults env_keep += "LSCOLORS" -Defaults env_keep += "SSH_AUTH_SOCK" -Defaults env_keep += "TZ" -Defaults env_keep += "DISPLAY XAUTHORIZATION XAUTHORITY" -Defaults env_keep += "EDITOR VISUAL" -Defaults env_keep += "HOME MAIL" - -# Runas alias specification - -# User privilege specification -root ALL=(ALL) ALL -%admin ALL=(ALL) ALL - -# Uncomment to allow people in group wheel to run all commands -# %wheel ALL=(ALL) ALL - -# Same thing without a password -# %wheel ALL=(ALL) NOPASSWD: ALL - -# Samples -# %users ALL=/sbin/mount /cdrom,/sbin/umount /cdrom -# %users localhost=/sbin/shutdown -h now - -# Vagrant sudoers config -Cmnd_Alias VAGRANT_EXPORTS_ADD = /usr/bin/tee -a /etc/exports -Cmnd_Alias VAGRANT_NFSD = /sbin/nfsd restart -Cmnd_Alias VAGRANT_EXPORTS_REMOVE = {{ sed_path }} -E -e /*/ d -ibak /etc/exports -Cmnd_Alias VAGRANT_HOSTS_ADD = /bin/sh -c echo "*" >> /etc/hosts -Cmnd_Alias VAGRANT_HOSTS_REMOVE = {{ sed_path }} -i -e /*/ d /etc/hosts -%admin ALL=(root) NOPASSWD: VAGRANT_EXPORTS_ADD, VAGRANT_NFSD, VAGRANT_EXPORTS_REMOVE, VAGRANT_HOSTS_ADD, VAGRANT_HOSTS_REMOVE From 3376c1ae1f83297d4af82920055b94bccf926d37 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Wed, 7 Oct 2020 10:24:40 -0500 Subject: [PATCH 016/115] Fixes #85: Make it easier to use this playbook to manage remote Macs. --- README.md | 26 +++++++++++++++++--------- inventory | 4 ++-- main.yml | 1 - 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index eba1a2b21..79f7ccf42 100644 --- a/README.md +++ b/README.md @@ -6,7 +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 some manual installation steps, but at least it's all documented here. -This is a work in progress, and is mostly a means for me to document my current Mac's setup. I'll be evolving this set of playbooks over time. +This is a work in progress, and is mostly a means for me to document my current Mac's setup. I'll be evolving this playbook over time. *See also*: @@ -21,10 +21,25 @@ This is a work in progress, and is mostly a means for me to document my current 2. [Install Ansible](http://docs.ansible.com/intro_installation.html). 3. Clone this repository to your local drive. 4. Run `$ ansible-galaxy install -r requirements.yml` inside this directory to install required Ansible roles. - 5. Run `ansible-playbook main.yml -i inventory -K` inside this directory. Enter your account password when prompted. + 5. Run `ansible-playbook main.yml -i inventory --ask-become-pass` inside this directory. Enter your account password when prompted. > 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. +### Use with a remote Mac + +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: + + 1. (On the Mac you want to connect to:) Go to System Preferences > Sharing. + 2. Enable 'Remote Login'. + +Then edit the `inventory` file in this repository and change the line that starts with `127.0.0.1` to: + +``` +[ip address or hostname of mac] ansible_user=[mac ssh username] +``` + +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. + ### Running a specific set of tagged tasks 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`. @@ -133,13 +148,6 @@ It's my hope that I can get the rest of these things wrapped up into Ansible pla 6. Set mouse tracking rate. 7. Configure extra Mail and/or Calendar accounts (e.g. Google, Exchange, etc.). -### Applications/packages to be added: - -These are mostly direct download links, some are more difficult to install because of custom installers or other nonstandard install quirks: - - - [iShowU HD](http://www.shinywhitebox.com/downloads/iShowU_HD_2.3.20.dmg) - - [Adobe Creative Cloud](http://www.adobe.com/creativecloud.html) - ### Configuration to be added: - I have vim configuration in the repo, but I still need to add the actual installation: diff --git a/inventory b/inventory index 0dd74f155..5b7201063 100644 --- a/inventory +++ b/inventory @@ -1,2 +1,2 @@ -[localhost] -127.0.0.1 +[all] +127.0.0.1 ansible_connection=local diff --git a/main.yml b/main.yml index 12ef55e9d..8cfc56f16 100644 --- a/main.yml +++ b/main.yml @@ -1,6 +1,5 @@ --- - hosts: all - connection: local vars_files: - default.config.yml From 98c11909e078b25ab2861c0db71228a7e6e46172 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Wed, 7 Oct 2020 11:28:34 -0500 Subject: [PATCH 017/115] Add note about enabling SSH on a Mac via CLI. --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 79f7ccf42..28499a683 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,10 @@ You can use this playbook to manage other Macs as well; the playbook doesn't eve 1. (On the Mac you want to connect to:) Go to System Preferences > Sharing. 2. Enable 'Remote Login'. +> You can also enable remote login on the command line: +> +> sudo systemsetup -setremotelogin on + Then edit the `inventory` file in this repository and change the line that starts with `127.0.0.1` to: ``` From c14f0dd9a328267f610ec324343287dc9ad4ed23 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Mon, 9 Nov 2020 17:04:42 -0600 Subject: [PATCH 018/115] Fix lint issues and dump Travis CI. Try out GitHub Actions instead. --- .github/FUNDING.yml | 2 +- .github/workflows/ci.yml | 77 +++++++++++++++++++++++++++++++++++++ .yamllint | 10 +++++ README.md | 5 ++- default.config.yml | 34 ++++++++-------- tasks/ansible-setup.yml | 2 +- tasks/extra-packages.yml | 4 +- tasks/sudoers.yml | 2 +- tasks/terminal.yml | 2 +- tests/ansible.cfg | 3 ++ tests/config.yml | 1 + tests/inventory | 2 + tests/uninstall-homebrew.sh | 13 +++++++ 13 files changed, 133 insertions(+), 24 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 .yamllint create mode 100644 tests/ansible.cfg create mode 100644 tests/inventory create mode 100755 tests/uninstall-homebrew.sh diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index af7a1e022..96b493831 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,4 +1,4 @@ # These are supported funding model platforms - +--- github: geerlingguy patreon: geerlingguy diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..a86f45862 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,77 @@ +--- +name: CI +'on': + pull_request: + push: + branches: + - master + schedule: + - cron: "0 5 * * 4" + +jobs: + + lint: + name: Lint + runs-on: ubuntu-latest + steps: + - name: Check out the codebase. + uses: actions/checkout@v2 + + - name: Set up Python 3. + uses: actions/setup-python@v2 + with: + python-version: '3.x' + + - name: Install test dependencies. + run: pip3 install yamllint ansible-lint + + - name: Lint code. + run: | + yamllint . + ansible-lint + + integration: + name: Integration + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: + - macos-10.15 + + steps: + - name: Check out the codebase. + uses: actions/checkout@v2 + + - name: Uninstall GitHub Actions' built-in Homebrew. + run: tests/uninstall-homebrew.sh + + - name: Uninstall GitHub Actions' built-in browser installs. + run: | + sudo rm -rf /Applications/Firefox.app + sudo rm -rf /Applications/Google\ Chrome.app + + - name: Install test dependencies. + run: sudo pip3 install ansible + + - name: Set up the test environment. + run: | + cp tests/ansible.cfg ./ansible.cfg + cp tests/inventory ./inventory + cp tests/config.yml ./config.yml + ansible-galaxy install -r requirements.yml -p ./roles + + - name: Test the playbook's syntax. + run: ansible-playbook tests/test.yml --syntax-check + + - name: Test the playbook. + run: ansible-playbook tests/test.yml + env: + ANSIBLE_FORCE_COLOR: '1' + + - name: Idempotence check. + run: | + idempotence=$(mktemp) + ansible-playbook tests/test.yml | tee -a ${idempotence} + tail ${idempotence} | grep -q 'changed=0.*failed=0' && (echo 'Idempotence test: pass' && exit 0) || (echo 'Idempotence test: fail' && exit 1) + env: + ANSIBLE_FORCE_COLOR: '1' diff --git a/.yamllint b/.yamllint new file mode 100644 index 000000000..84ecaec77 --- /dev/null +++ b/.yamllint @@ -0,0 +1,10 @@ +--- +extends: default + +rules: + line-length: + max: 180 + level: warning + +ignore: | + .github/stale.yml diff --git a/README.md b/README.md index 28499a683..b7d6eeab9 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # Mac Development Ansible Playbook -[![Build Status](https://travis-ci.org/geerlingguy/mac-dev-playbook.svg?branch=master)](https://travis-ci.org/geerlingguy/mac-dev-playbook) +[![CI][badge-gh-actions]][link-gh-actions] 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 some manual installation steps, but at least it's all documented here. @@ -177,3 +177,6 @@ Check out [Ansible for DevOps](https://www.ansiblefordevops.com/), which teaches ## Author [Jeff Geerling](https://www.jeffgeerling.com/), 2014 (originally inspired by [MWGriffin/ansible-playbooks](https://github.com/MWGriffin/ansible-playbooks)). + +[badge-gh-actions]: https://github.com/geerlingguy/mac-dev-playbook/workflows/CI/badge.svg?event=push +[link-gh-actions]: https://github.com/geerlingguy/mac-dev-playbook/actions?query=workflow%3ACI diff --git a/default.config.yml b/default.config.yml index f4768e4e8..38ff438a6 100644 --- a/default.config.yml +++ b/default.config.yml @@ -1,11 +1,11 @@ --- downloads: ~/.ansible-downloads/ -configure_dotfiles: yes -configure_terminal: yes -configure_osx: yes +configure_dotfiles: true +configure_terminal: true +configure_osx: true -configure_sudoers: no +configure_sudoers: false sudoers_custom_config: '' # Example: # sudoers_custom_config: | @@ -13,7 +13,7 @@ sudoers_custom_config: '' # %admin ALL=(ALL) NOPASSWD: ALL dotfiles_repo: https://github.com/geerlingguy/dotfiles.git -dotfiles_repo_accept_hostkey: yes +dotfiles_repo_accept_hostkey: true dotfiles_repo_local_destination: ~/Development/GitHub/dotfiles dotfiles_files: - .zshrc @@ -80,21 +80,21 @@ osx_script: "~/.osx --no-restart" # Note: You are responsible for making sure the required package managers are # installed, eg. through homebrew. composer_packages: [] - # - name: drush - # state: present # present/absent, default: present - # version: "^8.1" # default: N/A +# - name: drush +# state: present # present/absent, default: present +# version: "^8.1" # default: N/A gem_packages: [] - # - name: bundler - # state: present # present/absent/latest, default: present - # version: "~> 1.15.1" # default: N/A +# - name: bundler +# state: present # present/absent/latest, default: present +# version: "~> 1.15.1" # default: N/A npm_packages: [] - # - name: webpack - # state: present # present/absent/latest, default: present - # version: "^2.6" # default: N/A +# - name: webpack +# state: present # present/absent/latest, default: present +# version: "^2.6" # default: N/A pip_packages: [] - # - name: mkdocs - # state: present # present/absent/latest, default: present - # version: "0.16.3" # default: N/A +# - name: mkdocs +# state: present # present/absent/latest, default: present +# version: "0.16.3" # default: N/A # Glob pattern to ansible task files to run after all other tasks are finished. post_provision_tasks: [] diff --git a/tasks/ansible-setup.yml b/tasks/ansible-setup.yml index efa950893..d474b4a7e 100644 --- a/tasks/ansible-setup.yml +++ b/tasks/ansible-setup.yml @@ -8,7 +8,7 @@ file: path: /etc/ansible state: directory - become: yes + become: true - name: Symlink /usr/local/etc/ansible to /etc/ansible. file: diff --git a/tasks/extra-packages.yml b/tasks/extra-packages.yml index ee9254c8f..643cd41f1 100644 --- a/tasks/extra-packages.yml +++ b/tasks/extra-packages.yml @@ -12,7 +12,7 @@ name: "{{ item.name | default(item) }}" state: "{{ item.state | default('present') }}" version: "{{ item.version | default(omit) }}" - global: yes + global: true executable: "{{ item.executable | default(omit) }}" with_items: "{{ npm_packages }}" @@ -29,6 +29,6 @@ name: "{{ item.name | default(item) }}" state: "{{ item.state | default('present') }}" version: "{{ item.version | default(omit) }}" - user_install: no + user_install: false executable: "{{ item.executable | default(omit) }}" with_items: "{{ gem_packages }}" diff --git a/tasks/sudoers.yml b/tasks/sudoers.yml index 34894afdb..55cf05c9a 100644 --- a/tasks/sudoers.yml +++ b/tasks/sudoers.yml @@ -18,4 +18,4 @@ dest: /private/etc/sudoers.d/custom mode: 0440 validate: 'visudo -cf %s' - become: yes + become: true diff --git a/tasks/terminal.yml b/tasks/terminal.yml index 278450d78..618faf61d 100644 --- a/tasks/terminal.yml +++ b/tasks/terminal.yml @@ -4,7 +4,7 @@ shell: defaults read com.apple.terminal 'Default Window Settings' register: terminal_theme changed_when: false - check_mode: no + check_mode: false - name: Ensure custom Terminal profile is added. shell: open files/terminal/JJG-Term.terminal diff --git a/tests/ansible.cfg b/tests/ansible.cfg new file mode 100644 index 000000000..6c19e9a7f --- /dev/null +++ b/tests/ansible.cfg @@ -0,0 +1,3 @@ +[defaults] +inventory = inventory +roles_path = ../:../roles:./roles diff --git a/tests/config.yml b/tests/config.yml index fefa4b33c..e95fb9294 100644 --- a/tests/config.yml +++ b/tests/config.yml @@ -1,3 +1,4 @@ +--- homebrew_installed_packages: - autoconf - bash-completion diff --git a/tests/inventory b/tests/inventory new file mode 100644 index 000000000..13cfabe9b --- /dev/null +++ b/tests/inventory @@ -0,0 +1,2 @@ +[local] +localhost ansible_connection=local diff --git a/tests/uninstall-homebrew.sh b/tests/uninstall-homebrew.sh new file mode 100755 index 000000000..d6d4c966c --- /dev/null +++ b/tests/uninstall-homebrew.sh @@ -0,0 +1,13 @@ +#!/bin/bash +# +# Uninstalls Homebrew using the official uninstall script. + +# Download and run the uninstall script. +curl -sLO https://raw.githubusercontent.com/Homebrew/install/master/uninstall.sh +chmod +x ./uninstall.sh +sudo ./uninstall.sh --force + +# Clean up Homebrew directories. +sudo rm -rf /usr/local/Homebrew +sudo rm -rf /usr/local/Caskroom +sudo rm -rf /usr/local/bin/brew From 2c4ba68d34c151d4e7844d7d13d7f0d1d622d40b Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Mon, 9 Nov 2020 17:15:21 -0600 Subject: [PATCH 019/115] Proper path to playbook under test, and delete the Travisfile. --- .github/workflows/ci.yml | 6 ++-- .travis.yml | 76 ---------------------------------------- 2 files changed, 3 insertions(+), 79 deletions(-) delete mode 100644 .travis.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a86f45862..9e5ed9364 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,17 +61,17 @@ jobs: ansible-galaxy install -r requirements.yml -p ./roles - name: Test the playbook's syntax. - run: ansible-playbook tests/test.yml --syntax-check + run: ansible-playbook main.yml --syntax-check - name: Test the playbook. - run: ansible-playbook tests/test.yml + run: ansible-playbook main.yml env: ANSIBLE_FORCE_COLOR: '1' - name: Idempotence check. run: | idempotence=$(mktemp) - ansible-playbook tests/test.yml | tee -a ${idempotence} + ansible-playbook main.yml | tee -a ${idempotence} tail ${idempotence} | grep -q 'changed=0.*failed=0' && (echo 'Idempotence test: pass' && exit 0) || (echo 'Idempotence test: fail' && exit 1) env: ANSIBLE_FORCE_COLOR: '1' diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 152ecbfda..000000000 --- a/.travis.yml +++ /dev/null @@ -1,76 +0,0 @@ ---- -sudo: required -language: objective-c - -env: - global: - - ANSIBLE_FORCE_COLOR=true - -# Reference for OS X Versions: -# https://docs.travis-ci.com/user/reference/osx/#macos-version -matrix: - include: - # Catalina (10.15) - - os: osx - osx_image: xcode11.4 - # Mojave (10.14) - - os: osx - osx_image: xcode11.3 - -before_install: - # Install role dependencies. Do this here, using newer OpenSSL version and a - # virtualenv because older macOS versions will fail with the system version of - # OpenSSL and Python if done later. - - brew upgrade openssl || brew install openssl || true - - brew upgrade python3 || brew install python3 || true - - sudo -H pip3 install -U virtualenv - - virtualenv --python=/usr/local/bin/python3 .venv - - source .venv/bin/activate - - pip3 install ansible - - python -c "import ssl; print(ssl.OPENSSL_VERSION)" - - ansible-galaxy install -r requirements.yml -p ./roles - - deactivate - - # Uninstall existing Homebrew installation. - - curl -sLO https://raw.githubusercontent.com/Homebrew/install/master/uninstall.sh - - chmod +x ./uninstall.sh - - ./uninstall.sh --force - - sudo rm -rf /usr/local/Homebrew - - sudo rm -rf /usr/local/Caskroom - - sudo rm -rf /usr/local/bin/brew - - # Install Python 3. - - curl "https://www.python.org/ftp/python/3.7.9/python-3.7.9-macosx10.9.pkg" -o "python3.pkg" - - sudo installer -pkg python3.pkg -target / - - export PATH=/Library/Frameworks/Python.framework/Versions/3.7/bin:$PATH - - # Install pip3. - - curl https://bootstrap.pypa.io/get-pip.py | sudo python3 - -install: - # Install Ansible. - - sudo -H pip3 install ansible - - # Add a hosts file. - - sudo mkdir -p /etc/ansible - - sudo touch /etc/ansible/hosts - - "echo -e '[local]\nlocalhost ansible_connection=local' | sudo tee -a /etc/ansible/hosts > /dev/null" - -script: - # Check the role/playbook's syntax. - - "ansible-playbook main.yml --syntax-check" - - # Copy test config.yml into place. - - "cp tests/config.yml config.yml" - - # Test the playbook. - - "travis_wait 30 ansible-playbook main.yml" - - # Test the playbook's idempotence. - - idempotence=$(mktemp) - - "ansible-playbook main.yml | tee -a ${idempotence}" - - > - tail ${idempotence} - | grep -q 'changed=0.*failed=0' - && (echo 'Idempotence test: pass' && exit 0) - || (echo 'Idempotence test: fail' && exit 1) From 7382e0241fe27cf17fabe31582af0269551e7004 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Tue, 10 Nov 2020 08:59:10 -0600 Subject: [PATCH 020/115] Update README for Travis CI inclusion removal. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b7d6eeab9..d654c2d06 100644 --- a/README.md +++ b/README.md @@ -168,7 +168,7 @@ It's my hope that I can get the rest of these things wrapped up into Ansible pla 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. -Additionally, this project is [continuously tested on Travis CI's macOS infrastructure](https://travis-ci.org/geerlingguy/mac-dev-playbook). +Additionally, this project is [continuously tested on GitHub Actions' macOS infrastructure](https://github.com/geerlingguy/mac-dev-playbook/actions?query=workflow%3ACI). ## Ansible for DevOps From 3e4eedf0697cd2ed08d77fc80eb1b0a1cd4ee4c8 Mon Sep 17 00:00:00 2001 From: Brian Williams Date: Thu, 11 Feb 2021 10:32:12 -0800 Subject: [PATCH 021/115] Fix Ansible link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d654c2d06..710174bf5 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ This is a work in progress, and is mostly a means for me to document my current ## Installation 1. Ensure Apple's command line tools are installed (`xcode-select --install` to launch the installer). - 2. [Install Ansible](http://docs.ansible.com/intro_installation.html). + 2. [Install Ansible](https://docs.ansible.com/ansible/latest/installation_guide/index.html). 3. Clone this repository to your local drive. 4. Run `$ ansible-galaxy install -r requirements.yml` inside this directory to install required Ansible roles. 5. Run `ansible-playbook main.yml -i inventory --ask-become-pass` inside this directory. Enter your account password when prompted. From 331a403f62d19ff672f5259f843dfeac6920c79c Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Thu, 18 Feb 2021 09:00:54 -0600 Subject: [PATCH 022/115] Add missing ansible dependency in lint workflow. --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9e5ed9364..a6e84f1e1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,7 @@ jobs: python-version: '3.x' - name: Install test dependencies. - run: pip3 install yamllint ansible-lint + run: pip3 install yamllint ansible ansible-lint - name: Lint code. run: | From 9bd4b41a2eb7e54ab07249fc102e845b305f1eb7 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Thu, 18 Feb 2021 10:26:12 -0600 Subject: [PATCH 023/115] Fixes #91: Use updated requirements file format to fix lint error. --- .ansible-lint | 3 +++ main.yml | 3 ++- requirements.yml | 7 ++++--- tasks/osx.yml | 2 +- tasks/terminal.yml | 6 +++--- 5 files changed, 13 insertions(+), 8 deletions(-) create mode 100644 .ansible-lint diff --git a/.ansible-lint b/.ansible-lint new file mode 100644 index 000000000..539d3332f --- /dev/null +++ b/.ansible-lint @@ -0,0 +1,3 @@ +--- +skip_list: + - experimental diff --git a/main.yml b/main.yml index 8cfc56f16..b35b077bd 100644 --- a/main.yml +++ b/main.yml @@ -5,7 +5,8 @@ - default.config.yml pre_tasks: - - include_vars: "{{ item }}" + - name: Include playbook configuration. + include_vars: "{{ item }}" with_fileglob: - "{{ playbook_dir }}/config.yml" tags: ['always'] diff --git a/requirements.yml b/requirements.yml index a64b14976..859e6952a 100644 --- a/requirements.yml +++ b/requirements.yml @@ -1,4 +1,5 @@ --- -- name: geerlingguy.dotfiles -- name: geerlingguy.homebrew -- name: geerlingguy.mas +roles: + - name: geerlingguy.dotfiles + - name: geerlingguy.homebrew + - name: geerlingguy.mas diff --git a/tasks/osx.yml b/tasks/osx.yml index b952d90db..ec12cd524 100644 --- a/tasks/osx.yml +++ b/tasks/osx.yml @@ -1,5 +1,5 @@ --- # TODO: Use sudo once .osx can be run via root with no user interaction. - name: Run .osx dotfiles. - shell: "{{ osx_script }}" + command: "{{ osx_script }}" changed_when: false diff --git a/tasks/terminal.yml b/tasks/terminal.yml index 618faf61d..3807ab63c 100644 --- a/tasks/terminal.yml +++ b/tasks/terminal.yml @@ -1,19 +1,19 @@ --- # Custom Terminal theme. - name: Get current Terminal profile. - shell: defaults read com.apple.terminal 'Default Window Settings' + command: defaults read com.apple.terminal 'Default Window Settings' register: terminal_theme changed_when: false check_mode: false - name: Ensure custom Terminal profile is added. - shell: open files/terminal/JJG-Term.terminal + command: open files/terminal/JJG-Term.terminal changed_when: false when: "'JJG-Term' not in terminal_theme.stdout" # TODO: This doesn't work in Yosemite. Consider a different solution? - name: Ensure custom Terminal profile is set as default. - shell: "{{ item }}" + command: "{{ item }}" with_items: - defaults write com.apple.terminal 'Default Window Settings' -string JJG-Term - defaults write com.apple.terminal 'Startup Window Settings' -string JJG-Term From 33bc08e267756d45518a4dde5aedf17780ebf8aa Mon Sep 17 00:00:00 2001 From: Elisiano Petrini Date: Thu, 4 Mar 2021 14:58:05 -0500 Subject: [PATCH 024/115] Changes the default behavior of ssh pipelining to false. This seems reasonable since in most cases this playbook is ran locally Fixes #93 --- ansible.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ansible.cfg b/ansible.cfg index d7af23af0..2ad8ee9b2 100644 --- a/ansible.cfg +++ b/ansible.cfg @@ -3,5 +3,5 @@ nocows = True roles_path = ./roles:/etc/ansible/roles [ssh_connection] -pipelining = True +pipelining = False control_path = /tmp/ansible-ssh-%%h-%%p-%%r From d7991d5f23436ebb7397842c733727d99c1e9c28 Mon Sep 17 00:00:00 2001 From: Elisiano Petrini Date: Thu, 4 Mar 2021 15:21:42 -0500 Subject: [PATCH 025/115] Removing ssh section completely --- ansible.cfg | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ansible.cfg b/ansible.cfg index 2ad8ee9b2..1b00cf9af 100644 --- a/ansible.cfg +++ b/ansible.cfg @@ -1,7 +1,3 @@ [defaults] nocows = True roles_path = ./roles:/etc/ansible/roles - -[ssh_connection] -pipelining = False -control_path = /tmp/ansible-ssh-%%h-%%p-%%r From 8dca2dc8f30b4caa396d737600b7a12d66b44a15 Mon Sep 17 00:00:00 2001 From: dspolleke Date: Tue, 6 Apr 2021 23:38:56 +0200 Subject: [PATCH 026/115] fix issue 101 installing the geerlingguy dotfiles will result in a failing zsh (no history search and an errormessage when opening the shell) --- default.config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/default.config.yml b/default.config.yml index 38ff438a6..8293cc714 100644 --- a/default.config.yml +++ b/default.config.yml @@ -49,6 +49,7 @@ homebrew_installed_packages: - pv - wget - wrk + - zsh-history-substring-search homebrew_taps: - homebrew/core From 01c1e0d2a17f05fa29a0040baa3bb5e5f0165c63 Mon Sep 17 00:00:00 2001 From: Paul van Noort Date: Wed, 7 Apr 2021 13:26:28 +0200 Subject: [PATCH 027/115] dingen --- ansible.cfg | 2 ++ default.config.yml | 10 +++--- inventory | 3 +- main.yml | 8 +++++ requirements.yml | 2 ++ tasks/extra-packages.yml | 70 +++++++++++++++++++++------------------- tasks/terminal.yml | 13 ++++++-- 7 files changed, 66 insertions(+), 42 deletions(-) diff --git a/ansible.cfg b/ansible.cfg index 1b00cf9af..40799929a 100644 --- a/ansible.cfg +++ b/ansible.cfg @@ -1,3 +1,5 @@ [defaults] nocows = True roles_path = ./roles:/etc/ansible/roles +inventory = inventory +become = true diff --git a/default.config.yml b/default.config.yml index 38ff438a6..c19b0018d 100644 --- a/default.config.yml +++ b/default.config.yml @@ -2,7 +2,7 @@ downloads: ~/.ansible-downloads/ configure_dotfiles: true -configure_terminal: true +configure_terminal: false configure_osx: true configure_sudoers: false @@ -12,7 +12,7 @@ sudoers_custom_config: '' # # Allow users in admin group to use sudo with no password. # %admin ALL=(ALL) NOPASSWD: ALL -dotfiles_repo: https://github.com/geerlingguy/dotfiles.git +dotfiles_repo: https://github.com/dspolleke/dotfiles.git dotfiles_repo_accept_hostkey: true dotfiles_repo_local_destination: ~/Development/GitHub/dotfiles dotfiles_files: @@ -83,15 +83,15 @@ composer_packages: [] # - name: drush # state: present # present/absent, default: present # version: "^8.1" # default: N/A -gem_packages: [] -# - name: bundler +gem_packages: + - name: showoff # state: present # present/absent/latest, default: present # version: "~> 1.15.1" # default: N/A npm_packages: [] # - name: webpack # state: present # present/absent/latest, default: present # version: "^2.6" # default: N/A -pip_packages: [] +#pip_packages: [] # - name: mkdocs # state: present # present/absent/latest, default: present # version: "0.16.3" # default: N/A diff --git a/inventory b/inventory index 5b7201063..f296d736c 100644 --- a/inventory +++ b/inventory @@ -1,2 +1,3 @@ [all] -127.0.0.1 ansible_connection=local +#127.0.0.1 ansible_connection=local +192.168.2.49 diff --git a/main.yml b/main.yml index b35b077bd..57648c750 100644 --- a/main.yml +++ b/main.yml @@ -36,6 +36,14 @@ - include_tasks: tasks/extra-packages.yml tags: ['extra-packages'] + - name: Install global Ruby gems. + gem: + name: "{{ item.name | default(item) }}" + state: "{{ item.state | default('present') }}" + version: "{{ item.version | default(omit) }}" + user_install: false + executable: "{{ item.executable | default(omit) }}" + loop: "{{ gem_packages }}" - name: Run configured post-provision ansible task files. include_tasks: "{{ outer_item }}" diff --git a/requirements.yml b/requirements.yml index 859e6952a..c8046cad9 100644 --- a/requirements.yml +++ b/requirements.yml @@ -3,3 +3,5 @@ roles: - name: geerlingguy.dotfiles - name: geerlingguy.homebrew - name: geerlingguy.mas +collections: + - name: community.general diff --git a/tasks/extra-packages.yml b/tasks/extra-packages.yml index 643cd41f1..94928e9ad 100644 --- a/tasks/extra-packages.yml +++ b/tasks/extra-packages.yml @@ -1,34 +1,38 @@ --- -- name: Install global Composer packages. - composer: - command: "{{ (item.state | default('present') == 'absent') | ternary('remove', 'require') }}" - arguments: "{{ item.name | default(item) }} {{ item.version | default('@stable') }}" - # Ansible 2.4 supports `global_command` making `working_dir` optional. - working_dir: "{{ lookup('env', 'COMPOSER_HOME') | default('~/.composer', true) }}" - with_items: "{{ composer_packages }}" - -- name: Install global NPM packages. - npm: - name: "{{ item.name | default(item) }}" - state: "{{ item.state | default('present') }}" - version: "{{ item.version | default(omit) }}" - global: true - executable: "{{ item.executable | default(omit) }}" - with_items: "{{ npm_packages }}" - -- name: Install global Pip packages. - pip: - name: "{{ item.name | default(item) }}" - state: "{{ item.state | default('present') }}" - version: "{{ item.version | default(omit) }}" - executable: "{{ item.executable | default(omit) }}" - with_items: "{{ pip_packages }}" - -- name: Install global Ruby gems. - gem: - name: "{{ item.name | default(item) }}" - state: "{{ item.state | default('present') }}" - version: "{{ item.version | default(omit) }}" - user_install: false - executable: "{{ item.executable | default(omit) }}" - with_items: "{{ gem_packages }}" +- name: Ensure extra packages are installed + block: + - name: Install global Composer packages. + composer: + command: "{{ (item.state | default('present') == 'absent') | ternary('remove', 'require') }}" + arguments: "{{ item.name | default(item) }} {{ item.version | default('@stable') }}" + # Ansible 2.4 supports `global_command` making `working_dir` optional. + working_dir: "{{ lookup('env', 'COMPOSER_HOME') | default('~/.composer', true) }}" + loop: "{{ composer_packages }}" + + - name: Install global NPM packages. + ansible.builtin.npm: + name: "{{ item.name | default(item) }}" + state: "{{ item.state | default('present') }}" + version: "{{ item.version | default(omit) }}" + global: true + executable: "{{ item.executable | default(omit) }}" + loop: "{{ npm_packages }}" + + - name: Install global Pip packages. + ansible.builtin.pip: + name: "{{ item.name | default(item) }}" + state: "{{ item.state | default('present') }}" + version: "{{ item.version | default(omit) }}" + executable: "{{ pip_executable | default(omit) }}" + loop: "{{ pip_packages }}" + + - name: Install global Ruby gems. + ansible.builtin.gem: + name: "{{ item.name | default(item) }}" + state: "{{ item.state | default('present') }}" + version: "{{ item.version | default(omit) }}" + user_install: false + install_dir: "{{ gem_dir }}" + executable: "{{ gem_executable | default(omit) }}" + loop: "{{ gem_packages }}" + tags: ['extra-packages'] diff --git a/tasks/terminal.yml b/tasks/terminal.yml index 3807ab63c..5ffa752e9 100644 --- a/tasks/terminal.yml +++ b/tasks/terminal.yml @@ -6,9 +6,16 @@ changed_when: false check_mode: false -- name: Ensure custom Terminal profile is added. - command: open files/terminal/JJG-Term.terminal - changed_when: false +- name: ensure JJG-Term + block: + - name: transfer the file + copy: + src: files/terminal/JJG-Term.terminal + dest: /tmp/JJG-Term.terminal + + - name: Ensure custom Terminal profile is added. + command: open /tmp/JJG-Term.terminal + changed_when: false when: "'JJG-Term' not in terminal_theme.stdout" # TODO: This doesn't work in Yosemite. Consider a different solution? From ecaea525e06cea84609a027d2e2032ec85aa6b43 Mon Sep 17 00:00:00 2001 From: Paul van Noort Date: Wed, 7 Apr 2021 13:27:34 +0200 Subject: [PATCH 028/115] bootstrap --- bootstrap.sh | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 bootstrap.sh diff --git a/bootstrap.sh b/bootstrap.sh new file mode 100644 index 000000000..4c2b67f53 --- /dev/null +++ b/bootstrap.sh @@ -0,0 +1,31 @@ +#!/bin/bash +alias python=python3 +pyenv install --list | grep -Ev '[abc-]' | tail -1 +python -V 2>&1 | awk '/Python/{ split($2, a, "."); print a[1]"."a[2] }' + +if curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py ; +then +python get-pip.py +fi + +export PATH="$HOME/Library/Python/${pyver}/bin/:$PATH" +python -m pip install --user ansible + +xcode-select --install > /dev/null 2>&1 +if [ "$?" == '0' ]; then + sleep 1 + osascript < Date: Wed, 7 Apr 2021 19:18:39 +0200 Subject: [PATCH 029/115] dock --- default.config.yml | 1 + tasks/dock.yml | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 tasks/dock.yml diff --git a/default.config.yml b/default.config.yml index c19b0018d..a3972e3bd 100644 --- a/default.config.yml +++ b/default.config.yml @@ -4,6 +4,7 @@ downloads: ~/.ansible-downloads/ configure_dotfiles: true configure_terminal: false configure_osx: true +configure_dock: [] configure_sudoers: false sudoers_custom_config: '' diff --git a/tasks/dock.yml b/tasks/dock.yml new file mode 100644 index 000000000..bfcd4c755 --- /dev/null +++ b/tasks/dock.yml @@ -0,0 +1,20 @@ +--- +- name: Install dockutil + homebrew: + name: dockutil + state: present + notify: + - Clear homebrew cache + +- name: Remove all crap from Dock + shell: dockutil --remove '{{ item }}' + ignore_errors: true + with_items: "{{ dockitems_to_remove }}" + +- name: Check if items in dock exist + shell: dockutil --find '{{ item.name }}' || dockutil --add '{{ item.path }}' + with_items: "{{ dockitems_to_persist }}" + +- name: Fix order + shell: dockutil --move '{{ item.name }}' --position '{{ item.pos }}' + with_items: "{{ dockitems_to_persist }}" From 70f0de3ac6dea8cb4cc3bd11d2ffb67e0458bd2e Mon Sep 17 00:00:00 2001 From: dspolleke Date: Sun, 11 Apr 2021 19:57:38 +0200 Subject: [PATCH 030/115] fix tags issue 97 --- tasks/extra-packages.yml | 69 +++++++++++++++++++++------------------- tasks/osx.yml | 1 + 2 files changed, 37 insertions(+), 33 deletions(-) diff --git a/tasks/extra-packages.yml b/tasks/extra-packages.yml index 643cd41f1..9d283c242 100644 --- a/tasks/extra-packages.yml +++ b/tasks/extra-packages.yml @@ -1,34 +1,37 @@ --- -- name: Install global Composer packages. - composer: - command: "{{ (item.state | default('present') == 'absent') | ternary('remove', 'require') }}" - arguments: "{{ item.name | default(item) }} {{ item.version | default('@stable') }}" - # Ansible 2.4 supports `global_command` making `working_dir` optional. - working_dir: "{{ lookup('env', 'COMPOSER_HOME') | default('~/.composer', true) }}" - with_items: "{{ composer_packages }}" - -- name: Install global NPM packages. - npm: - name: "{{ item.name | default(item) }}" - state: "{{ item.state | default('present') }}" - version: "{{ item.version | default(omit) }}" - global: true - executable: "{{ item.executable | default(omit) }}" - with_items: "{{ npm_packages }}" - -- name: Install global Pip packages. - pip: - name: "{{ item.name | default(item) }}" - state: "{{ item.state | default('present') }}" - version: "{{ item.version | default(omit) }}" - executable: "{{ item.executable | default(omit) }}" - with_items: "{{ pip_packages }}" - -- name: Install global Ruby gems. - gem: - name: "{{ item.name | default(item) }}" - state: "{{ item.state | default('present') }}" - version: "{{ item.version | default(omit) }}" - user_install: false - executable: "{{ item.executable | default(omit) }}" - with_items: "{{ gem_packages }}" +- name: Ensure extra packages + block: + - name: Install global Composer packages. + composer: + command: "{{ (item.state | default('present') == 'absent') | ternary('remove', 'require') }}" + arguments: "{{ item.name | default(item) }} {{ item.version | default('@stable') }}" + # Ansible 2.4 supports `global_command` making `working_dir` optional. + working_dir: "{{ lookup('env', 'COMPOSER_HOME') | default('~/.composer', true) }}" + loop: "{{ composer_packages }}" + + - name: Install global NPM packages. + npm: + name: "{{ item.name | default(item) }}" + state: "{{ item.state | default('present') }}" + version: "{{ item.version | default(omit) }}" + global: true + executable: "{{ item.executable | default(omit) }}" + loop: "{{ npm_packages }}" + + - name: Install global Pip packages. + pip: + name: "{{ item.name | default(item) }}" + state: "{{ item.state | default('present') }}" + version: "{{ item.version | default(omit) }}" + executable: "{{ item.executable | default(omit) }}" + loop: "{{ pip_packages }}" + + - name: Install global Ruby gems. + gem: + name: "{{ item.name | default(item) }}" + state: "{{ item.state | default('present') }}" + version: "{{ item.version | default(omit) }}" + user_install: false + executable: "{{ item.executable | default(omit) }}" + loop: "{{ gem_packages }}" + tags: ['extra-packages'] diff --git a/tasks/osx.yml b/tasks/osx.yml index ec12cd524..c6c5b45d0 100644 --- a/tasks/osx.yml +++ b/tasks/osx.yml @@ -3,3 +3,4 @@ - name: Run .osx dotfiles. command: "{{ osx_script }}" changed_when: false + tags: ['osx'] From be8b356174ca6d6c200cb408c00acd99e33023a4 Mon Sep 17 00:00:00 2001 From: dspolleke Date: Sun, 11 Apr 2021 20:16:05 +0200 Subject: [PATCH 031/115] trailing spaces --- tasks/extra-packages.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tasks/extra-packages.yml b/tasks/extra-packages.yml index 9d283c242..d55f78a80 100644 --- a/tasks/extra-packages.yml +++ b/tasks/extra-packages.yml @@ -8,7 +8,7 @@ # Ansible 2.4 supports `global_command` making `working_dir` optional. working_dir: "{{ lookup('env', 'COMPOSER_HOME') | default('~/.composer', true) }}" loop: "{{ composer_packages }}" - + - name: Install global NPM packages. npm: name: "{{ item.name | default(item) }}" @@ -17,7 +17,7 @@ global: true executable: "{{ item.executable | default(omit) }}" loop: "{{ npm_packages }}" - + - name: Install global Pip packages. pip: name: "{{ item.name | default(item) }}" @@ -25,7 +25,7 @@ version: "{{ item.version | default(omit) }}" executable: "{{ item.executable | default(omit) }}" loop: "{{ pip_packages }}" - + - name: Install global Ruby gems. gem: name: "{{ item.name | default(item) }}" From 4dc3e75de2268c9e3779e6ab9dc1aca4dbb3ae71 Mon Sep 17 00:00:00 2001 From: dspolleke Date: Sun, 11 Apr 2021 20:44:58 +0200 Subject: [PATCH 032/115] dock util from https://github.com/enlewof \n Fixed default value for variable, \ncreated block (for tags to work), \nFixed some strong language, \N fixed some shell / command preference (ansible-lint) --- default.config.yml | 2 ++ main.yml | 4 ++++ tasks/dock.yml | 23 +++++++++++++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 tasks/dock.yml diff --git a/default.config.yml b/default.config.yml index 8293cc714..82effb6b9 100644 --- a/default.config.yml +++ b/default.config.yml @@ -5,6 +5,8 @@ configure_dotfiles: true configure_terminal: true configure_osx: true +configure_dock: [] + configure_sudoers: false sudoers_custom_config: '' # Example: diff --git a/main.yml b/main.yml index b35b077bd..75521fcb6 100644 --- a/main.yml +++ b/main.yml @@ -37,6 +37,10 @@ - include_tasks: tasks/extra-packages.yml tags: ['extra-packages'] + - include_tasks: tasks/dock.yml + when: configure_dock + tags: ['dock'] + - name: Run configured post-provision ansible task files. include_tasks: "{{ outer_item }}" loop_control: diff --git a/tasks/dock.yml b/tasks/dock.yml new file mode 100644 index 000000000..51c3a260a --- /dev/null +++ b/tasks/dock.yml @@ -0,0 +1,23 @@ +--- +- name: ensure dock items + block: + - name: Install dockutil + homebrew: + name: dockutil + state: present + notify: + - Clear homebrew cache + + - name: Ensure unwanted dock items removed. + command: dockutil --remove '{{ item }}' + ignore_errors: true + loop: "{{ dockitems_to_remove }}" + + - name: Ensure required dock items exist. + shell: dockutil --find '{{ item.name }}' || dockutil --add '{{ item.path }}' + loop: "{{ dockitems_to_persist }}" + + - name: Ensure correct dock order + command: dockutil --move '{{ item.name }}' --position '{{ item.pos }}' + loop: "{{ dockitems_to_persist }}" + tags: ['dock'] From 299c9b7b69ee9373dc105ef845f8497e8276bee2 Mon Sep 17 00:00:00 2001 From: dspolleke Date: Mon, 12 Apr 2021 13:29:34 +0200 Subject: [PATCH 033/115] working dockutil --- ansible.cfg | 2 ++ default.config.yml | 25 +++++++++++++++++++++++-- tasks/adddock.yml | 13 +++++++++++++ tasks/dock.yml | 17 ++++++++++------- tasks/remdock.yml | 14 ++++++++++++++ 5 files changed, 62 insertions(+), 9 deletions(-) create mode 100644 tasks/adddock.yml create mode 100644 tasks/remdock.yml diff --git a/ansible.cfg b/ansible.cfg index 1b00cf9af..a6e277cbe 100644 --- a/ansible.cfg +++ b/ansible.cfg @@ -1,3 +1,5 @@ [defaults] nocows = True roles_path = ./roles:/etc/ansible/roles +stdout_callback = yaml + diff --git a/default.config.yml b/default.config.yml index 82effb6b9..29ca56c67 100644 --- a/default.config.yml +++ b/default.config.yml @@ -5,8 +5,29 @@ configure_dotfiles: true configure_terminal: true configure_osx: true -configure_dock: [] - +configure_dock: True +dockitems_to_remove: + - Launchpad + - Safari + - Messages + - Mail + - Maps + - Photos + - FaceTime + - Calendar + - Contacts + - Reminders + - Notes + - TV + - Music + - Podcasts + - 'App Store' +remove_spacers: true +dockitems_to_persist: + - name: iTerm + path: "/Applications/iTerm.app/" + - name: "Google Chrome" + path: "/Applications/Google Chrome.app/" configure_sudoers: false sudoers_custom_config: '' # Example: diff --git a/tasks/adddock.yml b/tasks/adddock.yml new file mode 100644 index 000000000..40568aa92 --- /dev/null +++ b/tasks/adddock.yml @@ -0,0 +1,13 @@ +--- +- name: find if dock {{ item }} exists + ansible.builtin.command: + cmd: dockutil --find '{{ item.name }}' + register: dockitem_exists + failed_when: '"No such file or directory" in dockitem_exists.stdout' + changed_when: false + tags: ['dock'] +- name: Ensure dock {{ item }} exists + ansible.builtin.command: + cmd: dockutil --add '{{ item.path }}' + when: dockitem_exists.rc >0 + tags: ['dock'] diff --git a/tasks/dock.yml b/tasks/dock.yml index 51c3a260a..627738d23 100644 --- a/tasks/dock.yml +++ b/tasks/dock.yml @@ -7,17 +7,20 @@ state: present notify: - Clear homebrew cache - - - name: Ensure unwanted dock items removed. - command: dockutil --remove '{{ item }}' - ignore_errors: true + - name: remove dockitems + ansible.builtin.include_tasks: tasks/remdock.yml loop: "{{ dockitems_to_remove }}" - name: Ensure required dock items exist. - shell: dockutil --find '{{ item.name }}' || dockutil --add '{{ item.path }}' - loop: "{{ dockitems_to_persist }}" + ansible.builtin.include_tasks: tasks/adddock.yml + with_items: "{{ dockitems_to_persist }}" - name: Ensure correct dock order - command: dockutil --move '{{ item.name }}' --position '{{ item.pos }}' + ansible.builtin.command: + cmd: dockutil --move '{{ item.name }}' --position '{{ item.pos }}' + when: + - item.pos is defined + - item.pos length >0 loop: "{{ dockitems_to_persist }}" + tags: ['dock'] diff --git a/tasks/remdock.yml b/tasks/remdock.yml new file mode 100644 index 000000000..777a00d13 --- /dev/null +++ b/tasks/remdock.yml @@ -0,0 +1,14 @@ +--- +- name: find if dock item exists + ansible.builtin.command: + cmd: dockutil --find '{{ item }}' + register: dockitem_exists + changed_when: false + failed_when: '"No such file or directory" in dockitem_exists.stdout' + tags: ['dock'] +- name: Ensure unwanted dock items removed. + ansible.builtin.command: + cmd: dockutil --remove '{{ item }}' + when: dockitem_exists.rc == 0 + tags: ['dock'] + From 82979a7b302dabe903ab4fd83f39a610a172e716 Mon Sep 17 00:00:00 2001 From: dspolleke Date: Mon, 12 Apr 2021 13:49:12 +0200 Subject: [PATCH 034/115] yamllinter --- default.config.yml | 10 +++++----- tasks/dock.yml | 2 +- tasks/remdock.yml | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/default.config.yml b/default.config.yml index 29ca56c67..394f00f5e 100644 --- a/default.config.yml +++ b/default.config.yml @@ -5,7 +5,7 @@ configure_dotfiles: true configure_terminal: true configure_osx: true -configure_dock: True +configure_dock: true dockitems_to_remove: - Launchpad - Safari @@ -24,10 +24,10 @@ dockitems_to_remove: - 'App Store' remove_spacers: true dockitems_to_persist: - - name: iTerm - path: "/Applications/iTerm.app/" - - name: "Google Chrome" - path: "/Applications/Google Chrome.app/" + - name: iTerm + path: "/Applications/iTerm.app/" + - name: "Google Chrome" + path: "/Applications/Google Chrome.app/" configure_sudoers: false sudoers_custom_config: '' # Example: diff --git a/tasks/dock.yml b/tasks/dock.yml index 627738d23..20cebd036 100644 --- a/tasks/dock.yml +++ b/tasks/dock.yml @@ -16,7 +16,7 @@ with_items: "{{ dockitems_to_persist }}" - name: Ensure correct dock order - ansible.builtin.command: + ansible.builtin.command: cmd: dockutil --move '{{ item.name }}' --position '{{ item.pos }}' when: - item.pos is defined diff --git a/tasks/remdock.yml b/tasks/remdock.yml index 777a00d13..c22bd0d35 100644 --- a/tasks/remdock.yml +++ b/tasks/remdock.yml @@ -6,9 +6,9 @@ changed_when: false failed_when: '"No such file or directory" in dockitem_exists.stdout' tags: ['dock'] + - name: Ensure unwanted dock items removed. ansible.builtin.command: cmd: dockutil --remove '{{ item }}' when: dockitem_exists.rc == 0 tags: ['dock'] - From eae5de681ff1f6865156ab3b1d5df6ee2c870226 Mon Sep 17 00:00:00 2001 From: dspolleke Date: Mon, 12 Apr 2021 15:15:57 +0200 Subject: [PATCH 035/115] fix terminal to run with remote tasks as well --- main.yml | 3 ++- tasks/terminal.yml | 9 ++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/main.yml b/main.yml index 75521fcb6..18c2517fe 100644 --- a/main.yml +++ b/main.yml @@ -27,8 +27,9 @@ - include_tasks: tasks/sudoers.yml when: configure_sudoers - - include_tasks: tasks/terminal.yml + - import_tasks: tasks/terminal.yml when: configure_terminal + tags: ['terminal'] - include_tasks: tasks/osx.yml when: configure_osx diff --git a/tasks/terminal.yml b/tasks/terminal.yml index 3807ab63c..528aec42e 100644 --- a/tasks/terminal.yml +++ b/tasks/terminal.yml @@ -7,7 +7,14 @@ check_mode: false - name: Ensure custom Terminal profile is added. - command: open files/terminal/JJG-Term.terminal + ansible.builtin.copy: + src: files/terminal/JJG-Term.terminal + dest: /tmp/JJG-Term.terminal + changed_when: false + when: "'JJG-Term' not in terminal_theme.stdout" + +- name: Ensure custom Terminal profile is added. + command: open /tmp/JJG-Term.terminal changed_when: false when: "'JJG-Term' not in terminal_theme.stdout" From 6549a14014711db8e8554178897dca5028114e77 Mon Sep 17 00:00:00 2001 From: dspolleke Date: Mon, 12 Apr 2021 17:37:55 +0200 Subject: [PATCH 036/115] requested changes --- default.config.yml | 42 ++++++++++++++++++++++-------------------- main.yml | 2 +- tasks/dock.yml | 42 +++++++++++++++++++----------------------- 3 files changed, 42 insertions(+), 44 deletions(-) diff --git a/default.config.yml b/default.config.yml index 394f00f5e..1d9011751 100644 --- a/default.config.yml +++ b/default.config.yml @@ -5,29 +5,31 @@ configure_dotfiles: true configure_terminal: true configure_osx: true -configure_dock: true -dockitems_to_remove: - - Launchpad - - Safari - - Messages - - Mail - - Maps - - Photos - - FaceTime - - Calendar - - Contacts - - Reminders - - Notes - - TV - - Music - - Podcasts - - 'App Store' -remove_spacers: true +configure_dock: false +dockitems_to_remove: [] +# Example: to remove all / some items added by default on Big Sur uncomment use example below +# dockitems_to_remove: +# - Launchpad +# - Safari +# - Messages +# - Mail +# - Maps +# - Photos +# - FaceTime +# - Calendar +# - Contacts +# - Reminders +# - Notes +# - TV +# - Music +# - Podcasts +# - 'App Store' + dockitems_to_persist: - - name: iTerm - path: "/Applications/iTerm.app/" - name: "Google Chrome" path: "/Applications/Google Chrome.app/" + - name: "Sublime Text" + path: "/Applications/Sublime Text.app/" configure_sudoers: false sudoers_custom_config: '' # Example: diff --git a/main.yml b/main.yml index 75521fcb6..15a253c0e 100644 --- a/main.yml +++ b/main.yml @@ -37,7 +37,7 @@ - include_tasks: tasks/extra-packages.yml tags: ['extra-packages'] - - include_tasks: tasks/dock.yml + - import_tasks: tasks/dock.yml when: configure_dock tags: ['dock'] diff --git a/tasks/dock.yml b/tasks/dock.yml index 20cebd036..c617e46ef 100644 --- a/tasks/dock.yml +++ b/tasks/dock.yml @@ -1,26 +1,22 @@ --- -- name: ensure dock items - block: - - name: Install dockutil - homebrew: - name: dockutil - state: present - notify: - - Clear homebrew cache - - name: remove dockitems - ansible.builtin.include_tasks: tasks/remdock.yml - loop: "{{ dockitems_to_remove }}" +- name: Install dockutil + homebrew: + name: dockutil + state: present + notify: + - Clear homebrew cache +- name: remove dockitems + ansible.builtin.include_tasks: tasks/remdock.yml + loop: "{{ dockitems_to_remove }}" - - name: Ensure required dock items exist. - ansible.builtin.include_tasks: tasks/adddock.yml - with_items: "{{ dockitems_to_persist }}" +- name: Ensure required dock items exist. + ansible.builtin.include_tasks: tasks/adddock.yml + with_items: "{{ dockitems_to_persist }}" - - name: Ensure correct dock order - ansible.builtin.command: - cmd: dockutil --move '{{ item.name }}' --position '{{ item.pos }}' - when: - - item.pos is defined - - item.pos length >0 - loop: "{{ dockitems_to_persist }}" - - tags: ['dock'] +- name: Ensure correct dock order + ansible.builtin.command: + cmd: dockutil --move '{{ item.name }}' --position '{{ item.pos }}' + when: + - item.pos is defined + - item.pos length >0 + loop: "{{ dockitems_to_persist }}" From 34cc100e7c5f92af0ecf238b3d9d04f150dda60c Mon Sep 17 00:00:00 2001 From: dspolleke Date: Mon, 12 Apr 2021 17:43:47 +0200 Subject: [PATCH 037/115] fixed it the way GG wants it fixed --- main.yml | 16 ++++++---- tasks/extra-packages.yml | 63 +++++++++++++++++++--------------------- 2 files changed, 40 insertions(+), 39 deletions(-) diff --git a/main.yml b/main.yml index b35b077bd..6296dc2d3 100644 --- a/main.yml +++ b/main.yml @@ -22,23 +22,27 @@ tags: ['mas'] tasks: - - include_tasks: tasks/ansible-setup.yml + - import_tasks: tasks/ansible-setup.yml + tags: ['setup'] - - include_tasks: tasks/sudoers.yml + - import_tasks: tasks/sudoers.yml when: configure_sudoers + tags: ['sudoers'] - - include_tasks: tasks/terminal.yml + - import_tasks: tasks/terminal.yml when: configure_terminal + tags: ['terminal'] - - include_tasks: tasks/osx.yml + - import_tasks: tasks/osx.yml when: configure_osx tags: ['osx'] - - include_tasks: tasks/extra-packages.yml + - import_tasks: tasks/extra-packages.yml tags: ['extra-packages'] - name: Run configured post-provision ansible task files. - include_tasks: "{{ outer_item }}" + import_tasks: "{{ outer_item }}" loop_control: loop_var: outer_item with_fileglob: "{{ post_provision_tasks|default(omit) }}" + tags: ['post'] diff --git a/tasks/extra-packages.yml b/tasks/extra-packages.yml index d55f78a80..677148ba9 100644 --- a/tasks/extra-packages.yml +++ b/tasks/extra-packages.yml @@ -1,37 +1,34 @@ --- -- name: Ensure extra packages - block: - - name: Install global Composer packages. - composer: - command: "{{ (item.state | default('present') == 'absent') | ternary('remove', 'require') }}" - arguments: "{{ item.name | default(item) }} {{ item.version | default('@stable') }}" - # Ansible 2.4 supports `global_command` making `working_dir` optional. - working_dir: "{{ lookup('env', 'COMPOSER_HOME') | default('~/.composer', true) }}" - loop: "{{ composer_packages }}" +- name: Install global Composer packages. + composer: + command: "{{ (item.state | default('present') == 'absent') | ternary('remove', 'require') }}" + arguments: "{{ item.name | default(item) }} {{ item.version | default('@stable') }}" + # Ansible 2.4 supports `global_command` making `working_dir` optional. + working_dir: "{{ lookup('env', 'COMPOSER_HOME') | default('~/.composer', true) }}" + loop: "{{ composer_packages }}" - - name: Install global NPM packages. - npm: - name: "{{ item.name | default(item) }}" - state: "{{ item.state | default('present') }}" - version: "{{ item.version | default(omit) }}" - global: true - executable: "{{ item.executable | default(omit) }}" - loop: "{{ npm_packages }}" +- name: Install global NPM packages. + npm: + name: "{{ item.name | default(item) }}" + state: "{{ item.state | default('present') }}" + version: "{{ item.version | default(omit) }}" + global: true + executable: "{{ item.executable | default(omit) }}" + loop: "{{ npm_packages }}" - - name: Install global Pip packages. - pip: - name: "{{ item.name | default(item) }}" - state: "{{ item.state | default('present') }}" - version: "{{ item.version | default(omit) }}" - executable: "{{ item.executable | default(omit) }}" - loop: "{{ pip_packages }}" +- name: Install global Pip packages. + pip: + name: "{{ item.name | default(item) }}" + state: "{{ item.state | default('present') }}" + version: "{{ item.version | default(omit) }}" + executable: "{{ item.executable | default(omit) }}" + loop: "{{ pip_packages }}" - - name: Install global Ruby gems. - gem: - name: "{{ item.name | default(item) }}" - state: "{{ item.state | default('present') }}" - version: "{{ item.version | default(omit) }}" - user_install: false - executable: "{{ item.executable | default(omit) }}" - loop: "{{ gem_packages }}" - tags: ['extra-packages'] +- name: Install global Ruby gems. + gem: + name: "{{ item.name | default(item) }}" + state: "{{ item.state | default('present') }}" + version: "{{ item.version | default(omit) }}" + user_install: false + executable: "{{ item.executable | default(omit) }}" + loop: "{{ gem_packages }}" From 5ecb26666df736a124efa736c44f6ceaf5e6f473 Mon Sep 17 00:00:00 2001 From: dspolleke Date: Mon, 12 Apr 2021 17:44:54 +0200 Subject: [PATCH 038/115] alien changes ;-) --- tasks/extra-packages.yml | 63 +++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 33 deletions(-) diff --git a/tasks/extra-packages.yml b/tasks/extra-packages.yml index d55f78a80..677148ba9 100644 --- a/tasks/extra-packages.yml +++ b/tasks/extra-packages.yml @@ -1,37 +1,34 @@ --- -- name: Ensure extra packages - block: - - name: Install global Composer packages. - composer: - command: "{{ (item.state | default('present') == 'absent') | ternary('remove', 'require') }}" - arguments: "{{ item.name | default(item) }} {{ item.version | default('@stable') }}" - # Ansible 2.4 supports `global_command` making `working_dir` optional. - working_dir: "{{ lookup('env', 'COMPOSER_HOME') | default('~/.composer', true) }}" - loop: "{{ composer_packages }}" +- name: Install global Composer packages. + composer: + command: "{{ (item.state | default('present') == 'absent') | ternary('remove', 'require') }}" + arguments: "{{ item.name | default(item) }} {{ item.version | default('@stable') }}" + # Ansible 2.4 supports `global_command` making `working_dir` optional. + working_dir: "{{ lookup('env', 'COMPOSER_HOME') | default('~/.composer', true) }}" + loop: "{{ composer_packages }}" - - name: Install global NPM packages. - npm: - name: "{{ item.name | default(item) }}" - state: "{{ item.state | default('present') }}" - version: "{{ item.version | default(omit) }}" - global: true - executable: "{{ item.executable | default(omit) }}" - loop: "{{ npm_packages }}" +- name: Install global NPM packages. + npm: + name: "{{ item.name | default(item) }}" + state: "{{ item.state | default('present') }}" + version: "{{ item.version | default(omit) }}" + global: true + executable: "{{ item.executable | default(omit) }}" + loop: "{{ npm_packages }}" - - name: Install global Pip packages. - pip: - name: "{{ item.name | default(item) }}" - state: "{{ item.state | default('present') }}" - version: "{{ item.version | default(omit) }}" - executable: "{{ item.executable | default(omit) }}" - loop: "{{ pip_packages }}" +- name: Install global Pip packages. + pip: + name: "{{ item.name | default(item) }}" + state: "{{ item.state | default('present') }}" + version: "{{ item.version | default(omit) }}" + executable: "{{ item.executable | default(omit) }}" + loop: "{{ pip_packages }}" - - name: Install global Ruby gems. - gem: - name: "{{ item.name | default(item) }}" - state: "{{ item.state | default('present') }}" - version: "{{ item.version | default(omit) }}" - user_install: false - executable: "{{ item.executable | default(omit) }}" - loop: "{{ gem_packages }}" - tags: ['extra-packages'] +- name: Install global Ruby gems. + gem: + name: "{{ item.name | default(item) }}" + state: "{{ item.state | default('present') }}" + version: "{{ item.version | default(omit) }}" + user_install: false + executable: "{{ item.executable | default(omit) }}" + loop: "{{ gem_packages }}" From 8e9b8de4cfc0dd49c4182c838580acdb31045775 Mon Sep 17 00:00:00 2001 From: dspolleke Date: Mon, 12 Apr 2021 18:56:21 +0200 Subject: [PATCH 039/115] conditionals are hard --- default.config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/default.config.yml b/default.config.yml index 1d9011751..e60291722 100644 --- a/default.config.yml +++ b/default.config.yml @@ -5,7 +5,7 @@ configure_dotfiles: true configure_terminal: true configure_osx: true -configure_dock: false +configure_dock: [] dockitems_to_remove: [] # Example: to remove all / some items added by default on Big Sur uncomment use example below # dockitems_to_remove: From beac53608e85b3bc1880ebb1f91ce78c59280525 Mon Sep 17 00:00:00 2001 From: dspolleke Date: Mon, 12 Apr 2021 19:13:23 +0200 Subject: [PATCH 040/115] imclude_tasks are sometimes useful --- main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.yml b/main.yml index 6296dc2d3..caf41f832 100644 --- a/main.yml +++ b/main.yml @@ -41,7 +41,7 @@ tags: ['extra-packages'] - name: Run configured post-provision ansible task files. - import_tasks: "{{ outer_item }}" + include_tasks: "{{ outer_item }}" loop_control: loop_var: outer_item with_fileglob: "{{ post_provision_tasks|default(omit) }}" From 7d351f718f64315b7d367ea1ee270a8801dbb69c Mon Sep 17 00:00:00 2001 From: dspolleke Date: Mon, 12 Apr 2021 20:00:00 +0200 Subject: [PATCH 041/115] edited Readme to reflect work allready done. Removed some work obviously already done. I am working on the vim stuff and sublime stuff. Did you allready put the mouse tracking in de .osx file? do you know of any way to configure the mentioned accounts on the cli? --- README.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 710174bf5..a7126e4d5 100644 --- a/README.md +++ b/README.md @@ -144,13 +144,11 @@ Finally, there are a few other preferences and settings added on for various app 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). - 1. Set JJG-Term as the default Terminal theme (it's installed, but not set as default automatically). - 2. Install [Sublime Package Manager](http://sublime.wbond.net/installation). - 3. Install all the apps that aren't yet in this setup (see below). - 4. Remap Caps Lock to Escape (requires macOS Sierra 10.12.1+). - 5. Set trackpad tracking rate. - 6. Set mouse tracking rate. - 7. Configure extra Mail and/or Calendar accounts (e.g. Google, Exchange, etc.). + 1. Install [Sublime Package Manager](http://sublime.wbond.net/installation). + 2. Remap Caps Lock to Escape (requires macOS Sierra 10.12.1+). + 3. Set trackpad tracking rate. + 4. Set mouse tracking rate. + 5. Configure extra Mail and/or Calendar accounts (e.g. Google, Exchange, etc.). ### Configuration to be added: From f9f2d54e8c85d9a2a6789fdf5be8d3e006de7418 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Fri, 7 May 2021 10:26:27 -0500 Subject: [PATCH 042/115] PR #106 follow-up: More consistent docs and examples. --- README.md | 4 +++ ansible.cfg | 1 - default.config.yml | 34 ++++++++------------------ main.yml | 10 ++++---- tasks/adddock.yml | 13 ---------- tasks/dock-add.yml | 12 +++++++++ tasks/{remdock.yml => dock-remove.yml} | 0 tasks/dock.yml | 17 +++++++------ tasks/osx.yml | 1 - 9 files changed, 40 insertions(+), 52 deletions(-) delete mode 100644 tasks/adddock.yml create mode 100644 tasks/dock-add.yml rename tasks/{remdock.yml => dock-remove.yml} (100%) diff --git a/README.md b/README.md index a7126e4d5..a2276e789 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,10 @@ You can override any of the defaults configured in `default.config.yml` by creat pip_packages: - name: mkdocs + + configure_dock: true + dockitems_remove: [] + dockitems_persist: [] Any variable can be overridden in `config.yml`; see the supporting roles' documentation for a complete list of available variables. diff --git a/ansible.cfg b/ansible.cfg index a6e277cbe..a823e997f 100644 --- a/ansible.cfg +++ b/ansible.cfg @@ -2,4 +2,3 @@ nocows = True roles_path = ./roles:/etc/ansible/roles stdout_callback = yaml - diff --git a/default.config.yml b/default.config.yml index e60291722..b62bdfc9e 100644 --- a/default.config.yml +++ b/default.config.yml @@ -5,31 +5,17 @@ configure_dotfiles: true configure_terminal: true configure_osx: true -configure_dock: [] -dockitems_to_remove: [] -# Example: to remove all / some items added by default on Big Sur uncomment use example below -# dockitems_to_remove: -# - Launchpad -# - Safari -# - Messages -# - Mail -# - Maps -# - Photos -# - FaceTime -# - Calendar -# - Contacts -# - Reminders -# - Notes -# - TV -# - Music -# - Podcasts -# - 'App Store' +# Set to 'true' to configure the Dock via dockutil. +configure_dock: false +dockitems_remove: [] +# - Launchpad +# - TV +# - Podcasts +# - 'App Store' +dockitems_persist: [] +# - name: "Sublime Text" +# path: "/Applications/Sublime Text.app/" -dockitems_to_persist: - - name: "Google Chrome" - path: "/Applications/Google Chrome.app/" - - name: "Sublime Text" - path: "/Applications/Sublime Text.app/" configure_sudoers: false sudoers_custom_config: '' # Example: diff --git a/main.yml b/main.yml index 15a253c0e..9b6f8da2d 100644 --- a/main.yml +++ b/main.yml @@ -22,19 +22,19 @@ tags: ['mas'] tasks: - - include_tasks: tasks/ansible-setup.yml + - import_tasks: tasks/ansible-setup.yml - - include_tasks: tasks/sudoers.yml + - import_tasks: tasks/sudoers.yml when: configure_sudoers - - include_tasks: tasks/terminal.yml + - import_tasks: tasks/terminal.yml when: configure_terminal - - include_tasks: tasks/osx.yml + - import_tasks: tasks/osx.yml when: configure_osx tags: ['osx'] - - include_tasks: tasks/extra-packages.yml + - import_tasks: tasks/extra-packages.yml tags: ['extra-packages'] - import_tasks: tasks/dock.yml diff --git a/tasks/adddock.yml b/tasks/adddock.yml deleted file mode 100644 index 40568aa92..000000000 --- a/tasks/adddock.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- -- name: find if dock {{ item }} exists - ansible.builtin.command: - cmd: dockutil --find '{{ item.name }}' - register: dockitem_exists - failed_when: '"No such file or directory" in dockitem_exists.stdout' - changed_when: false - tags: ['dock'] -- name: Ensure dock {{ item }} exists - ansible.builtin.command: - cmd: dockutil --add '{{ item.path }}' - when: dockitem_exists.rc >0 - tags: ['dock'] diff --git a/tasks/dock-add.yml b/tasks/dock-add.yml new file mode 100644 index 000000000..fe9c843ab --- /dev/null +++ b/tasks/dock-add.yml @@ -0,0 +1,12 @@ +--- +- name: See if Dock item {{ item }} exists. + ansible.builtin.command: "dockutil --find '{{ item.name }}'" + register: dockitem_exists + failed_when: '"No such file or directory" in dockitem_exists.stdout' + changed_when: false + tags: ['dock'] + +- name: Ensure Dock item {{ item }} exists. + ansible.builtin.command: "dockutil --add '{{ item.path }}'" + when: dockitem_exists.rc >0 + tags: ['dock'] diff --git a/tasks/remdock.yml b/tasks/dock-remove.yml similarity index 100% rename from tasks/remdock.yml rename to tasks/dock-remove.yml diff --git a/tasks/dock.yml b/tasks/dock.yml index c617e46ef..d1130ee5c 100644 --- a/tasks/dock.yml +++ b/tasks/dock.yml @@ -1,22 +1,23 @@ --- -- name: Install dockutil +- name: Install dockutil. homebrew: name: dockutil state: present notify: - Clear homebrew cache -- name: remove dockitems - ansible.builtin.include_tasks: tasks/remdock.yml - loop: "{{ dockitems_to_remove }}" + +- name: Remove configured Dock items. + ansible.builtin.include_tasks: tasks/dock-remove.yml + loop: "{{ dockitems_remove }}" - name: Ensure required dock items exist. - ansible.builtin.include_tasks: tasks/adddock.yml - with_items: "{{ dockitems_to_persist }}" + ansible.builtin.include_tasks: tasks/dock-add.yml + loop: "{{ dockitems_persist }}" -- name: Ensure correct dock order +- name: Ensure correct Dock order. ansible.builtin.command: cmd: dockutil --move '{{ item.name }}' --position '{{ item.pos }}' when: - item.pos is defined - item.pos length >0 - loop: "{{ dockitems_to_persist }}" + loop: "{{ dockitems_persist }}" diff --git a/tasks/osx.yml b/tasks/osx.yml index c6c5b45d0..ec12cd524 100644 --- a/tasks/osx.yml +++ b/tasks/osx.yml @@ -3,4 +3,3 @@ - name: Run .osx dotfiles. command: "{{ osx_script }}" changed_when: false - tags: ['osx'] From bfea2dd85781858cb78980c2442e1b560309938d Mon Sep 17 00:00:00 2001 From: dspolleke Date: Mon, 12 Apr 2021 15:15:57 +0200 Subject: [PATCH 043/115] fix terminal to run with remote tasks as well --- tasks/terminal.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tasks/terminal.yml b/tasks/terminal.yml index 3807ab63c..528aec42e 100644 --- a/tasks/terminal.yml +++ b/tasks/terminal.yml @@ -7,7 +7,14 @@ check_mode: false - name: Ensure custom Terminal profile is added. - command: open files/terminal/JJG-Term.terminal + ansible.builtin.copy: + src: files/terminal/JJG-Term.terminal + dest: /tmp/JJG-Term.terminal + changed_when: false + when: "'JJG-Term' not in terminal_theme.stdout" + +- name: Ensure custom Terminal profile is added. + command: open /tmp/JJG-Term.terminal changed_when: false when: "'JJG-Term' not in terminal_theme.stdout" From 87dd16f677077090d4e6df6caf5b52c6849773ec Mon Sep 17 00:00:00 2001 From: dspolleke Date: Sun, 11 Apr 2021 19:57:38 +0200 Subject: [PATCH 044/115] fix tags issue 97 --- tasks/extra-packages.yml | 8 ++++---- tasks/osx.yml | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/tasks/extra-packages.yml b/tasks/extra-packages.yml index 94928e9ad..066fcb28e 100644 --- a/tasks/extra-packages.yml +++ b/tasks/extra-packages.yml @@ -1,6 +1,6 @@ --- - name: Ensure extra packages are installed - block: + block: - name: Install global Composer packages. composer: command: "{{ (item.state | default('present') == 'absent') | ternary('remove', 'require') }}" @@ -8,7 +8,7 @@ # Ansible 2.4 supports `global_command` making `working_dir` optional. working_dir: "{{ lookup('env', 'COMPOSER_HOME') | default('~/.composer', true) }}" loop: "{{ composer_packages }}" - + - name: Install global NPM packages. ansible.builtin.npm: name: "{{ item.name | default(item) }}" @@ -17,7 +17,7 @@ global: true executable: "{{ item.executable | default(omit) }}" loop: "{{ npm_packages }}" - + - name: Install global Pip packages. ansible.builtin.pip: name: "{{ item.name | default(item) }}" @@ -25,7 +25,7 @@ version: "{{ item.version | default(omit) }}" executable: "{{ pip_executable | default(omit) }}" loop: "{{ pip_packages }}" - + - name: Install global Ruby gems. ansible.builtin.gem: name: "{{ item.name | default(item) }}" diff --git a/tasks/osx.yml b/tasks/osx.yml index ec12cd524..c6c5b45d0 100644 --- a/tasks/osx.yml +++ b/tasks/osx.yml @@ -3,3 +3,4 @@ - name: Run .osx dotfiles. command: "{{ osx_script }}" changed_when: false + tags: ['osx'] From 5f77296043464e56233f9d34c0ec8990e636f8e3 Mon Sep 17 00:00:00 2001 From: dspolleke Date: Mon, 12 Apr 2021 17:43:47 +0200 Subject: [PATCH 045/115] fixed it the way GG wants it fixed --- main.yml | 16 ++++++---- tasks/extra-packages.yml | 64 +++++++++++++++++++--------------------- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/main.yml b/main.yml index 57648c750..d02eb5ea7 100644 --- a/main.yml +++ b/main.yml @@ -22,19 +22,22 @@ tags: ['mas'] tasks: - - include_tasks: tasks/ansible-setup.yml + - import_tasks: tasks/ansible-setup.yml + tags: ['setup'] - - include_tasks: tasks/sudoers.yml + - import_tasks: tasks/sudoers.yml when: configure_sudoers + tags: ['sudoers'] - - include_tasks: tasks/terminal.yml + - import_tasks: tasks/terminal.yml when: configure_terminal + tags: ['terminal'] - - include_tasks: tasks/osx.yml + - import_tasks: tasks/osx.yml when: configure_osx tags: ['osx'] - - include_tasks: tasks/extra-packages.yml + - import_tasks: tasks/extra-packages.yml tags: ['extra-packages'] - name: Install global Ruby gems. gem: @@ -46,7 +49,8 @@ loop: "{{ gem_packages }}" - name: Run configured post-provision ansible task files. - include_tasks: "{{ outer_item }}" + import_tasks: "{{ outer_item }}" loop_control: loop_var: outer_item with_fileglob: "{{ post_provision_tasks|default(omit) }}" + tags: ['post'] diff --git a/tasks/extra-packages.yml b/tasks/extra-packages.yml index 066fcb28e..677148ba9 100644 --- a/tasks/extra-packages.yml +++ b/tasks/extra-packages.yml @@ -1,38 +1,34 @@ --- -- name: Ensure extra packages are installed - block: - - name: Install global Composer packages. - composer: - command: "{{ (item.state | default('present') == 'absent') | ternary('remove', 'require') }}" - arguments: "{{ item.name | default(item) }} {{ item.version | default('@stable') }}" - # Ansible 2.4 supports `global_command` making `working_dir` optional. - working_dir: "{{ lookup('env', 'COMPOSER_HOME') | default('~/.composer', true) }}" - loop: "{{ composer_packages }}" +- name: Install global Composer packages. + composer: + command: "{{ (item.state | default('present') == 'absent') | ternary('remove', 'require') }}" + arguments: "{{ item.name | default(item) }} {{ item.version | default('@stable') }}" + # Ansible 2.4 supports `global_command` making `working_dir` optional. + working_dir: "{{ lookup('env', 'COMPOSER_HOME') | default('~/.composer', true) }}" + loop: "{{ composer_packages }}" - - name: Install global NPM packages. - ansible.builtin.npm: - name: "{{ item.name | default(item) }}" - state: "{{ item.state | default('present') }}" - version: "{{ item.version | default(omit) }}" - global: true - executable: "{{ item.executable | default(omit) }}" - loop: "{{ npm_packages }}" +- name: Install global NPM packages. + npm: + name: "{{ item.name | default(item) }}" + state: "{{ item.state | default('present') }}" + version: "{{ item.version | default(omit) }}" + global: true + executable: "{{ item.executable | default(omit) }}" + loop: "{{ npm_packages }}" - - name: Install global Pip packages. - ansible.builtin.pip: - name: "{{ item.name | default(item) }}" - state: "{{ item.state | default('present') }}" - version: "{{ item.version | default(omit) }}" - executable: "{{ pip_executable | default(omit) }}" - loop: "{{ pip_packages }}" +- name: Install global Pip packages. + pip: + name: "{{ item.name | default(item) }}" + state: "{{ item.state | default('present') }}" + version: "{{ item.version | default(omit) }}" + executable: "{{ item.executable | default(omit) }}" + loop: "{{ pip_packages }}" - - name: Install global Ruby gems. - ansible.builtin.gem: - name: "{{ item.name | default(item) }}" - state: "{{ item.state | default('present') }}" - version: "{{ item.version | default(omit) }}" - user_install: false - install_dir: "{{ gem_dir }}" - executable: "{{ gem_executable | default(omit) }}" - loop: "{{ gem_packages }}" - tags: ['extra-packages'] +- name: Install global Ruby gems. + gem: + name: "{{ item.name | default(item) }}" + state: "{{ item.state | default('present') }}" + version: "{{ item.version | default(omit) }}" + user_install: false + executable: "{{ item.executable | default(omit) }}" + loop: "{{ gem_packages }}" From e50edb3d969ffea3c356549946e4bf0779785e79 Mon Sep 17 00:00:00 2001 From: dspolleke Date: Mon, 12 Apr 2021 19:13:23 +0200 Subject: [PATCH 046/115] imclude_tasks are sometimes useful --- main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.yml b/main.yml index d02eb5ea7..5895c7681 100644 --- a/main.yml +++ b/main.yml @@ -49,7 +49,7 @@ loop: "{{ gem_packages }}" - name: Run configured post-provision ansible task files. - import_tasks: "{{ outer_item }}" + include_tasks: "{{ outer_item }}" loop_control: loop_var: outer_item with_fileglob: "{{ post_provision_tasks|default(omit) }}" From 874d83e3b84c66384fd7efcd977c84b2b3f40c0e Mon Sep 17 00:00:00 2001 From: dspolleke Date: Mon, 12 Apr 2021 20:00:00 +0200 Subject: [PATCH 047/115] edited Readme to reflect work allready done. Removed some work obviously already done. I am working on the vim stuff and sublime stuff. Did you allready put the mouse tracking in de .osx file? do you know of any way to configure the mentioned accounts on the cli? --- README.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 710174bf5..a7126e4d5 100644 --- a/README.md +++ b/README.md @@ -144,13 +144,11 @@ Finally, there are a few other preferences and settings added on for various app 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). - 1. Set JJG-Term as the default Terminal theme (it's installed, but not set as default automatically). - 2. Install [Sublime Package Manager](http://sublime.wbond.net/installation). - 3. Install all the apps that aren't yet in this setup (see below). - 4. Remap Caps Lock to Escape (requires macOS Sierra 10.12.1+). - 5. Set trackpad tracking rate. - 6. Set mouse tracking rate. - 7. Configure extra Mail and/or Calendar accounts (e.g. Google, Exchange, etc.). + 1. Install [Sublime Package Manager](http://sublime.wbond.net/installation). + 2. Remap Caps Lock to Escape (requires macOS Sierra 10.12.1+). + 3. Set trackpad tracking rate. + 4. Set mouse tracking rate. + 5. Configure extra Mail and/or Calendar accounts (e.g. Google, Exchange, etc.). ### Configuration to be added: From baae72b63e818341cee017dd3a2fa349c810fa18 Mon Sep 17 00:00:00 2001 From: dspolleke Date: Sun, 11 Apr 2021 20:44:58 +0200 Subject: [PATCH 048/115] dock util from https://github.com/enlewof \n Fixed default value for variable, \ncreated block (for tags to work), \nFixed some strong language, \N fixed some shell / command preference (ansible-lint) --- default.config.yml | 2 ++ main.yml | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/default.config.yml b/default.config.yml index d80faaab2..d4ce800f2 100644 --- a/default.config.yml +++ b/default.config.yml @@ -6,6 +6,8 @@ configure_terminal: false configure_osx: true configure_dock: [] +configure_dock: [] + configure_sudoers: false sudoers_custom_config: '' # Example: diff --git a/main.yml b/main.yml index 5895c7681..c00d8dbc6 100644 --- a/main.yml +++ b/main.yml @@ -48,6 +48,10 @@ executable: "{{ item.executable | default(omit) }}" loop: "{{ gem_packages }}" + - include_tasks: tasks/dock.yml + when: configure_dock + tags: ['dock'] + - name: Run configured post-provision ansible task files. include_tasks: "{{ outer_item }}" loop_control: From 2574bb295283fa1f64a9ef4a721cf46f4353fb54 Mon Sep 17 00:00:00 2001 From: dspolleke Date: Mon, 12 Apr 2021 13:29:34 +0200 Subject: [PATCH 049/115] working dockutil --- ansible.cfg | 1 + default.config.yml | 25 +++++++++++++++++++++++-- tasks/adddock.yml | 13 +++++++++++++ tasks/dock.yml | 38 ++++++++++++++++++++++---------------- tasks/remdock.yml | 14 ++++++++++++++ 5 files changed, 73 insertions(+), 18 deletions(-) create mode 100644 tasks/adddock.yml create mode 100644 tasks/remdock.yml diff --git a/ansible.cfg b/ansible.cfg index 40799929a..532d6335d 100644 --- a/ansible.cfg +++ b/ansible.cfg @@ -3,3 +3,4 @@ nocows = True roles_path = ./roles:/etc/ansible/roles inventory = inventory become = true +stdout_callback = yaml diff --git a/default.config.yml b/default.config.yml index d4ce800f2..151b39597 100644 --- a/default.config.yml +++ b/default.config.yml @@ -6,8 +6,29 @@ configure_terminal: false configure_osx: true configure_dock: [] -configure_dock: [] - +configure_dock: True +dockitems_to_remove: + - Launchpad + - Safari + - Messages + - Mail + - Maps + - Photos + - FaceTime + - Calendar + - Contacts + - Reminders + - Notes + - TV + - Music + - Podcasts + - 'App Store' +remove_spacers: true +dockitems_to_persist: + - name: iTerm + path: "/Applications/iTerm.app/" + - name: "Google Chrome" + path: "/Applications/Google Chrome.app/" configure_sudoers: false sudoers_custom_config: '' # Example: diff --git a/tasks/adddock.yml b/tasks/adddock.yml new file mode 100644 index 000000000..40568aa92 --- /dev/null +++ b/tasks/adddock.yml @@ -0,0 +1,13 @@ +--- +- name: find if dock {{ item }} exists + ansible.builtin.command: + cmd: dockutil --find '{{ item.name }}' + register: dockitem_exists + failed_when: '"No such file or directory" in dockitem_exists.stdout' + changed_when: false + tags: ['dock'] +- name: Ensure dock {{ item }} exists + ansible.builtin.command: + cmd: dockutil --add '{{ item.path }}' + when: dockitem_exists.rc >0 + tags: ['dock'] diff --git a/tasks/dock.yml b/tasks/dock.yml index bfcd4c755..20cebd036 100644 --- a/tasks/dock.yml +++ b/tasks/dock.yml @@ -1,20 +1,26 @@ --- -- name: Install dockutil - homebrew: - name: dockutil - state: present - notify: - - Clear homebrew cache +- name: ensure dock items + block: + - name: Install dockutil + homebrew: + name: dockutil + state: present + notify: + - Clear homebrew cache + - name: remove dockitems + ansible.builtin.include_tasks: tasks/remdock.yml + loop: "{{ dockitems_to_remove }}" -- name: Remove all crap from Dock - shell: dockutil --remove '{{ item }}' - ignore_errors: true - with_items: "{{ dockitems_to_remove }}" + - name: Ensure required dock items exist. + ansible.builtin.include_tasks: tasks/adddock.yml + with_items: "{{ dockitems_to_persist }}" -- name: Check if items in dock exist - shell: dockutil --find '{{ item.name }}' || dockutil --add '{{ item.path }}' - with_items: "{{ dockitems_to_persist }}" + - name: Ensure correct dock order + ansible.builtin.command: + cmd: dockutil --move '{{ item.name }}' --position '{{ item.pos }}' + when: + - item.pos is defined + - item.pos length >0 + loop: "{{ dockitems_to_persist }}" -- name: Fix order - shell: dockutil --move '{{ item.name }}' --position '{{ item.pos }}' - with_items: "{{ dockitems_to_persist }}" + tags: ['dock'] diff --git a/tasks/remdock.yml b/tasks/remdock.yml new file mode 100644 index 000000000..777a00d13 --- /dev/null +++ b/tasks/remdock.yml @@ -0,0 +1,14 @@ +--- +- name: find if dock item exists + ansible.builtin.command: + cmd: dockutil --find '{{ item }}' + register: dockitem_exists + changed_when: false + failed_when: '"No such file or directory" in dockitem_exists.stdout' + tags: ['dock'] +- name: Ensure unwanted dock items removed. + ansible.builtin.command: + cmd: dockutil --remove '{{ item }}' + when: dockitem_exists.rc == 0 + tags: ['dock'] + From 63659ca41ebcbe1ba82f3dd42f39d21c58933cb1 Mon Sep 17 00:00:00 2001 From: dspolleke Date: Mon, 12 Apr 2021 13:49:12 +0200 Subject: [PATCH 050/115] yamllinter --- default.config.yml | 10 +++++----- tasks/remdock.yml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/default.config.yml b/default.config.yml index 151b39597..f5430f9ff 100644 --- a/default.config.yml +++ b/default.config.yml @@ -6,7 +6,7 @@ configure_terminal: false configure_osx: true configure_dock: [] -configure_dock: True +configure_dock: true dockitems_to_remove: - Launchpad - Safari @@ -25,10 +25,10 @@ dockitems_to_remove: - 'App Store' remove_spacers: true dockitems_to_persist: - - name: iTerm - path: "/Applications/iTerm.app/" - - name: "Google Chrome" - path: "/Applications/Google Chrome.app/" + - name: iTerm + path: "/Applications/iTerm.app/" + - name: "Google Chrome" + path: "/Applications/Google Chrome.app/" configure_sudoers: false sudoers_custom_config: '' # Example: diff --git a/tasks/remdock.yml b/tasks/remdock.yml index 777a00d13..c22bd0d35 100644 --- a/tasks/remdock.yml +++ b/tasks/remdock.yml @@ -6,9 +6,9 @@ changed_when: false failed_when: '"No such file or directory" in dockitem_exists.stdout' tags: ['dock'] + - name: Ensure unwanted dock items removed. ansible.builtin.command: cmd: dockutil --remove '{{ item }}' when: dockitem_exists.rc == 0 tags: ['dock'] - From 5b47a103ce8379e9f7fd9c262b1448cc7f75d6db Mon Sep 17 00:00:00 2001 From: dspolleke Date: Mon, 12 Apr 2021 17:37:55 +0200 Subject: [PATCH 051/115] requested changes --- default.config.yml | 42 ++++++++++++++++++++++-------------------- main.yml | 2 +- tasks/dock.yml | 42 +++++++++++++++++++----------------------- 3 files changed, 42 insertions(+), 44 deletions(-) diff --git a/default.config.yml b/default.config.yml index f5430f9ff..59cdc02c4 100644 --- a/default.config.yml +++ b/default.config.yml @@ -6,29 +6,31 @@ configure_terminal: false configure_osx: true configure_dock: [] -configure_dock: true -dockitems_to_remove: - - Launchpad - - Safari - - Messages - - Mail - - Maps - - Photos - - FaceTime - - Calendar - - Contacts - - Reminders - - Notes - - TV - - Music - - Podcasts - - 'App Store' -remove_spacers: true +configure_dock: false +dockitems_to_remove: [] +# Example: to remove all / some items added by default on Big Sur uncomment use example below +# dockitems_to_remove: +# - Launchpad +# - Safari +# - Messages +# - Mail +# - Maps +# - Photos +# - FaceTime +# - Calendar +# - Contacts +# - Reminders +# - Notes +# - TV +# - Music +# - Podcasts +# - 'App Store' + dockitems_to_persist: - - name: iTerm - path: "/Applications/iTerm.app/" - name: "Google Chrome" path: "/Applications/Google Chrome.app/" + - name: "Sublime Text" + path: "/Applications/Sublime Text.app/" configure_sudoers: false sudoers_custom_config: '' # Example: diff --git a/main.yml b/main.yml index c00d8dbc6..e7a2f4676 100644 --- a/main.yml +++ b/main.yml @@ -48,7 +48,7 @@ executable: "{{ item.executable | default(omit) }}" loop: "{{ gem_packages }}" - - include_tasks: tasks/dock.yml + - import_tasks: tasks/dock.yml when: configure_dock tags: ['dock'] diff --git a/tasks/dock.yml b/tasks/dock.yml index 20cebd036..c617e46ef 100644 --- a/tasks/dock.yml +++ b/tasks/dock.yml @@ -1,26 +1,22 @@ --- -- name: ensure dock items - block: - - name: Install dockutil - homebrew: - name: dockutil - state: present - notify: - - Clear homebrew cache - - name: remove dockitems - ansible.builtin.include_tasks: tasks/remdock.yml - loop: "{{ dockitems_to_remove }}" +- name: Install dockutil + homebrew: + name: dockutil + state: present + notify: + - Clear homebrew cache +- name: remove dockitems + ansible.builtin.include_tasks: tasks/remdock.yml + loop: "{{ dockitems_to_remove }}" - - name: Ensure required dock items exist. - ansible.builtin.include_tasks: tasks/adddock.yml - with_items: "{{ dockitems_to_persist }}" +- name: Ensure required dock items exist. + ansible.builtin.include_tasks: tasks/adddock.yml + with_items: "{{ dockitems_to_persist }}" - - name: Ensure correct dock order - ansible.builtin.command: - cmd: dockutil --move '{{ item.name }}' --position '{{ item.pos }}' - when: - - item.pos is defined - - item.pos length >0 - loop: "{{ dockitems_to_persist }}" - - tags: ['dock'] +- name: Ensure correct dock order + ansible.builtin.command: + cmd: dockutil --move '{{ item.name }}' --position '{{ item.pos }}' + when: + - item.pos is defined + - item.pos length >0 + loop: "{{ dockitems_to_persist }}" From c32d37ef49ff3cdd219bf39b48c7974c586414d7 Mon Sep 17 00:00:00 2001 From: dspolleke Date: Mon, 12 Apr 2021 18:56:21 +0200 Subject: [PATCH 052/115] conditionals are hard --- default.config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/default.config.yml b/default.config.yml index 59cdc02c4..229e3cb1c 100644 --- a/default.config.yml +++ b/default.config.yml @@ -6,7 +6,7 @@ configure_terminal: false configure_osx: true configure_dock: [] -configure_dock: false +configure_dock: [] dockitems_to_remove: [] # Example: to remove all / some items added by default on Big Sur uncomment use example below # dockitems_to_remove: From bd6b7a00930d0777b2dbc656a4f07a94209cddf6 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Fri, 7 May 2021 10:26:27 -0500 Subject: [PATCH 053/115] PR #106 follow-up: More consistent docs and examples. --- README.md | 4 +++ default.config.yml | 34 ++++++++------------------ tasks/adddock.yml | 13 ---------- tasks/dock-add.yml | 12 +++++++++ tasks/{remdock.yml => dock-remove.yml} | 0 tasks/dock.yml | 17 +++++++------ tasks/osx.yml | 1 - 7 files changed, 35 insertions(+), 46 deletions(-) delete mode 100644 tasks/adddock.yml create mode 100644 tasks/dock-add.yml rename tasks/{remdock.yml => dock-remove.yml} (100%) diff --git a/README.md b/README.md index a7126e4d5..a2276e789 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,10 @@ You can override any of the defaults configured in `default.config.yml` by creat pip_packages: - name: mkdocs + + configure_dock: true + dockitems_remove: [] + dockitems_persist: [] Any variable can be overridden in `config.yml`; see the supporting roles' documentation for a complete list of available variables. diff --git a/default.config.yml b/default.config.yml index 229e3cb1c..149b009a6 100644 --- a/default.config.yml +++ b/default.config.yml @@ -6,31 +6,17 @@ configure_terminal: false configure_osx: true configure_dock: [] -configure_dock: [] -dockitems_to_remove: [] -# Example: to remove all / some items added by default on Big Sur uncomment use example below -# dockitems_to_remove: -# - Launchpad -# - Safari -# - Messages -# - Mail -# - Maps -# - Photos -# - FaceTime -# - Calendar -# - Contacts -# - Reminders -# - Notes -# - TV -# - Music -# - Podcasts -# - 'App Store' +# Set to 'true' to configure the Dock via dockutil. +configure_dock: false +dockitems_remove: [] +# - Launchpad +# - TV +# - Podcasts +# - 'App Store' +dockitems_persist: [] +# - name: "Sublime Text" +# path: "/Applications/Sublime Text.app/" -dockitems_to_persist: - - name: "Google Chrome" - path: "/Applications/Google Chrome.app/" - - name: "Sublime Text" - path: "/Applications/Sublime Text.app/" configure_sudoers: false sudoers_custom_config: '' # Example: diff --git a/tasks/adddock.yml b/tasks/adddock.yml deleted file mode 100644 index 40568aa92..000000000 --- a/tasks/adddock.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- -- name: find if dock {{ item }} exists - ansible.builtin.command: - cmd: dockutil --find '{{ item.name }}' - register: dockitem_exists - failed_when: '"No such file or directory" in dockitem_exists.stdout' - changed_when: false - tags: ['dock'] -- name: Ensure dock {{ item }} exists - ansible.builtin.command: - cmd: dockutil --add '{{ item.path }}' - when: dockitem_exists.rc >0 - tags: ['dock'] diff --git a/tasks/dock-add.yml b/tasks/dock-add.yml new file mode 100644 index 000000000..fe9c843ab --- /dev/null +++ b/tasks/dock-add.yml @@ -0,0 +1,12 @@ +--- +- name: See if Dock item {{ item }} exists. + ansible.builtin.command: "dockutil --find '{{ item.name }}'" + register: dockitem_exists + failed_when: '"No such file or directory" in dockitem_exists.stdout' + changed_when: false + tags: ['dock'] + +- name: Ensure Dock item {{ item }} exists. + ansible.builtin.command: "dockutil --add '{{ item.path }}'" + when: dockitem_exists.rc >0 + tags: ['dock'] diff --git a/tasks/remdock.yml b/tasks/dock-remove.yml similarity index 100% rename from tasks/remdock.yml rename to tasks/dock-remove.yml diff --git a/tasks/dock.yml b/tasks/dock.yml index c617e46ef..d1130ee5c 100644 --- a/tasks/dock.yml +++ b/tasks/dock.yml @@ -1,22 +1,23 @@ --- -- name: Install dockutil +- name: Install dockutil. homebrew: name: dockutil state: present notify: - Clear homebrew cache -- name: remove dockitems - ansible.builtin.include_tasks: tasks/remdock.yml - loop: "{{ dockitems_to_remove }}" + +- name: Remove configured Dock items. + ansible.builtin.include_tasks: tasks/dock-remove.yml + loop: "{{ dockitems_remove }}" - name: Ensure required dock items exist. - ansible.builtin.include_tasks: tasks/adddock.yml - with_items: "{{ dockitems_to_persist }}" + ansible.builtin.include_tasks: tasks/dock-add.yml + loop: "{{ dockitems_persist }}" -- name: Ensure correct dock order +- name: Ensure correct Dock order. ansible.builtin.command: cmd: dockutil --move '{{ item.name }}' --position '{{ item.pos }}' when: - item.pos is defined - item.pos length >0 - loop: "{{ dockitems_to_persist }}" + loop: "{{ dockitems_persist }}" diff --git a/tasks/osx.yml b/tasks/osx.yml index c6c5b45d0..ec12cd524 100644 --- a/tasks/osx.yml +++ b/tasks/osx.yml @@ -3,4 +3,3 @@ - name: Run .osx dotfiles. command: "{{ osx_script }}" changed_when: false - tags: ['osx'] From 269e9258a9e830b17441a51e7ccc598853b892e8 Mon Sep 17 00:00:00 2001 From: dspolleke Date: Mon, 12 Apr 2021 15:15:57 +0200 Subject: [PATCH 054/115] fix terminal to run with remote tasks as well --- tasks/terminal.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tasks/terminal.yml b/tasks/terminal.yml index 5ffa752e9..75aad5b1f 100644 --- a/tasks/terminal.yml +++ b/tasks/terminal.yml @@ -8,11 +8,11 @@ - name: ensure JJG-Term block: - - name: transfer the file - copy: + - name: transfer the file + copy: src: files/terminal/JJG-Term.terminal dest: /tmp/JJG-Term.terminal - + - name: Ensure custom Terminal profile is added. command: open /tmp/JJG-Term.terminal changed_when: false From ffcb2a64ae44f85ac8427b5c8329fcbe141aa361 Mon Sep 17 00:00:00 2001 From: Paul van Noort Date: Wed, 26 May 2021 11:27:20 +0200 Subject: [PATCH 055/115] did i mention i really hate rebasing --- default.config.yml | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/default.config.yml b/default.config.yml index 08d601e0f..e5fc2efcd 100644 --- a/default.config.yml +++ b/default.config.yml @@ -4,7 +4,6 @@ downloads: ~/.ansible-downloads/ configure_dotfiles: true configure_terminal: false configure_osx: true -configure_dock: [] # Set to 'true' to configure the Dock via dockutil. configure_dock: false @@ -17,16 +16,6 @@ dockitems_persist: [] # - name: "Sublime Text" # path: "/Applications/Sublime Text.app/" -# Set to 'true' to configure the Dock via dockutil. -configure_dock: false -dockitems_remove: [] -# - Launchpad -# - TV -# - Podcasts -# - 'App Store' -dockitems_persist: [] -# - name: "Sublime Text" -# path: "/Applications/Sublime Text.app/" configure_sudoers: false sudoers_custom_config: '' @@ -108,14 +97,14 @@ composer_packages: [] # state: present # present/absent, default: present # version: "^8.1" # default: N/A gem_packages: - - name: showoff +# - name: showoff # state: present # present/absent/latest, default: present # version: "~> 1.15.1" # default: N/A npm_packages: [] # - name: webpack # state: present # present/absent/latest, default: present # version: "^2.6" # default: N/A -#pip_packages: [] +pip_packages: [] # - name: mkdocs # state: present # present/absent/latest, default: present # version: "0.16.3" # default: N/A From 018ed6bba7d10c78c0f5865c54d9a17a692a2094 Mon Sep 17 00:00:00 2001 From: Paul van Noort Date: Wed, 26 May 2021 12:15:13 +0200 Subject: [PATCH 056/115] empty array --- default.config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/default.config.yml b/default.config.yml index e5fc2efcd..bb556d824 100644 --- a/default.config.yml +++ b/default.config.yml @@ -96,7 +96,7 @@ composer_packages: [] # - name: drush # state: present # present/absent, default: present # version: "^8.1" # default: N/A -gem_packages: +gem_packages: [] # - name: showoff # state: present # present/absent/latest, default: present # version: "~> 1.15.1" # default: N/A From 0bae73dcc43e706a949262d37aa1c7e292e722cc Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Thu, 27 May 2021 11:27:56 -0500 Subject: [PATCH 057/115] Fixes #114: Make ensure correct Dock order task work correctly. --- README.md | 9 +++++++-- default.config.yml | 1 + tasks/dock.yml | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a2276e789..4a25e9fa2 100644 --- a/README.md +++ b/README.md @@ -83,8 +83,13 @@ You can override any of the defaults configured in `default.config.yml` by creat - name: mkdocs configure_dock: true - dockitems_remove: [] - dockitems_persist: [] + dockitems_remove: + - Launchpad + - TV + dockitems_persist: + - name: "Sublime Text" + path: "/Applications/Sublime Text.app/" + pos: 5 Any variable can be overridden in `config.yml`; see the supporting roles' documentation for a complete list of available variables. diff --git a/default.config.yml b/default.config.yml index b62bdfc9e..3531dcc8e 100644 --- a/default.config.yml +++ b/default.config.yml @@ -15,6 +15,7 @@ dockitems_remove: [] dockitems_persist: [] # - name: "Sublime Text" # path: "/Applications/Sublime Text.app/" +# pos: 5 configure_sudoers: false sudoers_custom_config: '' diff --git a/tasks/dock.yml b/tasks/dock.yml index d1130ee5c..560d517f4 100644 --- a/tasks/dock.yml +++ b/tasks/dock.yml @@ -19,5 +19,5 @@ cmd: dockutil --move '{{ item.name }}' --position '{{ item.pos }}' when: - item.pos is defined - - item.pos length >0 + - item.pos > 0 loop: "{{ dockitems_persist }}" From c6fef3ad23802b62c6fc74227072a482367381b4 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Thu, 27 May 2021 11:31:58 -0500 Subject: [PATCH 058/115] Fixes #113: Don't skip mas tasks if only app_ids are provided. --- main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.yml b/main.yml index 90970095b..0c3744cac 100644 --- a/main.yml +++ b/main.yml @@ -18,7 +18,7 @@ when: configure_dotfiles tags: ['dotfiles'] - role: geerlingguy.mas - when: mas_installed_apps + when: mas_installed_apps or mas_installed_app_ids tags: ['mas'] tasks: From 1aebbee720d75c918c9a7fcae7dabba36e72fc59 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Thu, 27 May 2021 11:44:43 -0500 Subject: [PATCH 059/115] Fixes #112: Dock control tasks skipped if dockutil not installed or not in PATH. --- tasks/dock-add.yml | 8 +++++--- tasks/dock-remove.yml | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/tasks/dock-add.yml b/tasks/dock-add.yml index fe9c843ab..8a4349c9a 100644 --- a/tasks/dock-add.yml +++ b/tasks/dock-add.yml @@ -1,12 +1,14 @@ --- -- name: See if Dock item {{ item }} exists. +- name: See if Dock item {{ item.name | default(item) }} exists. ansible.builtin.command: "dockutil --find '{{ item.name }}'" register: dockitem_exists - failed_when: '"No such file or directory" in dockitem_exists.stdout' + failed_when: > + "No such file or directory" in dockitem_exists.stdout + or "command not found" in dockitem_exists.stdout changed_when: false tags: ['dock'] -- name: Ensure Dock item {{ item }} exists. +- name: Ensure Dock item {{ item.name | default(item) }} exists. ansible.builtin.command: "dockutil --add '{{ item.path }}'" when: dockitem_exists.rc >0 tags: ['dock'] diff --git a/tasks/dock-remove.yml b/tasks/dock-remove.yml index c22bd0d35..32d99e3e9 100644 --- a/tasks/dock-remove.yml +++ b/tasks/dock-remove.yml @@ -1,13 +1,15 @@ --- -- name: find if dock item exists +- name: See if dock item {{ item }} exists. ansible.builtin.command: cmd: dockutil --find '{{ item }}' register: dockitem_exists changed_when: false - failed_when: '"No such file or directory" in dockitem_exists.stdout' + failed_when: > + "No such file or directory" in dockitem_exists.stdout + or "command not found" in dockitem_exists.stdout tags: ['dock'] -- name: Ensure unwanted dock items removed. +- name: Ensure Dock item {{ item }} is removed. ansible.builtin.command: cmd: dockutil --remove '{{ item }}' when: dockitem_exists.rc == 0 From 39933d749f60d3bdab5881eddf4af6b57b4ed0a0 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Thu, 27 May 2021 11:50:31 -0500 Subject: [PATCH 060/115] Fixes #100: Better instructions for installing Ansible on a brand new Mac. --- README.md | 11 +- files/terminal/JJG-Term.terminal | 354 +++++++++++++++---------------- 2 files changed, 184 insertions(+), 181 deletions(-) diff --git a/README.md b/README.md index 4a25e9fa2..f3fe8bf06 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,15 @@ This is a work in progress, and is mostly a means for me to document my current ## Installation 1. Ensure Apple's command line tools are installed (`xcode-select --install` to launch the installer). - 2. [Install Ansible](https://docs.ansible.com/ansible/latest/installation_guide/index.html). + 2. [Install Ansible](https://docs.ansible.com/ansible/latest/installation_guide/index.html): + 1. Add the following to your `~/.zshrc` file (create one if you don't have one): + + ``` + export PATH="$HOME/Library/Python/3.8/bin:$PATH" + ``` + + 2. Source the new profile: `source ~/.zshrc` + 3. Install Ansible: `pip3 install ansible` 3. Clone this repository to your local drive. 4. Run `$ ansible-galaxy install -r requirements.yml` inside this directory to install required Ansible roles. 5. Run `ansible-playbook main.yml -i inventory --ask-become-pass` inside this directory. Enter your account password when prompted. @@ -141,7 +149,6 @@ Packages (installed with Homebrew): - openssl - pv - wget - - wrk 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. diff --git a/files/terminal/JJG-Term.terminal b/files/terminal/JJG-Term.terminal index 288886d6a..d10f0ccd0 100644 --- a/files/terminal/JJG-Term.terminal +++ b/files/terminal/JJG-Term.terminal @@ -4,155 +4,151 @@ ANSIBlackColor - YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS - AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T - Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjM4NDE0MzI4 - NDQgMC4zOTIzMTY1NDU4IDAuMzkyMzE2NTQ1OCAxTxAmMC4zMTA5OTExNjggMC4zMTg2 - NzQ4NjI0IDAuMzE4NTE0MDQ5MQAQAYACgAbTFBUNFhcYVE5TSURVTlNJQ0MQB4ADgAXS - Gg0bHFdOUy5kYXRhTxEMSAAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEA - AGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gABAAAAANMtSFAgIAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQA - AAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIY - AAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAA - iHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRl - Y2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQA - AAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNj - AAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYt - Mi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAA - AG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbP - ZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0 - dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29s - b3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBS - R0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAA - AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAA - AAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIu - MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3M - AAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAA - AAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAU - ABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAA - lQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZ - AR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB - 0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2 - AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD - 4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6 - BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG - 4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+ - CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK - 8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1a - DXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQ - JhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMj - E0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwW - jxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoq - GlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYe - QB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKC - Iq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgn - SSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5 - LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIx - ujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdg - N5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9 - oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQD - REdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRL - DEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIx - UnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbha - B1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1 - YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhq - n2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNd - c7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF8 - 4X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZy - hteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q - 1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtC - m6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqm - i6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHW - skuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++ - Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4 - yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjX - XNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz - 5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/y - jPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23//4AE - 0h4fICFaJGNsYXNzbmFtZVgkY2xhc3Nlc11OU011dGFibGVEYXRhoyAiI1ZOU0RhdGFY - TlNPYmplY3TSHh8lJlxOU0NvbG9yU3BhY2WiJyNcTlNDb2xvclNwYWNl0h4fKSpXTlND - b2xvcqIpI18QD05TS2V5ZWRBcmNoaXZlctEtLlRyb290gAEACAARABoAIwAtADIANwA/ - AEUAUABdAGMAcACFAIwAtwDgAOIA5ADmAO0A8gD4APoA/AD+AQMBCw1XDVkNXg1pDXIN - gA2EDYsNlA2ZDaYNqQ22DbsNww3GDdgN2w3gAAAAAAAAAgEAAAAAAAAALwAAAAAAAAAA - AAAAAAAADeI= + YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS + AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGmCwwXHR4lVSRudWxs1Q0ODxAR + EhMUFRZcTlNDb21wb25lbnRzVU5TUkdCXE5TQ29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29s + b3JTcGFjZVYkY2xhc3NPECgwLjM4NDE0MzI4NDQgMC4zOTIzMTY1NDU4IDAuMzkyMzE2 + NTQ1OCAxTxAmMC4zMTA5OTExNjggMC4zMTg2NzQ4NjI0IDAuMzE4NTE0MDQ5MQAQAYAC + gAXTGBkRGhscVE5TSURVTlNJQ0MQB4ADgARPEQxIAAAMSExpbm8CEAAAbW50clJHQiBY + WVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAAAAAAAPbW + AAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAA + AgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQA + AABwZG1kZAAAAsQAAACIdnVlZAAAA0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAU + bWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAABDwAAAgMZ1RSQwAABDwAAAgMYlRS + QwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3bGV0dC1QYWNrYXJk + IENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAS + c1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAA + AAAAAABYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAA + AAAAACSgAAAPhAAAts9kZXNjAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAA + AAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYxOTY2LTIuMSBE + ZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2 + LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAGRlc2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJ + RUM2MTk2Ni0yLjEAAAAAAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24g + aW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAAT + pP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMA + AAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAA + AAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0A + cgB3AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDw + APYA+wEBAQcBDQETARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIB + mgGhAakBsQG5AcEByQHRAdkB4QHpAfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJx + AnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34D + igOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATT + BOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkG + agZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgy + CEYIWghuCIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0K + VApqCoEKmAquCsUK3ArzCwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgyn + DMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EP + Xg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJF + EmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgV + mxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkg + GUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUd + Hh1HHXAdmR3DHeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFI + IXUhoSHOIfsiJyJVIoIiryLdIwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl + 9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrP + KwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4w + NTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXC + Nf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o7 + 6DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIw + QnJCtUL3QzpDfUPARANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJ + HUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAn + UHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX + 4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+z + YAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+lo + P2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDg + cTpxlXHwcktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6 + RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6 + hB2EgITjhUeFq4YOhnKG14c7h5+IBIhpiM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN + /45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhM + mLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowaj + dqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6h + rxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6 + tbsuu6e8IbybvRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbD + x0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TT + xtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC9 + 4UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb6uXrcOv77IbtEe2c7iju + tO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY + /Sn9uv5L/tz/bf//0h8gISJaJGNsYXNzbmFtZVgkY2xhc3Nlc1xOU0NvbG9yU3BhY2Wi + IyRcTlNDb2xvclNwYWNlWE5TT2JqZWN00h8gJidXTlNDb2xvcqImJAAIABEAGgAkACkA + MgA3AEkATABRAFMAWgBgAGsAeAB+AIsAoACnANIA+wD9AP8BAQEIAQ0BEwEVARcBGQ1l + DWoNdQ1+DYsNjg2bDaQNqQ2xAAAAAAAAAgEAAAAAAAAAKAAAAAAAAAAAAAAAAAAADbQ= ANSIBrightBlackColor - YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS - AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T - Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjU5MjQ0MjEw - MzggMC41OTI0NDIxMDM4IDAuNTkyNDQyMTAzOCAxTxAnMC41MjE1MTQ1OTQ2IDAuNTIx - NDk5MDM3NyAwLjUyMTUwNzc5OTYAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF - 0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx - AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0 - AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAAC - GAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAA - AIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0 - ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 - AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVz - YwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2 - LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA - AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2 - z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo - dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv - bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg - UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA - AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA - AAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y - LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt - zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8A - FAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQ - AJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMB - GQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ - AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC - tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT - A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsF - OgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR - BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoI - vgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc - CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN - Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJ - ECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT - IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs - Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa - KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4W - HkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi - giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY - J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUs - OSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC - Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3 - YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h - PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BE - A0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrE - SwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZS - MVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4 - WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh - 9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpI - ap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFz - XXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB - fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6G - cobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu - kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWb - QpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa - poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx - 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P - vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK - OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY - 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vk - c+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ - 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+A - BNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRh - WE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05T - Q29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcA - PwBFAFAAXQBjAHAAhQCMALcA4QDjAOUA5wDuAPMA+QD7AP0A/wEEAQwNWA1aDV8Nag1z - DYENhQ2MDZUNmg2nDaoNtw28DcQNxw3ZDdwN4QAAAAAAAAIBAAAAAAAAAC8AAAAAAAAA - AAAAAAAAAA3j + YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS + AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGmCwwXHR4lVSRudWxs1Q0ODxAR + EhMUFRZcTlNDb21wb25lbnRzVU5TUkdCXE5TQ29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29s + b3JTcGFjZVYkY2xhc3NPECgwLjU5MjQ0MjEwMzggMC41OTI0NDIxMDM4IDAuNTkyNDQy + MTAzOCAxTxAnMC41MjE1MTQ1OTQ2IDAuNTIxNDk5MDM3NyAwLjUyMTUwNzc5OTYAEAGA + AoAF0xgZERobHFROU0lEVU5TSUNDEAeAA4AETxEMSAAADEhMaW5vAhAAAG1udHJSR0Ig + WFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD2 + 1gABAAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQA + AAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJU + AAAAcGRtZGQAAALEAAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAA + FG1lYXMAAAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJU + UkMAAAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2Fy + ZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAA + EnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAA + AAAAAAAAWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAA + AAAAAAAkoAAAD4QAALbPZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAA + AAAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEg + RGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2 + Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAA + AAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4g + SUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9u + IGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAA + E6T+ABRfLgAQzxQAA+3MAAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFz + AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAA + AAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABt + AHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA + 8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGS + AZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcC + cQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+ + A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE + 0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZ + BmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8I + MghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9 + ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4M + pwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9B + D14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYS + RRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4 + FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZ + IBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1 + HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwh + SCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXH + JfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsq + zysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+ + MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1 + wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuq + O+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5C + MEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjX + SR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91Q + J1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeS + V+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ff + s2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fp + aD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw + 4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnn + ekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eD + uoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Y + jf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CY + TJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMG + o3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2u + oa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7 + urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbG + w8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE + 08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4Dbg + veFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o + 7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8 + mP0p/br+S/7c/23//9IfICEiWiRjbGFzc25hbWVYJGNsYXNzZXNcTlNDb2xvclNwYWNl + oiMkXE5TQ29sb3JTcGFjZVhOU09iamVjdNIfICYnV05TQ29sb3KiJiQACAARABoAJAAp + ADIANwBJAEwAUQBTAFoAYABrAHgAfgCLAKAApwDSAPwA/gEAAQIBCQEOARQBFgEYARoN + Zg1rDXYNfw2MDY8NnA2lDaoNsgAAAAAAAAIBAAAAAAAAACgAAAAAAAAAAAAAAAAAAA21 BackgroundAlphaInactive 0.73865855823863635 @@ -162,31 +158,31 @@ 0.50397283380681823 BackgroundColor - YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS - AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPEDcw - LjA3ODcxOTQyOTM1IDAuMDc4NzE5NDI5MzUgMC4wNzg3MTk0MjkzNSAwLjg5OTM0MDY3 - OTIAEAGAAtIQERITWiRjbGFzc25hbWVYJGNsYXNzZXNXTlNDb2xvcqISFFhOU09iamVj - dF8QD05TS2V5ZWRBcmNoaXZlctEXGFRyb290gAEIERojLTI3O0FITltinJ6gpbC5wcTN - 3+LnAAAAAAAAAQEAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAOk= + YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS + AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGjCwwTVSRudWxs0w0ODxARElVO + U1JHQlxOU0NvbG9yU3BhY2VWJGNsYXNzTxAqMC4wNzg3MTk0MjkzNSAwLjA3ODcxOTQy + OTM1IDAuMDc4NzE5NDI5MzUAEAGAAtIUFRYXWiRjbGFzc25hbWVYJGNsYXNzZXNXTlND + b2xvcqIWGFhOU09iamVjdAgRGiQpMjdJTFFTV11kand+q62vtL/I0NMAAAAAAAABAQAA + AAAAAAAZAAAAAAAAAAAAAAAAAAAA3A== BackgroundSettingsForInactiveWindows CursorColor - YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS - AAGGoKMHCA9VJG51bGzTCQoLDA0OV05TV2hpdGVcTlNDb2xvclNwYWNlViRjbGFzc0sw - LjMwMjQxOTM2ABADgALSEBESE1okY2xhc3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRY - TlNPYmplY3RfEA9OU0tleWVkQXJjaGl2ZXLRFxhUcm9vdIABCBEaIy0yNztBSFBdZHBy - dHmEjZWYobO2uwAAAAAAAAEBAAAAAAAAABkAAAAAAAAAAAAAAAAAAAC9 + YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS + AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGjCwwTVSRudWxs0w0ODxAREldO + U1doaXRlXE5TQ29sb3JTcGFjZVYkY2xhc3NLMC4zMDI0MTkzNgAQA4AC0hQVFhdaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohYYWE5TT2JqZWN0CBEaJCkyN0lMUVNXXWRs + eYCMjpCVoKmxtAAAAAAAAAEBAAAAAAAAABkAAAAAAAAAAAAAAAAAAAC9 Font - YnBsaXN0MDDUAQIDBAUGGBlYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS - AAGGoKQHCBESVSRudWxs1AkKCwwNDg8QVk5TU2l6ZVhOU2ZGbGFnc1ZOU05hbWVWJGNs - YXNzI0AsAAAAAAAAEBCAAoADWENvbnNvbGFz0hMUFRZaJGNsYXNzbmFtZVgkY2xhc3Nl - c1ZOU0ZvbnSiFRdYTlNPYmplY3RfEA9OU0tleWVkQXJjaGl2ZXLRGhtUcm9vdIABCBEa - Iy0yNzxCS1JbYmlydHZ4gYaRmqGkrb/CxwAAAAAAAAEBAAAAAAAAABwAAAAAAAAAAAAA - AAAAAADJ + YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS + AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGkCwwVFlUkbnVsbNQNDg8QERIT + FFZOU1NpemVYTlNmRmxhZ3NWTlNOYW1lViRjbGFzcyNALAAAAAAAABAQgAKAA11TRk1v + bm8tTWVkaXVt0hcYGRpaJGNsYXNzbmFtZVgkY2xhc3Nlc1ZOU0ZvbnSiGRtYTlNPYmpl + Y3QIERokKTI3SUxRU1heZ253foWOkJKUoqeyu8LFAAAAAAAAAQEAAAAAAAAAHAAAAAAA + AAAAAAAAAAAAAM4= FontAntialias @@ -195,18 +191,18 @@ Linewrap ProfileCurrentVersion - 2.0600000000000001 + 2.0699999999999998 RestoreLines 2000 ScrollbackLines 50000 SelectionColor - YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS - AAGGoKMHCA9VJG51bGzTCQoLDA0OV05TV2hpdGVcTlNDb2xvclNwYWNlViRjbGFzc0sw - LjI1NDAzMjI1ABADgALSEBESE1okY2xhc3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRY - TlNPYmplY3RfEA9OU0tleWVkQXJjaGl2ZXLRFxhUcm9vdIABCBEaIy0yNztBSFBdZHBy - dHmEjZWYobO2uwAAAAAAAAEBAAAAAAAAABkAAAAAAAAAAAAAAAAAAAC9 + YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS + AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGjCwwTVSRudWxs0w0ODxAREldO + U1doaXRlXE5TQ29sb3JTcGFjZVYkY2xhc3NLMC4yNTQwMzIyNQAQA4AC0hQVFhdaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohYYWE5TT2JqZWN0CBEaJCkyN0lMUVNXXWRs + eYCMjpCVoKmxtAAAAAAAAAEBAAAAAAAAABkAAAAAAAAAAAAAAAAAAAC9 ShouldLimitScrollback 1 @@ -216,19 +212,19 @@ xterm-color TextBoldColor - YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS - AAGGoKMHCA9VJG51bGzTCQoLDA0OV05TV2hpdGVcTlNDb2xvclNwYWNlViRjbGFzc0Ix - ABADgALSEBESE1okY2xhc3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRYTlNPYmplY3Rf - EA9OU0tleWVkQXJjaGl2ZXLRFxhUcm9vdIABCBEaIy0yNztBSFBdZGdpa3B7hIyPmKqt - sgAAAAAAAAEBAAAAAAAAABkAAAAAAAAAAAAAAAAAAAC0 + YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS + AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGjCwwTVSRudWxs0w0ODxAREldO + U1doaXRlXE5TQ29sb3JTcGFjZVYkY2xhc3NCMQAQA4AC0hQVFhdaJGNsYXNzbmFtZVgk + Y2xhc3Nlc1dOU0NvbG9yohYYWE5TT2JqZWN0CBEaJCkyN0lMUVNXXWRseYCDhYeMl6Co + qwAAAAAAAAEBAAAAAAAAABkAAAAAAAAAAAAAAAAAAAC0 TextColor - YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS - AAGGoKMHCA9VJG51bGzTCQoLDA0OV05TV2hpdGVcTlNDb2xvclNwYWNlViRjbGFzc0sw - Ljk0NzU4MDY0ABADgALSEBESE1okY2xhc3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRY - TlNPYmplY3RfEA9OU0tleWVkQXJjaGl2ZXLRFxhUcm9vdIABCBEaIy0yNztBSFBdZHBy - dHmEjZWYobO2uwAAAAAAAAEBAAAAAAAAABkAAAAAAAAAAAAAAAAAAAC9 + YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS + AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGjCwwTVSRudWxs0w0ODxAREldO + U1doaXRlXE5TQ29sb3JTcGFjZVYkY2xhc3NLMC45NDc1ODA2NAAQA4AC0hQVFhdaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohYYWE5TT2JqZWN0CBEaJCkyN0lMUVNXXWRs + eYCMjpCVoKmxtAAAAAAAAAEBAAAAAAAAABkAAAAAAAAAAAAAAAAAAAC9 UseBrightBold From 7c7d436d5cb9aa7183d20a56cd3910dfdae3e696 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Thu, 27 May 2021 11:53:38 -0500 Subject: [PATCH 061/115] Fix formatting from previous commit. --- README.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f3fe8bf06..5dbc9c0d4 100644 --- a/README.md +++ b/README.md @@ -19,14 +19,16 @@ This is a work in progress, and is mostly a means for me to document my current 1. Ensure Apple's command line tools are installed (`xcode-select --install` to launch the installer). 2. [Install Ansible](https://docs.ansible.com/ansible/latest/installation_guide/index.html): - 1. Add the following to your `~/.zshrc` file (create one if you don't have one): - ``` - export PATH="$HOME/Library/Python/3.8/bin:$PATH" - ``` + 1. Add the following to your `~/.zshrc` file (create one if you don't have one): - 2. Source the new profile: `source ~/.zshrc` - 3. Install Ansible: `pip3 install ansible` + ``` + export PATH="$HOME/Library/Python/3.8/bin:$PATH" + ``` + + 2. Source the new profile: `source ~/.zshrc` + 3. Install Ansible: `pip3 install ansible` + 3. Clone this repository to your local drive. 4. Run `$ ansible-galaxy install -r requirements.yml` inside this directory to install required Ansible roles. 5. Run `ansible-playbook main.yml -i inventory --ask-become-pass` inside this directory. Enter your account password when prompted. From 0bcbb90abd5a58bb20e1d3e28622b2a78e44938b Mon Sep 17 00:00:00 2001 From: Paul van Noort Date: Thu, 27 May 2021 19:10:58 +0200 Subject: [PATCH 062/115] cleanup persoal crud --- inventory | 3 +-- main.yml | 8 -------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/inventory b/inventory index f296d736c..5b7201063 100644 --- a/inventory +++ b/inventory @@ -1,3 +1,2 @@ [all] -#127.0.0.1 ansible_connection=local -192.168.2.49 +127.0.0.1 ansible_connection=local diff --git a/main.yml b/main.yml index 9f3faad7f..9f993062a 100644 --- a/main.yml +++ b/main.yml @@ -39,14 +39,6 @@ - import_tasks: tasks/extra-packages.yml tags: ['extra-packages'] - - name: Install global Ruby gems. - gem: - name: "{{ item.name | default(item) }}" - state: "{{ item.state | default('present') }}" - version: "{{ item.version | default(omit) }}" - user_install: false - executable: "{{ item.executable | default(omit) }}" - loop: "{{ gem_packages }}" - import_tasks: tasks/dock.yml when: configure_dock From 4d6e28cb3dbffae68356bd097d5af257af526c69 Mon Sep 17 00:00:00 2001 From: Paul van Noort Date: Thu, 27 May 2021 19:13:21 +0200 Subject: [PATCH 063/115] cleanup persoal crud --- default.config.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/default.config.yml b/default.config.yml index bb556d824..b62bdfc9e 100644 --- a/default.config.yml +++ b/default.config.yml @@ -2,7 +2,7 @@ downloads: ~/.ansible-downloads/ configure_dotfiles: true -configure_terminal: false +configure_terminal: true configure_osx: true # Set to 'true' to configure the Dock via dockutil. @@ -16,7 +16,6 @@ dockitems_persist: [] # - name: "Sublime Text" # path: "/Applications/Sublime Text.app/" - configure_sudoers: false sudoers_custom_config: '' # Example: @@ -24,7 +23,7 @@ sudoers_custom_config: '' # # Allow users in admin group to use sudo with no password. # %admin ALL=(ALL) NOPASSWD: ALL -dotfiles_repo: https://github.com/dspolleke/dotfiles.git +dotfiles_repo: https://github.com/geerlingguy/dotfiles.git dotfiles_repo_accept_hostkey: true dotfiles_repo_local_destination: ~/Development/GitHub/dotfiles dotfiles_files: @@ -97,7 +96,7 @@ composer_packages: [] # state: present # present/absent, default: present # version: "^8.1" # default: N/A gem_packages: [] -# - name: showoff +# - name: bundler # state: present # present/absent/latest, default: present # version: "~> 1.15.1" # default: N/A npm_packages: [] From d1ee83239ca144f607645bac660fb585b0321cf1 Mon Sep 17 00:00:00 2001 From: Paul van Noort Date: Thu, 27 May 2021 19:14:35 +0200 Subject: [PATCH 064/115] cleanup persoal crud --- bootstrap.sh | 31 ------------------------------- 1 file changed, 31 deletions(-) delete mode 100644 bootstrap.sh diff --git a/bootstrap.sh b/bootstrap.sh deleted file mode 100644 index 4c2b67f53..000000000 --- a/bootstrap.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -alias python=python3 -pyenv install --list | grep -Ev '[abc-]' | tail -1 -python -V 2>&1 | awk '/Python/{ split($2, a, "."); print a[1]"."a[2] }' - -if curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py ; -then -python get-pip.py -fi - -export PATH="$HOME/Library/Python/${pyver}/bin/:$PATH" -python -m pip install --user ansible - -xcode-select --install > /dev/null 2>&1 -if [ "$?" == '0' ]; then - sleep 1 - osascript < Date: Thu, 27 May 2021 19:24:00 +0200 Subject: [PATCH 065/115] cleanup reuirements on request --- requirements.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/requirements.yml b/requirements.yml index c8046cad9..859e6952a 100644 --- a/requirements.yml +++ b/requirements.yml @@ -3,5 +3,3 @@ roles: - name: geerlingguy.dotfiles - name: geerlingguy.homebrew - name: geerlingguy.mas -collections: - - name: community.general From 7c4b4c1e4c061c9b6bc2e7da8f5917f9d2ea9443 Mon Sep 17 00:00:00 2001 From: Paul van Noort Date: Thu, 27 May 2021 19:25:57 +0200 Subject: [PATCH 066/115] remove remove double double code code --- main.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/main.yml b/main.yml index 9f993062a..90970095b 100644 --- a/main.yml +++ b/main.yml @@ -44,10 +44,6 @@ when: configure_dock tags: ['dock'] - - import_tasks: tasks/dock.yml - when: configure_dock - tags: ['dock'] - - name: Run configured post-provision ansible task files. include_tasks: "{{ outer_item }}" loop_control: From bbacfcbd9ace2cbb1ef4d37c5a0cd8ddd6249e2a Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Thu, 27 May 2021 13:39:20 -0500 Subject: [PATCH 067/115] Update tasks/terminal.yml --- tasks/terminal.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/terminal.yml b/tasks/terminal.yml index 528aec42e..f4a26789a 100644 --- a/tasks/terminal.yml +++ b/tasks/terminal.yml @@ -7,7 +7,7 @@ check_mode: false - name: Ensure custom Terminal profile is added. - ansible.builtin.copy: + copy: src: files/terminal/JJG-Term.terminal dest: /tmp/JJG-Term.terminal changed_when: false From de1aec4a4989b9dc0dcdf8e5756f62f179392708 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Thu, 27 May 2021 13:42:22 -0500 Subject: [PATCH 068/115] After merging #107, can drop -i inventory. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5dbc9c0d4..3434b6e02 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ This is a work in progress, and is mostly a means for me to document my current 3. Clone this repository to your local drive. 4. Run `$ ansible-galaxy install -r requirements.yml` inside this directory to install required Ansible roles. - 5. Run `ansible-playbook main.yml -i inventory --ask-become-pass` inside this directory. Enter your account password when prompted. + 5. Run `ansible-playbook main.yml --ask-become-pass` inside this directory. Enter your account password when prompted. > 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. @@ -58,7 +58,7 @@ If you need to supply an SSH password (if you don't use SSH keys), make sure to 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`. - ansible-playbook main.yml -i inventory -K --tags "dotfiles,homebrew" + ansible-playbook main.yml -K --tags "dotfiles,homebrew" ## Overriding Defaults From 5198a55347fa3ea9d88a744f4a3b9ac99900385e Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Fri, 28 May 2021 16:06:07 -0500 Subject: [PATCH 069/115] Add /opt/homebrew/bin to example PATH in install instructions. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3434b6e02..1677069d8 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ This is a work in progress, and is mostly a means for me to document my current 1. Add the following to your `~/.zshrc` file (create one if you don't have one): ``` - export PATH="$HOME/Library/Python/3.8/bin:$PATH" + export PATH="$HOME/Library/Python/3.8/bin:/opt/homebrew/bin:$PATH" ``` 2. Source the new profile: `source ~/.zshrc` From 254d657147b34fcd6ab593df77205ce0a2d38093 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Fri, 28 May 2021 23:13:06 -0500 Subject: [PATCH 070/115] Automate Sublime Text configuration (#117) * sublime text 3 * renamed variable * sublime text 3 * Update default.config.yml * PR #110: Update Sublime Text automation so it's a little simpler to configure. * A couple cosmetic touchups. * Add Sublime Markdown configuration and fix Package Control install. * Add a few more Sublime preference files to make the editor work like I like it. * More Sublime Text automation. * Saner default for those who don't use Sublime. * Add remaining tweaks to get Playbook idempotent with Sublime Text. Co-authored-by: dspolleke --- README.md | 85 +-- default.config.yml | 18 + files/sublime/Cobalt (SL).tmTheme | 589 ++++++++++++++++++ .../Packages/User/DashDoc.sublime-settings | 25 - .../User/Package Control.sublime-settings | 23 - .../User/Preferences.sublime-settings | 37 -- files/sublime/Markdown.sublime-settings | 7 + files/sublime/Plain text.sublime-settings | 5 + files/sublime/Preferences.sublime-settings | 404 ++++++++++++ files/sublime/WordCount.sublime-settings | 3 + main.yml | 4 + tasks/sublime-text.yml | 29 + templates/Package_Control.sublime-settings.j2 | 13 + 13 files changed, 1116 insertions(+), 126 deletions(-) create mode 100644 files/sublime/Cobalt (SL).tmTheme delete mode 100644 files/sublime/Library/Packages/User/DashDoc.sublime-settings delete mode 100644 files/sublime/Library/Packages/User/Package Control.sublime-settings delete mode 100644 files/sublime/Library/Packages/User/Preferences.sublime-settings create mode 100644 files/sublime/Markdown.sublime-settings create mode 100644 files/sublime/Plain text.sublime-settings create mode 100644 files/sublime/Preferences.sublime-settings create mode 100644 files/sublime/WordCount.sublime-settings create mode 100644 tasks/sublime-text.yml create mode 100755 templates/Package_Control.sublime-settings.j2 diff --git a/README.md b/README.md index 1677069d8..76636b617 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ This is a work in progress, and is mostly a means for me to document my current 2. Source the new profile: `source ~/.zshrc` 3. Install Ansible: `pip3 install ansible` - + 3. Clone this repository to your local drive. 4. Run `$ ansible-galaxy install -r requirements.yml` inside this directory to install required Ansible roles. 5. Run `ansible-playbook main.yml --ask-become-pass` inside this directory. Enter your account password when prompted. @@ -66,40 +66,42 @@ Not everyone's development environment and preferred software configuration is t 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: - homebrew_installed_packages: - - cowsay - - git - - go - - mas_installed_apps: - - { id: 443987910, name: "1Password" } - - { id: 498486288, name: "Quick Resizer" } - - { id: 557168941, name: "Tweetbot" } - - { id: 497799835, name: "Xcode" } - - composer_packages: - - name: hirak/prestissimo - - name: drush/drush - version: '^8.1' - - gem_packages: - - name: bundler - state: latest - - npm_packages: - - name: webpack - - pip_packages: - - name: mkdocs - - configure_dock: true - dockitems_remove: - - Launchpad - - TV - dockitems_persist: - - name: "Sublime Text" - path: "/Applications/Sublime Text.app/" - pos: 5 +```yaml +homebrew_installed_packages: + - cowsay + - git + - go + +mas_installed_apps: + - { id: 443987910, name: "1Password" } + - { id: 498486288, name: "Quick Resizer" } + - { id: 557168941, name: "Tweetbot" } + - { id: 497799835, name: "Xcode" } + +composer_packages: + - name: hirak/prestissimo + - name: drush/drush + version: '^8.1' + +gem_packages: + - name: bundler + state: latest + +npm_packages: + - name: webpack + +pip_packages: + - name: mkdocs + +configure_dock: true +dockitems_remove: + - Launchpad + - TV +dockitems_persist: + - name: "Sublime Text" + path: "/Applications/Sublime Text.app/" + pos: 5 +``` Any variable can be overridden in `config.yml`; see the supporting roles' documentation for a complete list of available variables. @@ -162,11 +164,12 @@ Finally, there are a few other preferences and settings added on for various app 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). - 1. Install [Sublime Package Manager](http://sublime.wbond.net/installation). - 2. Remap Caps Lock to Escape (requires macOS Sierra 10.12.1+). - 3. Set trackpad tracking rate. - 4. Set mouse tracking rate. - 5. Configure extra Mail and/or Calendar accounts (e.g. Google, Exchange, etc.). + 1. Set JJG-Term as the default Terminal theme (it's installed, but not set as default automatically). + 3. Install all the apps that aren't yet in this setup (see below). + 4. Remap Caps Lock to Escape (requires macOS Sierra 10.12.1+). + 5. Set trackpad tracking rate. + 6. Set mouse tracking rate. + 7. Configure extra Mail and/or Calendar accounts (e.g. Google, Exchange, etc.). ### Configuration to be added: @@ -192,7 +195,7 @@ Check out [Ansible for DevOps](https://www.ansiblefordevops.com/), which teaches ## Author -[Jeff Geerling](https://www.jeffgeerling.com/), 2014 (originally inspired by [MWGriffin/ansible-playbooks](https://github.com/MWGriffin/ansible-playbooks)). +This project was created by [Jeff Geerling](https://www.jeffgeerling.com/) (originally inspired by [MWGriffin/ansible-playbooks](https://github.com/MWGriffin/ansible-playbooks)). [badge-gh-actions]: https://github.com/geerlingguy/mac-dev-playbook/workflows/CI/badge.svg?event=push [link-gh-actions]: https://github.com/geerlingguy/mac-dev-playbook/actions?query=workflow%3ACI diff --git a/default.config.yml b/default.config.yml index 3531dcc8e..9871408b0 100644 --- a/default.config.yml +++ b/default.config.yml @@ -109,5 +109,23 @@ pip_packages: [] # state: present # present/absent/latest, default: present # version: "0.16.3" # default: N/A +# Set to 'true' to configure Sublime Text. +configure_sublime: false +sublime_base_path: '~/Library/Application Support/Sublime Text' +sublime_config_path: "Packages/User" +sublime_package_control: + - "DocBlockr" + - "Dockerfile Syntax Highlighting" + - "FileDiffs" + - "GitHub Flavored Markdown Preview" + - "Jinja2" + - "Package Control" + - "PHP-Twig" + - "Pretty JSON" + - "SublimeLinter" + - "SublimeLinter-contrib-yamllint" + - "TrailingSpaces" + - "WordCount" + # Glob pattern to ansible task files to run after all other tasks are finished. post_provision_tasks: [] diff --git a/files/sublime/Cobalt (SL).tmTheme b/files/sublime/Cobalt (SL).tmTheme new file mode 100644 index 000000000..a9f192432 --- /dev/null +++ b/files/sublime/Cobalt (SL).tmTheme @@ -0,0 +1,589 @@ + + + + + comment + Created by Jacob Rus. Based on ‘Slate’ by Wilson Miner + author + Jacob Rus + name + Cobalt + settings + + + settings + + background + #002240 + caret + #FFFFFF + foreground + #FFFFFF + invisibles + #FFFFFF26 + lineHighlight + #00000059 + selection + #B36539BF + + + + name + Punctuation + scope + punctuation - (punctuation.definition.string || punctuation.definition.comment) + settings + + fontStyle + + foreground + #E1EFFF + + + + name + Constant + scope + constant + settings + + fontStyle + + foreground + #FF628C + + + + name + Entity + scope + entity + settings + + fontStyle + + foreground + #FFDD00 + + + + name + Keyword + scope + keyword + settings + + fontStyle + + foreground + #FF9D00 + + + + name + Storage + scope + storage + settings + + fontStyle + + foreground + #FFEE80 + + + + name + String + scope + string -string.unquoted.old-plist -string.unquoted.heredoc, string.unquoted.heredoc string + settings + + fontStyle + + foreground + #3AD900 + + + + name + Comment + scope + comment + settings + + fontStyle + italic + foreground + #0088FF + + + + name + Support + scope + support + settings + + fontStyle + + foreground + #80FFBB + + + + name + Variable + scope + variable + settings + + fontStyle + + foreground + #CCCCCC + + + + name + Lang Variable + scope + variable.language + settings + + fontStyle + + foreground + #FF80E1 + + + + name + Function Call + scope + meta.function-call + settings + + foreground + #FFEE80 + + + + name + Invalid + scope + invalid + settings + + background + #800F00 + foreground + #F8F8F8 + + + + name + Embedded Source + scope + text source, string.unquoted.heredoc, source source + settings + + background + #223545 + fontStyle + + foreground + #FFFFFF + + + + name + Entity inherited-class + scope + entity.other.inherited-class + settings + + fontStyle + italic + foreground + #80FCFF + + + + name + String embedded-source + scope + string.quoted source + settings + + fontStyle + + foreground + #9EFF80 + + + + name + String constant + scope + string constant + settings + + foreground + #80FF82 + + + + name + String.regexp + scope + string.regexp + settings + + foreground + #80FFC2 + + + + name + String variable + scope + string variable + settings + + foreground + #EDEF7D + + + + name + Support.function + scope + support.function + settings + + fontStyle + + foreground + #FFB054 + + + + name + Support.constant + scope + support.constant + settings + + fontStyle + + foreground + #EB939A + + + + name + Exception + scope + support.type.exception + settings + + foreground + #FF1E00 + + + + name + C/C++ Preprocessor Line + scope + meta.preprocessor.c + settings + + foreground + #8996A8 + + + + name + C/C++ Preprocessor Directive + scope + meta.preprocessor.c keyword + settings + + foreground + #AFC4DB + + + + name + Doctype/XML Processing + scope + 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 + settings + + foreground + #73817D + + + + name + Meta.tag.A + scope + meta.tag, meta.tag entity + settings + + foreground + #9EFFFF + + + + name + css tag-name + scope + meta.selector.css entity.name.tag + settings + + foreground + #9EFFFF + + + + name + css#id + scope + meta.selector.css entity.other.attribute-name.id + settings + + foreground + #FFB454 + + + + name + css.class + scope + meta.selector.css entity.other.attribute-name.class + settings + + foreground + #5FE461 + + + + name + css property-name: + scope + support.type.property-name.css + settings + + foreground + #9DF39F + + + + name + css property-value; + scope + meta.property-group support.constant.property-value.css, meta.property-value support.constant.property-value.css + settings + + foreground + #F6F080 + + + + name + css @at-rule + scope + meta.preprocessor.at-rule keyword.control.at-rule + settings + + foreground + #F6AA11 + + + + name + css additional-constants + scope + meta.property-value support.constant.named-color.css, meta.property-value constant + settings + + foreground + #EDF080 + + + + name + css constructor.argument + scope + meta.constructor.argument.css + settings + + foreground + #EB939A + + + + name + diff.header + scope + meta.diff, meta.diff.header + settings + + background + #000E1A + fontStyle + + foreground + #F8F8F8 + + + + name + diff.deleted + scope + markup.deleted + settings + + background + #4C0900 + foreground + #F8F8F8 + + + + name + diff.changed + scope + markup.changed + settings + + background + #806F00 + foreground + #F8F8F8 + + + + name + diff.inserted + scope + markup.inserted + settings + + background + #154F00 + foreground + #F8F8F8 + + + + name + Raw Markup + scope + markup.raw + settings + + background + #8FDDF630 + + + + name + Block Quote + scope + markup.quote + settings + + background + #004480 + + + + name + List + scope + markup.list + settings + + background + #130D26 + + + + name + Bold Markup + scope + markup.bold + settings + + fontStyle + bold + foreground + #C1AFFF + + + + name + Italic Markup + scope + markup.italic + settings + + fontStyle + italic + foreground + #B8FFD9 + + + + name + Heading Markup + scope + markup.heading + settings + + background + #001221 + fontStyle + bold + foreground + #C8E4FD + + + + name + SublimeLinter Error + scope + sublimelinter.mark.error + settings + + foreground + #DA2000 + + + name + SublimeLinter Warning + scope + sublimelinter.mark.warning + settings + + foreground + #EDBA00 + + + name + SublimeLinter Gutter Mark + scope + sublimelinter.gutter-mark + settings + + foreground + #FFFFFF + + + uuid + 06CD1FB2-A00A-4F8C-97B2-60E131980454 + + \ No newline at end of file diff --git a/files/sublime/Library/Packages/User/DashDoc.sublime-settings b/files/sublime/Library/Packages/User/DashDoc.sublime-settings deleted file mode 100644 index d7a97fc2a..000000000 --- a/files/sublime/Library/Packages/User/DashDoc.sublime-settings +++ /dev/null @@ -1,25 +0,0 @@ -{ - "syntax_sensitive_as_default": true, - "syntax_docset_map": - { - "CSS" : ["css", "bootstrap", "foundation", "less", "cordova", "phonegap"], - "Go" : ["go"], - "GoSublime" : ["go"], - "GoSublime-Go" : ["go"], - "HTML" : ["php", "html"], - "Java" : ["java", "javafx", "grails", "groovy", "playjava", "spring", "cvj", "processing"], - "JavaScript" : ["javascript", "jquery", "jqueryui", "jquerym", "backbone", "marionette", "meteor", "sproutcore", "moo", "prototype", "bootstrap", "foundation", "lodash", "underscore", "ember", "sencha", "extjs", "knockout", "zepto", "yui", "d3", "svg", "dojo", "coffee", "nodejs", "express", "mongoose", "grunt", "chai", "html", "css", "cordova", "phonegap", "unity3d", "titanium"], - "Markdown" : ["markdown"], - "Objective-C" : ["iphoneos", "macosx", "appledoc", "cocos2d", "cocos3d", "kobold2d", "sparrow", "c", "manpages"], - "PHP" : ["drupal", "php", "drupal", "symfony", "twig", "html", "mysql"], - "Puppet" : ["puppet"], - "Python" : ["python", "django", "twisted", "sphinx", "flask", "cvp"], - "Ruby" : ["ruby", "rubygems", "rails"], - "Ruby on Rails" : ["ruby", "rubygems", "rails"], - "Sass" : ["sass", "compass", "bourbon", "neat", "css"], - "Shell-Unix-Generic" : ["bash", "manpages"], - "SQL" : ["mysql", "sqlite", "psql"], - "TCL" : ["tcl"], - "YAML" : ["ansible", "yaml", "drupal"], - } -} diff --git a/files/sublime/Library/Packages/User/Package Control.sublime-settings b/files/sublime/Library/Packages/User/Package Control.sublime-settings deleted file mode 100644 index a0de2f98e..000000000 --- a/files/sublime/Library/Packages/User/Package Control.sublime-settings +++ /dev/null @@ -1,23 +0,0 @@ -{ - "auto_upgrade_last_run": null, - "installed_packages": - [ - "DashDoc", - "DocBlockr", - "Dockerfile Syntax Highlighting", - "Drupal Snippets", - "FileDiffs", - "GitHub Flavored Markdown Preview", - "Jinja2", - "MarkAndMove", - "Markdown Preview", - "Package Control", - "Puppet", - "RegReplace", - "Sass", - "SublimeCodeIntel", - "SublimeLinter", - "TrailingSpaces", - "Xdebug Client" - ] -} diff --git a/files/sublime/Library/Packages/User/Preferences.sublime-settings b/files/sublime/Library/Packages/User/Preferences.sublime-settings deleted file mode 100644 index 812fd296a..000000000 --- a/files/sublime/Library/Packages/User/Preferences.sublime-settings +++ /dev/null @@ -1,37 +0,0 @@ -{ - "color_scheme": "Packages/Color Scheme - Default/Cobalt.tmTheme", - "font_size": 12.0, - "ignored_packages": - [ - "Vintage" - ], - "rulers": - [ - 80 - ], - "line_numbers": true, - "gutter": true, - "margin": 4, - "fold_buttons": true, - "fade_fold_buttons": true, - "spell_check": false, - "tab_size": 2, - "translate_tabs_to_spaces": true, - "detect_indentation": true, - "auto_indent": true, - "smart_indent": true, - "trim_automatic_white_space": false, - "auto_match_enabled": true, - "draw_minimap_border": false, - "highlight_line": true, - "match_brackets": true, - "match_selection": true, - "draw_white_space": "selection", - "trim_trailing_white_space_on_save": false, - "ensure_newline_at_eof_on_save": false, - "folder_exclude_patterns": ["node_modules", ".svn", ".git", ".hg", "CVS", "vendor", ".bundle", ".vagrant"], - "file_exclude_patterns": ["*.pyc", "*.pyo", "*.exe", "*.dll", "*.obj","*.o", "*.a", "*.lib", "*.so", "*.dylib", "*.ncb", "*.sdf", "*.suo", "*.pdb", "*.idb", ".DS_Store", "*.class", "*.psd", "*.db", "*.sublime-workspace"], - "binary_file_patterns": ["generated/*", "*.tbz2", "*.gzip", "*.jpg", "*.jpeg", "*.png", "*.gif", "*.ttf", "*.tga", "*.dds", "*.ico", "*.eot", "*.pdf", "*.swf", "*.jar", "*.zip"] - "auto_complete": false, - "auto_complete_commit_on_tab": true, -} diff --git a/files/sublime/Markdown.sublime-settings b/files/sublime/Markdown.sublime-settings new file mode 100644 index 000000000..c6c9b9459 --- /dev/null +++ b/files/sublime/Markdown.sublime-settings @@ -0,0 +1,7 @@ +{ + "auto_complete": false, + "extensions": + [ + "txt" + ] +} diff --git a/files/sublime/Plain text.sublime-settings b/files/sublime/Plain text.sublime-settings new file mode 100644 index 000000000..c9fb4e6e2 --- /dev/null +++ b/files/sublime/Plain text.sublime-settings @@ -0,0 +1,5 @@ +{ + "extensions": + [ + ] +} diff --git a/files/sublime/Preferences.sublime-settings b/files/sublime/Preferences.sublime-settings new file mode 100644 index 000000000..0633567f6 --- /dev/null +++ b/files/sublime/Preferences.sublime-settings @@ -0,0 +1,404 @@ +{ + "added_words": + [ + "Kubernetes", + "Ansible", + "Mesos", + "de", + "K8s", + "stateful", + "filesystem", + "cron", + "kubeadm", + "kops", + "Terraform", + "geerlingguy", + "kubernetes", + "playbooks", + "Vagrantfile", + "lang", + "config", + "debian9", + "vm", + "virtualbox", + "cpus", + "ip", + "hostname", + "k8s", + "ansible", + "playbook", + "yml", + "terabyte", + "plugin", + "kube", + "pre", + "kubelet", + "playbook's", + "dev", + "debian", + "ce", + "amd64", + "src", + "cidr", + "kubectl", + "sudo", + "su", + "v1", + "etcd", + "Ansible's", + "openshift", + "nginx", + "metadata", + "apps", + "app", + "namespace", + "a4d", + "yaml", + "linenos", + "3m", + "inline", + "http", + "api", + "ok", + "init", + "rbac", + "gz", + "linux", + "v2", + "https", + "unarchive", + "usr", + "dest", + "tmp", + "cp", + "stdout", + "admin", + "io", + "dns", + "phpmyadmin", + "wordpress", + "jenkins", + "drupal", + "Ceph", + "Gluster", + "Dramble", + "Plugins", + "Jinja", + "templating", + "Dockerfiles", + "Dockerfile", + "Geerling", + "busybox", + "rmi", + "ps", + "localhost", + "python2", + "ubuntu1604", + "angstwad", + "Ubuntu", + "Angstwad's", + "www", + "mysql", + "env", + "py", + "mkdir", + "Werkzeug", + "sqlalchemy", + "html", + "Jinja2", + "libmysqlclient", + "j2", + "ubuntu16", + "awk", + "sbin", + "everything's", + "cd", + "plugins", + "winrm", + "saltstack", + "Hubot", + "hubot", + "args", + "js", + "npm", + "chdir", + "lineinfile", + "json", + "regexp", + "redis", + "heroku", + "a4dbot", + "Slack's", + "bot's", + "lifecycle", + "microservices", + "wildcard", + "Encrypt's", + "crypto", + "ssl", + "privkey", + "pem", + "csr", + "fullchain", + "selfsigned", + "pyopenssl", + "libssl", + "distros", + "iptables", + "cfg", + "tcp", + "python3", + "distro", + "vhosts", + "docroot", + "dir", + "refactor", + "idempotently", + "conf", + "Keychain", + "webservers", + "xyz", + "dbservers", + "httpd", + "rgb", + "dict", + "jinja", + "blog", + "Mazer's", + "Cisco", + "mv", + "endif", + "plugin's", + "versioning", + "namespaced", + "md", + "ruleset", + "ntp", + "parseable", + "foo", + "apache2", + "Diff", + "diffing", + "drush", + "php", + "url", + "multiline", + "nocows", + "java", + "workflows", + "devops", + "username", + "online", + "github", + "awx", + "cowsay", + "workflow", + "Rackspace", + "Uninstalling", + "uninstall", + "walkthrough", + "webhooks", + "Grafana", + "Rundeck", + "Drupal's", + "Symfony", + "Laravel", + "Joomla", + "idempotence", + "Drush's", + "Solr", + "solr", + "sha512", + "Solr's", + "openjdk", + "jdk", + "Ubuntu's", + "org", + "lucene", + "tgz", + "wget", + "txt", + "Andretti", + "devel", + "chkconfig", + "dicts", + "atl", + "subdomains", + "janedoe", + "vvvv", + "Vagrantfiles", + "admins", + "Remi", + "repo", + "epel", + "remi", + "rpms", + "remirepo", + "pki", + "gpg", + "enablerepo", + "nogpgcheck", + "firewalld", + "Remi's", + "disablerepo", + "req", + "scp", + "rsync", + "stderr", + "Forever's", + "nohup", + "app's", + "nodejs", + "pycurl", + "acl", + "ondrej", + "ppa", + "sendmail", + "php7", + "cli", + "gd", + "opcache", + "xml", + "mbstring", + "pdo", + "apcu", + "libpcre3", + "libapache2", + "mysqldb", + "ufw", + "a2enmod", + "virtualhost", + "a2ensite", + "a2dissite", + "symlinking", + "webmaster", + "ini", + "codebase", + "priv", + "cnf", + "phar" + ], + "auto_complete_commit_on_tab": true, + "auto_complete_delay": 200, + "auto_indent": true, + "auto_match_enabled": true, + "binary_file_patterns": + [ + "generated/*", + "*.tbz2", + "*.gzip", + "*.jpg", + "*.jpeg", + "*.png", + "*.gif", + "*.ttf", + "*.tga", + "*.dds", + "*.ico", + "*.eot", + "*.pdf", + "*.swf", + "*.jar", + "*.zip" + ], + "color_scheme": "Packages/User/Cobalt (SL).tmTheme", + "detect_indentation": true, + "draw_minimap_border": false, + "draw_white_space": "selection", + "ensure_newline_at_eof_on_save": false, + "fade_fold_buttons": true, + "file_exclude_patterns": + [ + "*.pyc", + "*.pyo", + "*.exe", + "*.dll", + "*.obj", + "*.o", + "*.a", + "*.lib", + "*.so", + "*.dylib", + "*.ncb", + "*.sdf", + "*.suo", + "*.pdb", + "*.idb", + ".DS_Store", + "*.class", + "*.psd", + "*.db", + "*.sublime-workspace" + ], + "fold_buttons": true, + "folder_exclude_patterns": + [ + "node_modules", + ".svn", + ".git", + ".hg", + "CVS", + "vendor", + ".bundle", + ".vagrant" + ], + "font_size": 15.0, + "gpu_window_buffer": false, + "gutter": true, + "highlight_line": true, + "ignored_packages": + [ + "Vintage", + ], + "ignored_words": + [ + "0000ff", + "00f", + "12m", + "13m", + "5d", + "5m", + "6d", + "Phergie", + "Sutcliffe's", + "Uvh", + "ansicolor", + "awxcompose", + "configfile", + "examplenodeapp", + "getcomposer", + "googleapis", + "johndoe", + "johndoe1234", + "modifyvm", + "modulename", + "msg", + "node1", + "node2", + "oo", + "phergie", + "rf", + "rolename", + "si", + "v1beta1", + "var1", + "var2", + "varname", + "vg" + ], + "line_numbers": true, + "margin": 4, + "match_brackets": true, + "match_selection": true, + "rulers": + [ + 80 + ], + "smart_indent": true, + "spell_check": false, + "tab_size": 2, + "theme": "auto", + "translate_tabs_to_spaces": true, + "trim_automatic_white_space": false, + "trim_trailing_white_space_on_save": false, +} diff --git a/files/sublime/WordCount.sublime-settings b/files/sublime/WordCount.sublime-settings new file mode 100644 index 000000000..921d2b845 --- /dev/null +++ b/files/sublime/WordCount.sublime-settings @@ -0,0 +1,3 @@ +{ + "whitelist_syntaxes": ["Plain text", "Markdown"] +} diff --git a/main.yml b/main.yml index 0c3744cac..130a98f95 100644 --- a/main.yml +++ b/main.yml @@ -44,6 +44,10 @@ when: configure_dock tags: ['dock'] + - import_tasks: tasks/sublime-text.yml + when: configure_sublime + tags: ['sublime-text'] + - name: Run configured post-provision ansible task files. include_tasks: "{{ outer_item }}" loop_control: diff --git a/tasks/sublime-text.yml b/tasks/sublime-text.yml new file mode 100644 index 000000000..349df9ecd --- /dev/null +++ b/tasks/sublime-text.yml @@ -0,0 +1,29 @@ +--- +- name: Ensure Sublime Text directories exist. + file: + path: "{{ item }}" + state: directory + loop: + - "{{ sublime_base_path }}/{{ sublime_config_path }}" + - "{{ sublime_base_path }}/Installed Packages" + +- name: Ensure Sublime Package Control is installed. + get_url: + url: "https://packagecontrol.io/Package%20Control.sublime-package" + dest: "{{ sublime_base_path }}/Installed Packages/Package Control.sublime-package" + +- name: Ensure Sublime Package Control Packages are configured. + template: + src: templates/Package_Control.sublime-settings.j2 + dest: "{{ sublime_base_path }}/{{ sublime_config_path }}/Package Control.sublime-settings" + +- name: Ensure Sublime text user Preferences and theme are set. + copy: + src: "files/sublime/{{ item }}" + dest: "{{ sublime_base_path }}/{{ sublime_config_path }}/{{ item }}" + loop: + - "Cobalt (SL).tmTheme" + - "Markdown.sublime-settings" + - "Plain text.sublime-settings" + - "Preferences.sublime-settings" + - "WordCount.sublime-settings" diff --git a/templates/Package_Control.sublime-settings.j2 b/templates/Package_Control.sublime-settings.j2 new file mode 100755 index 000000000..5275151e4 --- /dev/null +++ b/templates/Package_Control.sublime-settings.j2 @@ -0,0 +1,13 @@ +{ + "auto_upgrade_last_run": null, + "bootstrapped": true, + "in_process_packages": + [ + ], + "installed_packages": + [ +{% for package in sublime_package_control %} + "{{ package }}"{% if not loop.last %},{% endif %} +{% endfor %} +], +} From b3fd01c99126fdc50d108ec79ea4fb89242a09d3 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Sun, 30 May 2021 22:25:53 -0500 Subject: [PATCH 071/115] Fixes #116: Switch from roles and dock tasks to geerlingguy.mac collection. --- README.md | 11 +---------- main.yml | 12 ++++++------ requirements.yml | 6 ++++-- tasks/dock-add.yml | 14 -------------- tasks/dock-remove.yml | 16 ---------------- tasks/dock.yml | 23 ----------------------- 6 files changed, 11 insertions(+), 71 deletions(-) delete mode 100644 tasks/dock-add.yml delete mode 100644 tasks/dock-remove.yml delete mode 100644 tasks/dock.yml diff --git a/README.md b/README.md index 76636b617..4b317d70a 100644 --- a/README.md +++ b/README.md @@ -4,16 +4,7 @@ [![CI][badge-gh-actions]][link-gh-actions] -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 some manual installation steps, but at least it's all documented here. - -This is a work in progress, and is mostly a means for me to document my current Mac's setup. I'll be evolving this playbook over time. - -*See also*: - - - [Boxen](https://github.com/boxen) - - [Battleschool](http://spencer.gibb.us/blog/2014/02/03/introducing-battleschool) - - [osxc](https://github.com/osxc) - - [MWGriffin/ansible-playbooks](https://github.com/MWGriffin/ansible-playbooks) (the original inspiration for this project) +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. ## Installation diff --git a/main.yml b/main.yml index 130a98f95..6d55fe841 100644 --- a/main.yml +++ b/main.yml @@ -12,14 +12,18 @@ tags: ['always'] roles: - - role: geerlingguy.homebrew + - role: elliotweiser.osx-command-line-tools + - role: geerlingguy.mac.homebrew tags: ['homebrew'] - role: geerlingguy.dotfiles when: configure_dotfiles tags: ['dotfiles'] - - role: geerlingguy.mas + - role: geerlingguy.mac.mas when: mas_installed_apps or mas_installed_app_ids tags: ['mas'] + - role: geerlingguy.mac.dock + when: configure_dock + tags: ['dock'] tasks: - import_tasks: tasks/ansible-setup.yml @@ -40,10 +44,6 @@ - import_tasks: tasks/extra-packages.yml tags: ['extra-packages'] - - import_tasks: tasks/dock.yml - when: configure_dock - tags: ['dock'] - - import_tasks: tasks/sublime-text.yml when: configure_sublime tags: ['sublime-text'] diff --git a/requirements.yml b/requirements.yml index 859e6952a..f5815ad80 100644 --- a/requirements.yml +++ b/requirements.yml @@ -1,5 +1,7 @@ --- roles: + - name: elliotweiser.osx-command-line-tools - name: geerlingguy.dotfiles - - name: geerlingguy.homebrew - - name: geerlingguy.mas + +collections: + - name: geerlingguy.mac diff --git a/tasks/dock-add.yml b/tasks/dock-add.yml deleted file mode 100644 index 8a4349c9a..000000000 --- a/tasks/dock-add.yml +++ /dev/null @@ -1,14 +0,0 @@ ---- -- name: See if Dock item {{ item.name | default(item) }} exists. - ansible.builtin.command: "dockutil --find '{{ item.name }}'" - register: dockitem_exists - failed_when: > - "No such file or directory" in dockitem_exists.stdout - or "command not found" in dockitem_exists.stdout - changed_when: false - tags: ['dock'] - -- name: Ensure Dock item {{ item.name | default(item) }} exists. - ansible.builtin.command: "dockutil --add '{{ item.path }}'" - when: dockitem_exists.rc >0 - tags: ['dock'] diff --git a/tasks/dock-remove.yml b/tasks/dock-remove.yml deleted file mode 100644 index 32d99e3e9..000000000 --- a/tasks/dock-remove.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -- name: See if dock item {{ item }} exists. - ansible.builtin.command: - cmd: dockutil --find '{{ item }}' - register: dockitem_exists - changed_when: false - failed_when: > - "No such file or directory" in dockitem_exists.stdout - or "command not found" in dockitem_exists.stdout - tags: ['dock'] - -- name: Ensure Dock item {{ item }} is removed. - ansible.builtin.command: - cmd: dockutil --remove '{{ item }}' - when: dockitem_exists.rc == 0 - tags: ['dock'] diff --git a/tasks/dock.yml b/tasks/dock.yml deleted file mode 100644 index 560d517f4..000000000 --- a/tasks/dock.yml +++ /dev/null @@ -1,23 +0,0 @@ ---- -- name: Install dockutil. - homebrew: - name: dockutil - state: present - notify: - - Clear homebrew cache - -- name: Remove configured Dock items. - ansible.builtin.include_tasks: tasks/dock-remove.yml - loop: "{{ dockitems_remove }}" - -- name: Ensure required dock items exist. - ansible.builtin.include_tasks: tasks/dock-add.yml - loop: "{{ dockitems_persist }}" - -- name: Ensure correct Dock order. - ansible.builtin.command: - cmd: dockutil --move '{{ item.name }}' --position '{{ item.pos }}' - when: - - item.pos is defined - - item.pos > 0 - loop: "{{ dockitems_persist }}" From bc7364fac420d1a72662deb52218277f8a14cf92 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Sun, 30 May 2021 22:40:57 -0500 Subject: [PATCH 072/115] Fix CI for new collections-based world. --- .github/workflows/ci.yml | 2 +- tests/ansible.cfg | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a6e84f1e1..2115e9514 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -58,7 +58,7 @@ jobs: cp tests/ansible.cfg ./ansible.cfg cp tests/inventory ./inventory cp tests/config.yml ./config.yml - ansible-galaxy install -r requirements.yml -p ./roles + ansible-galaxy install -r requirements.yml - name: Test the playbook's syntax. run: ansible-playbook main.yml --syntax-check diff --git a/tests/ansible.cfg b/tests/ansible.cfg index 6c19e9a7f..f8fc6cdba 100644 --- a/tests/ansible.cfg +++ b/tests/ansible.cfg @@ -1,3 +1,2 @@ [defaults] inventory = inventory -roles_path = ../:../roles:./roles From 242211477695eaf5077b145feed431ab14526332 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Mon, 31 May 2021 11:04:31 -0500 Subject: [PATCH 073/115] Make first-time setup instructions slightly more succint. And correct. --- README.md | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 4b317d70a..3458f7ef1 100644 --- a/README.md +++ b/README.md @@ -11,18 +11,13 @@ This playbook installs and configures most of the software I use on my Mac for w 1. Ensure Apple's command line tools are installed (`xcode-select --install` to launch the installer). 2. [Install Ansible](https://docs.ansible.com/ansible/latest/installation_guide/index.html): - 1. Add the following to your `~/.zshrc` file (create one if you don't have one): + 1. Run the following command to add Python 3 to your $PATH: `export PATH="$HOME/Library/Python/3.8/bin:/opt/homebrew/bin:$PATH"` + 2. Install Ansible: `pip3 install ansible` + 3. Install the command line tools when prompted (this may take a few minutes). - ``` - export PATH="$HOME/Library/Python/3.8/bin:/opt/homebrew/bin:$PATH" - ``` - - 2. Source the new profile: `source ~/.zshrc` - 3. Install Ansible: `pip3 install ansible` - - 3. Clone this repository to your local drive. + 3. Clone or download this repository to your local drive. 4. Run `$ ansible-galaxy install -r requirements.yml` inside this directory to install required Ansible roles. - 5. Run `ansible-playbook main.yml --ask-become-pass` inside this directory. Enter your account password when prompted. + 5. Run `ansible-playbook main.yml --ask-become-pass` inside this directory. Enter your macOS account password when prompted for the 'BECOME' password. > 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. From 0f8d899545c2528249abe7e3751e7f0810517f73 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Mon, 31 May 2021 11:27:41 -0500 Subject: [PATCH 074/115] Another tweak to the initial install instructions. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3458f7ef1..4d0d137b1 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,8 @@ This playbook installs and configures most of the software I use on my Mac for w 2. [Install Ansible](https://docs.ansible.com/ansible/latest/installation_guide/index.html): 1. Run the following command to add Python 3 to your $PATH: `export PATH="$HOME/Library/Python/3.8/bin:/opt/homebrew/bin:$PATH"` - 2. Install Ansible: `pip3 install ansible` - 3. Install the command line tools when prompted (this may take a few minutes). + 2. Upgrade Pip: `sudo pip3 install --upgrade pip` + 3. Install Ansible: `pip3 install ansible` 3. Clone or download this repository to your local drive. 4. Run `$ ansible-galaxy install -r requirements.yml` inside this directory to install required Ansible roles. From f2aaae68eaf16faa223f47c76366fde7093f5449 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Mon, 31 May 2021 11:40:03 -0500 Subject: [PATCH 075/115] Tweak one direction in install instructions [skip ci]. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4d0d137b1..d32c352eb 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ This playbook installs and configures most of the software I use on my Mac for w 3. Install Ansible: `pip3 install ansible` 3. Clone or download this repository to your local drive. - 4. Run `$ ansible-galaxy install -r requirements.yml` inside this directory to install required Ansible roles. + 4. Run `ansible-galaxy install -r requirements.yml` inside this directory to install required Ansible roles. 5. Run `ansible-playbook main.yml --ask-become-pass` inside this directory. Enter your macOS account password when prompted for the 'BECOME' password. > 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. From 8765c23c8be67e247bf6d9c3bce5b5e08e1bbf96 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Mon, 31 May 2021 14:23:12 -0500 Subject: [PATCH 076/115] Fixes #119: Remove extraneous Ansible setup tasks. --- main.yml | 3 --- tasks/ansible-setup.yml | 17 ----------------- 2 files changed, 20 deletions(-) delete mode 100644 tasks/ansible-setup.yml diff --git a/main.yml b/main.yml index 6d55fe841..e5b7213c0 100644 --- a/main.yml +++ b/main.yml @@ -26,9 +26,6 @@ tags: ['dock'] tasks: - - import_tasks: tasks/ansible-setup.yml - tags: ['setup'] - - import_tasks: tasks/sudoers.yml when: configure_sudoers tags: ['sudoers'] diff --git a/tasks/ansible-setup.yml b/tasks/ansible-setup.yml deleted file mode 100644 index d474b4a7e..000000000 --- a/tasks/ansible-setup.yml +++ /dev/null @@ -1,17 +0,0 @@ ---- -- name: Ensure Ansible downloads directory exists. - file: - path: "{{ downloads }}" - state: directory - -- name: Ensure /etc/ansible directory exists. - file: - path: /etc/ansible - state: directory - become: true - -- name: Symlink /usr/local/etc/ansible to /etc/ansible. - file: - src: /etc/ansible - path: /usr/local/etc/ansible - state: link From 04c3501fb8c58d85b6632eef3f649629a27e4908 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Wed, 9 Jun 2021 10:08:48 -0500 Subject: [PATCH 077/115] Don't create a new window at startup on Mac in Sublime Text. --- files/sublime/Preferences.sublime-settings | 1 + 1 file changed, 1 insertion(+) diff --git a/files/sublime/Preferences.sublime-settings b/files/sublime/Preferences.sublime-settings index 0633567f6..9b0b873ac 100644 --- a/files/sublime/Preferences.sublime-settings +++ b/files/sublime/Preferences.sublime-settings @@ -302,6 +302,7 @@ "*.zip" ], "color_scheme": "Packages/User/Cobalt (SL).tmTheme", + "create_window_at_startup": false, "detect_indentation": true, "draw_minimap_border": false, "draw_white_space": "selection", From 59240c84927b77141d8011403e4041375657eb1f Mon Sep 17 00:00:00 2001 From: Jez McKean Date: Wed, 23 Jun 2021 17:12:15 +0100 Subject: [PATCH 078/115] update link to ChromeDriver (#128) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d32c352eb..9326cf21d 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ Any variable can be overridden in `config.yml`; see the supporting roles' docume Applications (installed with Homebrew Cask): - - [ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/) + - [ChromeDriver](https://sites.google.com/chromium.org/driver/) - [Docker](https://www.docker.com/) - [Dropbox](https://www.dropbox.com/) - [Firefox](https://www.mozilla.org/en-US/firefox/new/) From ce79f51bbb6bdea097e315a96b6d48cfff2ffe3e Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Wed, 23 Jun 2021 11:14:47 -0500 Subject: [PATCH 079/115] Fixes #127: Replace Sequel Pro with Sequel Ace. --- README.md | 2 +- default.config.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9326cf21d..a658f6c12 100644 --- a/README.md +++ b/README.md @@ -106,7 +106,7 @@ Applications (installed with Homebrew Cask): - [LimeChat](http://limechat.net/mac/) - [MacVim](http://macvim-dev.github.io/macvim/) - [nvALT](http://brettterpstra.com/projects/nvalt/) - - [Sequel Pro](https://www.sequelpro.com/) (MySQL client) + - [Sequel Ace](https://sequel-ace.com) (MySQL client) - [Skitch](https://evernote.com/skitch/) - [Slack](https://slack.com/) - [Sublime Text](https://www.sublimetext.com/) diff --git a/default.config.yml b/default.config.yml index 9871408b0..327a61e59 100644 --- a/default.config.yml +++ b/default.config.yml @@ -76,7 +76,7 @@ homebrew_cask_apps: - google-chrome - handbrake - licecap - - sequel-pro + - sequel-ace - slack - sublime-text - transmit From c42f8822dd7f82ad6ba3c95ca3a136279926c990 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Tue, 2 Nov 2021 22:18:37 -0500 Subject: [PATCH 080/115] Close windows when empty. Please. --- files/sublime/Preferences.sublime-settings | 1 + 1 file changed, 1 insertion(+) diff --git a/files/sublime/Preferences.sublime-settings b/files/sublime/Preferences.sublime-settings index 9b0b873ac..46d6e2f96 100644 --- a/files/sublime/Preferences.sublime-settings +++ b/files/sublime/Preferences.sublime-settings @@ -301,6 +301,7 @@ "*.jar", "*.zip" ], + "close_windows_when_empty": true, "color_scheme": "Packages/User/Cobalt (SL).tmTheme", "create_window_at_startup": false, "detect_indentation": true, From 5b6cf0ab1a33a554641c0a0ef1b8007c1ea4b19c Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Sat, 26 Mar 2022 21:39:51 -0500 Subject: [PATCH 081/115] Skip new FQCN defaults rule in ansible-lint. --- .ansible-lint | 1 + 1 file changed, 1 insertion(+) diff --git a/.ansible-lint b/.ansible-lint index 539d3332f..e6a02bd0f 100644 --- a/.ansible-lint +++ b/.ansible-lint @@ -1,3 +1,4 @@ --- skip_list: - experimental + - fqcn-builtins From 2f819d61bfa62e596b2d29f011eaeac899282980 Mon Sep 17 00:00:00 2001 From: BeansIsFat <24848012+BeansIsFat@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:40:29 -0400 Subject: [PATCH 082/115] Add tag inheritance to post-provision tasks (#146) Imported tasks inherit tags but Included tasks don't. This leads to confusion because included tasks need to have an explicit tag added or they won't run. This is the workaround provided and [documented](https://docs.ansible.com/ansible/latest/user_guide/playbooks_tags.html#tag-inheritance-for-includes-blocks-and-the-apply-keyword) by Ansible to add tag inheritance to included tasks. --- main.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/main.yml b/main.yml index e5b7213c0..000409457 100644 --- a/main.yml +++ b/main.yml @@ -45,9 +45,10 @@ when: configure_sublime tags: ['sublime-text'] - - name: Run configured post-provision ansible task files. - include_tasks: "{{ outer_item }}" - loop_control: - loop_var: outer_item - with_fileglob: "{{ post_provision_tasks|default(omit) }}" + - block: + - name: Run configured post-provision ansible task files. + include_tasks: "{{ outer_item }}" + loop_control: + loop_var: outer_item + with_fileglob: "{{ post_provision_tasks|default(omit) }}" tags: ['post'] From acb6eb4d1b224e39dce47971923928d16c9de4b0 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Thu, 31 Mar 2022 10:37:05 -0500 Subject: [PATCH 083/115] Fix linting issue. --- main.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/main.yml b/main.yml index 000409457..ac7a6f8bd 100644 --- a/main.yml +++ b/main.yml @@ -46,9 +46,9 @@ tags: ['sublime-text'] - block: - - name: Run configured post-provision ansible task files. - include_tasks: "{{ outer_item }}" - loop_control: - loop_var: outer_item - with_fileglob: "{{ post_provision_tasks|default(omit) }}" + - name: Run configured post-provision ansible task files. + include_tasks: "{{ outer_item }}" + loop_control: + loop_var: outer_item + with_fileglob: "{{ post_provision_tasks|default(omit) }}" tags: ['post'] From cb8398cef45c1fd60fd9f9065c68427f75fe803c Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Mon, 4 Apr 2022 10:25:15 -0500 Subject: [PATCH 084/115] Default to installing extra pip packages with pip3. --- tasks/extra-packages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/extra-packages.yml b/tasks/extra-packages.yml index 677148ba9..294fdaace 100644 --- a/tasks/extra-packages.yml +++ b/tasks/extra-packages.yml @@ -21,7 +21,7 @@ name: "{{ item.name | default(item) }}" state: "{{ item.state | default('present') }}" version: "{{ item.version | default(omit) }}" - executable: "{{ item.executable | default(omit) }}" + executable: "{{ item.executable | default('pip3') }}" loop: "{{ pip_packages }}" - name: Install global Ruby gems. From c4ea26a95034173e05a9978b81cd4d8fc3b8f55e Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Fri, 29 Jul 2022 11:56:33 -0500 Subject: [PATCH 085/115] Add full Mac setup guide, adjust defaults for simplicity's sake. --- README.md | 40 +++++----------- default.config.yml | 1 - full-mac-setup.md | 112 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 123 insertions(+), 30 deletions(-) create mode 100644 full-mac-setup.md diff --git a/README.md b/README.md index a658f6c12..a1ed69794 100644 --- a/README.md +++ b/README.md @@ -103,15 +103,11 @@ Applications (installed with Homebrew Cask): - [Handbrake](https://handbrake.fr/) - [Homebrew](http://brew.sh/) - [LICEcap](http://www.cockos.com/licecap/) - - [LimeChat](http://limechat.net/mac/) - - [MacVim](http://macvim-dev.github.io/macvim/) - [nvALT](http://brettterpstra.com/projects/nvalt/) - [Sequel Ace](https://sequel-ace.com) (MySQL client) - - [Skitch](https://evernote.com/skitch/) - [Slack](https://slack.com/) - [Sublime Text](https://www.sublimetext.com/) - [Transmit](https://panic.com/transmit/) (S/FTP client) - - [Vagrant](https://www.vagrantup.com/) Packages (installed with Homebrew): @@ -121,9 +117,9 @@ Packages (installed with Homebrew): - gettext - gifsicle - git + - github/gh/gh - go - gpg - - hub - httpie - iperf - libevent @@ -139,41 +135,27 @@ Packages (installed with Homebrew): - openssl - pv - wget + - wrk + - zsh-history-substring-search 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. Finally, there are a few other preferences and settings added on for various apps and services. -## Future additions +## Full / From-scratch setup guide -### Things that still need to be done manually +Since I've used this playbook to set up something like 20 different Macs, I decided to write up a full 100% from-scratch install for my own reference (everyone's particular install will be slightly different). -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). - - 1. Set JJG-Term as the default Terminal theme (it's installed, but not set as default automatically). - 3. Install all the apps that aren't yet in this setup (see below). - 4. Remap Caps Lock to Escape (requires macOS Sierra 10.12.1+). - 5. Set trackpad tracking rate. - 6. Set mouse tracking rate. - 7. Configure extra Mail and/or Calendar accounts (e.g. Google, Exchange, etc.). - -### Configuration to be added: - - - I have vim configuration in the repo, but I still need to add the actual installation: - ``` - mkdir -p ~/.vim/autoload - mkdir -p ~/.vim/bundle - cd ~/.vim/autoload - curl https://raw.githubusercontent.com/tpope/vim-pathogen/master/autoload/pathogen.vim > pathogen.vim - cd ~/.vim/bundle - git clone git://github.com/scrooloose/nerdtree.git - ``` +You can see my full from-scratch setup document here: [full-mac-setup.md](full-mac-setup.md). ## Testing the Playbook -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. +Many people have asked me if I often wipe my entire workstation and start from scratch just to test changes to the playbook. Nope! This project is [continuously tested on GitHub Actions' macOS infrastructure](https://github.com/geerlingguy/mac-dev-playbook/actions?query=workflow%3ACI). + +You can also run macOS itself inside a VM, for at least some of the required testing (App Store apps and some proprietary software might not install properly). I currently recommend: -Additionally, this project is [continuously tested on GitHub Actions' macOS infrastructure](https://github.com/geerlingguy/mac-dev-playbook/actions?query=workflow%3ACI). + - [UTM](https://mac.getutm.app) + - [Tart](https://github.com/cirruslabs/tart) ## Ansible for DevOps diff --git a/default.config.yml b/default.config.yml index 327a61e59..8ba392b34 100644 --- a/default.config.yml +++ b/default.config.yml @@ -80,7 +80,6 @@ homebrew_cask_apps: - slack - sublime-text - transmit - - vagrant # See `geerlingguy.mas` role documentation for usage instructions. mas_installed_apps: [] diff --git a/full-mac-setup.md b/full-mac-setup.md new file mode 100644 index 000000000..4e9f2d6e0 --- /dev/null +++ b/full-mac-setup.md @@ -0,0 +1,112 @@ +# Full Mac Setup Process (for Jeff Geerling) + +There are some things in life that just can't be automated... or aren't 100% worth the time :( + +This document covers that, at least in terms of setting up a brand new Mac out of the box. + +## Initial configuration of a brand new Mac + +Before starting, I completed Apple's mandatory macOS setup wizard (creating a local user account, and optionally signing into my iCloud account). Once on the macOS desktop, I do the following (in order): + + - Install Ansible (following the guide in [README.md](README.md)) + - **Sign in in App Store** (since `mas` can't sign in automatically) + - Clone mac-dev-playbook to the Mac: `git clone git@github.com:geerlingguy/mac-dev-playbook.git` + - Drop `config.yml` from `~/Dropbox/Apps/Config` to the playbook (copy over the network or using a USB flash drive). + - Run the playbook with `--skip-tags post`. + - If there are errors, you may need to finish up other tasks like installing 'old-fashioned' apps first (since I try to place Photoshop in the Dock and it can't be installed automatically). Then, run the playbook again ;) + - Start Synchronization tasks: + - Open Photos and make sure iCloud sync options are correct + - Open Music, make sure computer is authorized, and set Library sync options + - Open Dropbox, sign in, and set up sync + - Install old-fashioned apps: + - Install [Creative Cloud](https://creativecloud.adobe.com/apps/download/creative-cloud) + - Install Photoshop/Illustrator manually + - (If required:) + - Install [Elgato Stream Deck](https://www.elgato.com/en/downloads) + - Open Livestream profile inside `~/Dropbox/Apps/Config/Stream Deck` + - Install [Elgato Key Light Air (Control Center)](https://www.elgato.com/en/downloads) + - Install [Autodesk Fusion 360](https://www.autodesk.com) + - Install Microsoft Office Home & Student 2019 (https://account.microsoft.com/services/) + - Install [Fritzing](https://fritzing.org/download/) + - Install Meshmixer (but it looks like it's gone now!) + - Configure FastMail account: + - Log into Fastmail + - Go to settings, go to the setup page for macOS Mail + - Download the profile and double click to install + - Head to the 'Profiles' System Preference pane and click install + - Open Calendar and enable personal Google CalDAV account (you have to manually sign in). + - Manually copy `~/Development` folder from another Mac (to save time). + - Manual settings to automate someday: + - System Preferences: + - Accessibility > Display > Reduce transparency + - Keyboard > Modifier Keys... > Caps Lock to Esc + - Safari: + - View > Show Status Bar + - Preferences > Advanced > "Show full website address" + - Preferences > Advanced > "Show Develop menu in menu bar" + - Dock: + - Add jgeerling, Downloads, Applications, and Video Projects folders + - Terminal: + - Preferences > Profiles > Set JJG-Term as the default theme + - _After Dropbox Sync completes_: Run the playbook with `--tags post` to complete setup. + - Symlink the synchronized `config.yml` into the playbook dir: `ln -s /Users/jgeerling/Dropbox/Apps/Config/mac-dev-playbook/config.yml /Users/jgeerling/Development/mac-dev-playbook/config.yml` + - These things might be automatable, but I do them manually right now: + - Configure Time Machine backup drive and [Time Machine Editor](https://tclementdev.com/timemachineeditor/) (if needed) + - Install Wireguard from App Store and add configuration (if needed) + +## To Wrap in Post-provision automation + +The following tasks have to wait for the initial Dropbox sync to complete before they'll succeed. So ideally I'll stick this all in a post-provision script but somehow flag it not to run on first provision. + +``` +# ZSH Aliases. +ln -s /Users/jgeerling/Dropbox/Apps/Config/.aliases /Users/jgeerling/.aliases + +# Electrum BTC Wallet. +ln -s /Users/jgeerling/Dropbox/Apps/Electrum/default_wallet /Users/jgeerling/.electrum/wallets/default_wallet + +# SSH setup. +ssh-keygen # and create a default key to set up .ssh folder +sudo ln -s /Users/jgeerling/Dropbox/Apps/Config/ssh/config ~/.ssh/config +# TODO - Manually copy any shared SSH keys that are needed. + +# Ansible setup. +sudo mkdir -p /etc/ansible +sudo ln -s /Users/jgeerling/Dropbox/Apps/Config/ansible/ansible.cfg /etc/ansible/ansible.cfg +sudo ln -s /Users/jgeerling/Dropbox/Apps/Config/ansible/hosts /etc/ansible/hosts +sudo ln -s /Users/jgeerling/Dropbox/VMs/roles /etc/ansible/roles +mkdir -p /Users/jgeerling/.ansible +ln -s /Users/jgeerling/Dropbox/Apps/Config/ansible/galaxy_token /Users/jgeerling/.ansible/galaxy_token +ln -s /Users/jgeerling/Dropbox/Apps/Config/ansible/mm-vault-password.txt /Users/jgeerling/.ansible/mm-vault-password.txt +ln -s /Users/jgeerling/Dropbox/VMs/ /Users/jgeerling/.ansible/collections + +# Final Cut Pro setup. (Open Motion first) +cp -r /Users/jgeerling/Dropbox/Apps/Config/Motion/Motion\ Templates.localized/ /Users/jgeerling/Movies/Motion\ Templates.localized/ +cp -r /Users/jgeerling/Dropbox/Apps/Config/Motion/Text\ Styles/ /Users/jgeerling/Library/Application\ Support/Motion/Library/Text\ Styles.localized/ + +# Sequel Ace favorites. (Open Sequel Ace first) +cp /Users/jgeerling/Dropbox/Apps/Config/Sequel\ Ace/Favorites.plist /Users/jgeerling/Library/Containers/com.sequel-ace.sequel-ace/Data/Library/Application\ Support/Sequel\ Ace/Data/Favorites.plist + +# Font setup. +cp ~/Dropbox/Apps/Config/Fonts/* ~/Library/Fonts/ + +# Vim setup. +mkdir -p ~/.vim/autoload +mkdir -p ~/.vim/bundle +cd ~/.vim/autoload +curl https://raw.githubusercontent.com/tpope/vim-pathogen/master/autoload/pathogen.vim > pathogen.vim +cd ~/.vim/bundle +git clone git://github.com/scrooloose/nerdtree.git +``` + +## When formatting old Mac + + - Sign out of Adobe Creative Cloud + - Sign out of Panic Sync in Transmit + - Deauthorize Apple Music in iTunes/Music App + - Make sure anything new merged into `~/Dropbox/Apps/Config`: + - Fonts from ~/Library/Fonts + - Motion Plugins from ~/Movies/Motion + - Final Cut Pro Text Styles in ~/Library/Application Support/Motion/Library/Text Styles + - Sequel Ace shortcuts from ~/Library/Containers/com.sequel-ace.sequel-ace/Data/Library/Application\ Support/Sequel\ Ace/Data/Favorites.plist + - Follow Apple's guide (TODO) From bf41747c81db7312ca52c9c2990463f2daada3e2 Mon Sep 17 00:00:00 2001 From: Pavel Zwerschke Date: Sun, 28 Aug 2022 19:11:48 +0200 Subject: [PATCH 086/115] Move to macOS-11 and macOS-12 (#164) --- .github/workflows/ci.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2115e9514..e893a3ed7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,7 +36,8 @@ jobs: strategy: matrix: os: - - macos-10.15 + - macos-12 + - macos-11 steps: - name: Check out the codebase. @@ -51,7 +52,9 @@ jobs: sudo rm -rf /Applications/Google\ Chrome.app - name: Install test dependencies. - run: sudo pip3 install ansible + run: | + sudo pip3 install --upgrade pip + sudo pip3 install ansible - name: Set up the test environment. run: | From e2da170b97bd3b0e64f3972ff037b4f8c94e4fff Mon Sep 17 00:00:00 2001 From: Gemma Hentsch Date: Tue, 21 Feb 2023 04:49:04 +0000 Subject: [PATCH 087/115] Change exported python path to 3.9 (#174) Ventura is using Python 3.9 by default. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a1ed69794..45171e104 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ This playbook installs and configures most of the software I use on my Mac for w 1. Ensure Apple's command line tools are installed (`xcode-select --install` to launch the installer). 2. [Install Ansible](https://docs.ansible.com/ansible/latest/installation_guide/index.html): - 1. Run the following command to add Python 3 to your $PATH: `export PATH="$HOME/Library/Python/3.8/bin:/opt/homebrew/bin:$PATH"` + 1. Run the following command to add Python 3 to your $PATH: `export PATH="$HOME/Library/Python/3.9/bin:/opt/homebrew/bin:$PATH"` 2. Upgrade Pip: `sudo pip3 install --upgrade pip` 3. Install Ansible: `pip3 install ansible` From 9fab0a2cf9e66eca68f2662474a5a283e4cd3418 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Mon, 20 Feb 2023 22:55:24 -0600 Subject: [PATCH 088/115] Some lint fixes. --- .ansible-lint | 7 ++++++- main.yml | 10 ++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/.ansible-lint b/.ansible-lint index e6a02bd0f..9bbcef82b 100644 --- a/.ansible-lint +++ b/.ansible-lint @@ -1,4 +1,9 @@ --- skip_list: + - schema[meta] + - role-name - experimental - - fqcn-builtins + - fqcn + - name[missing] + - no-changed-when + - risky-file-permissions diff --git a/main.yml b/main.yml index ac7a6f8bd..500c91766 100644 --- a/main.yml +++ b/main.yml @@ -1,5 +1,6 @@ --- -- hosts: all +- name: Configure host. + hosts: all vars_files: - default.config.yml @@ -45,10 +46,11 @@ when: configure_sublime tags: ['sublime-text'] - - block: + - name: Run post-provision task files in a block. + tags: ['post'] + block: - name: Run configured post-provision ansible task files. include_tasks: "{{ outer_item }}" loop_control: loop_var: outer_item - with_fileglob: "{{ post_provision_tasks|default(omit) }}" - tags: ['post'] + with_fileglob: "{{ post_provision_tasks | default(omit) }}" From 634dddd12cfafc0f5b19edd5ec609be0ecf2d738 Mon Sep 17 00:00:00 2001 From: skye Date: Sat, 8 Apr 2023 00:03:41 +0930 Subject: [PATCH 089/115] Add Apple formatting/erasure guide (#179) --- full-mac-setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/full-mac-setup.md b/full-mac-setup.md index 4e9f2d6e0..7408da911 100644 --- a/full-mac-setup.md +++ b/full-mac-setup.md @@ -109,4 +109,4 @@ git clone git://github.com/scrooloose/nerdtree.git - Motion Plugins from ~/Movies/Motion - Final Cut Pro Text Styles in ~/Library/Application Support/Motion/Library/Text Styles - Sequel Ace shortcuts from ~/Library/Containers/com.sequel-ace.sequel-ace/Data/Library/Application\ Support/Sequel\ Ace/Data/Favorites.plist - - Follow Apple's guide (TODO) + - Follow Apple's guide [here](https://support.apple.com/en-au/HT212749) From f41e9235130b119a0e8dda8678a079a99f142e20 Mon Sep 17 00:00:00 2001 From: Konstantin Auffinger <62616071+kauffinger@users.noreply.github.com> Date: Sun, 9 Apr 2023 22:56:53 +0200 Subject: [PATCH 090/115] Delete Firefox binary in CI (#180) Brew finds a firefox binary in `/usr/local/bin/firefox` and thus fails to install. --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e893a3ed7..d8abd2893 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -50,6 +50,7 @@ jobs: run: | sudo rm -rf /Applications/Firefox.app sudo rm -rf /Applications/Google\ Chrome.app + sudo rm -rf /usr/local/bin/firefox - name: Install test dependencies. run: | From 57798abef118154520562a13b04a4c25505e9c09 Mon Sep 17 00:00:00 2001 From: Daniel McFarland Date: Sun, 9 Apr 2023 21:57:38 +0100 Subject: [PATCH 091/115] Update README.md (#170) When running the command to add Python 3 to your $PATH it would appear macOS 12 and higher use python 3.9 opposed to 3.8 From 9dd51416cf926052d9ba3fcec27c2c574667e4e1 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Mon, 10 Jul 2023 18:05:14 -0500 Subject: [PATCH 092/115] Update stale workflow. --- .github/stale.yml | 56 ------------------------------------- .github/workflows/stale.yml | 34 ++++++++++++++++++++++ 2 files changed, 34 insertions(+), 56 deletions(-) delete mode 100644 .github/stale.yml create mode 100644 .github/workflows/stale.yml diff --git a/.github/stale.yml b/.github/stale.yml deleted file mode 100644 index c7ff12754..000000000 --- a/.github/stale.yml +++ /dev/null @@ -1,56 +0,0 @@ -# Configuration for probot-stale - https://github.com/probot/stale - -# Number of days of inactivity before an Issue or Pull Request becomes stale -daysUntilStale: 90 - -# Number of days of inactivity before an Issue or Pull Request with the stale label is closed. -# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. -daysUntilClose: 30 - -# Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled) -onlyLabels: [] - -# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable -exemptLabels: - - pinned - - security - - planned - -# Set to true to ignore issues in a project (defaults to false) -exemptProjects: false - -# Set to true to ignore issues in a milestone (defaults to false) -exemptMilestones: false - -# Set to true to ignore issues with an assignee (defaults to false) -exemptAssignees: false - -# Label to use when marking as stale -staleLabel: stale - -# Limit the number of actions per hour, from 1-30. Default is 30 -limitPerRun: 30 - -pulls: - markComment: |- - 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! - - 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. - - unmarkComment: >- - This pull request is no longer marked for closure. - - closeComment: >- - 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. - -issues: - markComment: |- - 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! - - 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. - - unmarkComment: >- - This issue is no longer marked for closure. - - closeComment: >- - 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. diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 000000000..5a6647f2b --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,34 @@ +--- +name: Close inactive issues +'on': + schedule: + - cron: "55 18 * * 4" # semi-random time + +jobs: + close-issues: + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + steps: + - uses: actions/stale@v8 + with: + days-before-stale: 120 + days-before-close: 60 + exempt-issue-labels: bug,pinned,security,planned + exempt-pr-labels: bug,pinned,security,planned + stale-issue-label: "stale" + stale-pr-label: "stale" + stale-issue-message: | + 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! + + 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. + close-issue-message: | + 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. + stale-pr-message: | + This pr 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! + + 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. + close-pr-message: | + This pr 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. + repo-token: ${{ secrets.GITHUB_TOKEN }} From e3d0cb7718ba1194de07d27b59fa351c25df59a5 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Mon, 10 Jul 2023 18:06:48 -0500 Subject: [PATCH 093/115] Fix linting. --- .yamllint | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.yamllint b/.yamllint index 84ecaec77..71f676422 100644 --- a/.yamllint +++ b/.yamllint @@ -7,4 +7,4 @@ rules: level: warning ignore: | - .github/stale.yml + .github/workflows/stale.yml From f885708e1f5fcde038ace0ca0b38d984a3c09071 Mon Sep 17 00:00:00 2001 From: Peter Ramsing Date: Fri, 29 Sep 2023 18:42:06 -0700 Subject: [PATCH 094/115] Changes to new gh package (#187) Resolves this error: failed: [localhost] (item=github/gh/gh) => {"ansible_loop_var": "item", "changed": false, "item": "github/gh/gh", "msg": "==> Tapping github/gh\nCloning into '/opt/homebrew/Library/Taps/github/homebrew-gh'...\nTapped (14 files, 55.3KB).\nWarning: Formula github/gh/gh was renamed to gh.\nWarning: No available formula or cask with the name \"github/gh/gh\".\nWarning: Formula github/gh/gh was renamed to gh."} --- README.md | 2 +- default.config.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 45171e104..a11b92ce4 100644 --- a/README.md +++ b/README.md @@ -117,7 +117,7 @@ Packages (installed with Homebrew): - gettext - gifsicle - git - - github/gh/gh + - gh - go - gpg - httpie diff --git a/default.config.yml b/default.config.yml index 8ba392b34..95de6829b 100644 --- a/default.config.yml +++ b/default.config.yml @@ -42,7 +42,7 @@ homebrew_installed_packages: - gettext - gifsicle - git - - github/gh/gh + - gh - go - gpg - httpie From c99ff5da76d7a077494ecb86a58bd5db44df6e70 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Thu, 4 Jan 2024 19:30:30 -0600 Subject: [PATCH 095/115] Fixes #190: Don't tap homebrew cask or core anymore. --- default.config.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/default.config.yml b/default.config.yml index 95de6829b..2ee3f10b8 100644 --- a/default.config.yml +++ b/default.config.yml @@ -63,9 +63,7 @@ homebrew_installed_packages: - wrk - zsh-history-substring-search -homebrew_taps: - - homebrew/core - - homebrew/cask +homebrew_taps: [] homebrew_cask_appdir: /Applications homebrew_cask_apps: From c5c92c1b8ccf4c431f5c5697091cff0d3dafb7dc Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Sat, 3 Feb 2024 22:09:15 -0600 Subject: [PATCH 096/115] Fixes #195: Remove disabled mcrypt package. --- README.md | 1 - default.config.yml | 1 - 2 files changed, 2 deletions(-) diff --git a/README.md b/README.md index a11b92ce4..7e70bb051 100644 --- a/README.md +++ b/README.md @@ -124,7 +124,6 @@ Packages (installed with Homebrew): - iperf - libevent - sqlite - - mcrypt - nmap - node - nvm diff --git a/default.config.yml b/default.config.yml index 2ee3f10b8..cfd9cf8fb 100644 --- a/default.config.yml +++ b/default.config.yml @@ -49,7 +49,6 @@ homebrew_installed_packages: - iperf - libevent - sqlite - - mcrypt - nmap - node - nvm From 358f6631d03d5671ee018d9f3eccbc7c76ce4664 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20M=C3=BChlbach?= Date: Wed, 26 Jun 2024 22:10:17 +0200 Subject: [PATCH 097/115] chore(config): Remove obsolete downloads config (#203) Relates to: https://github.com/geerlingguy/mac-dev-playbook/discussions/202 --- default.config.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/default.config.yml b/default.config.yml index cfd9cf8fb..7f9bc3073 100644 --- a/default.config.yml +++ b/default.config.yml @@ -1,6 +1,4 @@ --- -downloads: ~/.ansible-downloads/ - configure_dotfiles: true configure_terminal: true configure_osx: true From b660bf1c2b444d05572cf06cdc9f61eb86ffb8da Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Mon, 11 Nov 2024 21:47:08 -0600 Subject: [PATCH 098/115] Add a few notes from new Sonoma install. --- full-mac-setup.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/full-mac-setup.md b/full-mac-setup.md index 7408da911..162213d9d 100644 --- a/full-mac-setup.md +++ b/full-mac-setup.md @@ -18,9 +18,9 @@ Before starting, I completed Apple's mandatory macOS setup wizard (creating a lo - Open Photos and make sure iCloud sync options are correct - Open Music, make sure computer is authorized, and set Library sync options - Open Dropbox, sign in, and set up sync - - Install old-fashioned apps: - - Install [Creative Cloud](https://creativecloud.adobe.com/apps/download/creative-cloud) - - Install Photoshop/Illustrator manually + - Install or complete setup for old-fashioned apps: + - Open Creative Cloud, sign in, and install needed apps + - Open iStat Menus and configure CPU/Net/Temp Combined view - (If required:) - Install [Elgato Stream Deck](https://www.elgato.com/en/downloads) - Open Livestream profile inside `~/Dropbox/Apps/Config/Stream Deck` @@ -28,7 +28,6 @@ Before starting, I completed Apple's mandatory macOS setup wizard (creating a lo - Install [Autodesk Fusion 360](https://www.autodesk.com) - Install Microsoft Office Home & Student 2019 (https://account.microsoft.com/services/) - Install [Fritzing](https://fritzing.org/download/) - - Install Meshmixer (but it looks like it's gone now!) - Configure FastMail account: - Log into Fastmail - Go to settings, go to the setup page for macOS Mail @@ -39,13 +38,14 @@ Before starting, I completed Apple's mandatory macOS setup wizard (creating a lo - Manual settings to automate someday: - System Preferences: - Accessibility > Display > Reduce transparency - - Keyboard > Modifier Keys... > Caps Lock to Esc + - Keyboard > Keyboard Shortcuts... > Modifier Keys... > Caps Lock to Esc - Safari: - View > Show Status Bar - Preferences > Advanced > "Show full website address" - - Preferences > Advanced > "Show Develop menu in menu bar" + - Preferences > Advanced > "Show features for web developers" + - Install the 'Return YouTube Dislike' Userscript in Userscripts - Dock: - - Add jgeerling, Downloads, Applications, and Video Projects folders + - Add jgeerling, Downloads, and Applications folders - Terminal: - Preferences > Profiles > Set JJG-Term as the default theme - _After Dropbox Sync completes_: Run the playbook with `--tags post` to complete setup. From 3e46828d301e5a161a1bde2e5f40c0ee5fd9c7e1 Mon Sep 17 00:00:00 2001 From: Florian Weber Date: Tue, 12 Nov 2024 06:22:01 +0100 Subject: [PATCH 099/115] Run tests on Mac OS 14 and 15 (#209) * Run tests on Mac OS 14 and 15 * Update uninstall-homebrew.sh * Don't die on bad terminal defaults request. --------- Co-authored-by: Jeff Geerling --- .github/workflows/ci.yml | 4 ++-- tasks/terminal.yml | 1 + tests/uninstall-homebrew.sh | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d8abd2893..a31961853 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,8 +36,8 @@ jobs: strategy: matrix: os: - - macos-12 - - macos-11 + - macos-15 + - macos-14 steps: - name: Check out the codebase. diff --git a/tasks/terminal.yml b/tasks/terminal.yml index f4a26789a..b1a6d6e8c 100644 --- a/tasks/terminal.yml +++ b/tasks/terminal.yml @@ -4,6 +4,7 @@ command: defaults read com.apple.terminal 'Default Window Settings' register: terminal_theme changed_when: false + failed_when: false check_mode: false - name: Ensure custom Terminal profile is added. diff --git a/tests/uninstall-homebrew.sh b/tests/uninstall-homebrew.sh index d6d4c966c..40e1bf183 100755 --- a/tests/uninstall-homebrew.sh +++ b/tests/uninstall-homebrew.sh @@ -11,3 +11,4 @@ sudo ./uninstall.sh --force sudo rm -rf /usr/local/Homebrew sudo rm -rf /usr/local/Caskroom sudo rm -rf /usr/local/bin/brew +sudo rm -rf /opt/homebrew From bf5662cb2450414926af699d0aae7a51e21f7fa3 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Mon, 11 Nov 2024 23:41:11 -0600 Subject: [PATCH 100/115] A few more tweaks for my ultimate setup guide. --- full-mac-setup.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/full-mac-setup.md b/full-mac-setup.md index 162213d9d..171fd900c 100644 --- a/full-mac-setup.md +++ b/full-mac-setup.md @@ -33,7 +33,9 @@ Before starting, I completed Apple's mandatory macOS setup wizard (creating a lo - Go to settings, go to the setup page for macOS Mail - Download the profile and double click to install - Head to the 'Profiles' System Preference pane and click install - - Open Calendar and enable personal Google CalDAV account (you have to manually sign in). + - Open Calendar and sign into Google Accounts (have to manually sign in): + - Personal + - Work - Manually copy `~/Development` folder from another Mac (to save time). - Manual settings to automate someday: - System Preferences: @@ -51,7 +53,7 @@ Before starting, I completed Apple's mandatory macOS setup wizard (creating a lo - _After Dropbox Sync completes_: Run the playbook with `--tags post` to complete setup. - Symlink the synchronized `config.yml` into the playbook dir: `ln -s /Users/jgeerling/Dropbox/Apps/Config/mac-dev-playbook/config.yml /Users/jgeerling/Development/mac-dev-playbook/config.yml` - These things might be automatable, but I do them manually right now: - - Configure Time Machine backup drive and [Time Machine Editor](https://tclementdev.com/timemachineeditor/) (if needed) + - Configure Time Machine backup drive and set Time Machine backups to daily instead of hourly - Install Wireguard from App Store and add configuration (if needed) ## To Wrap in Post-provision automation From 347ea7ac92f3f997bade5773a43273dc18ce6892 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Sat, 16 Nov 2024 11:28:34 -0600 Subject: [PATCH 101/115] Add pngpaste to default set of packages. --- default.config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/default.config.yml b/default.config.yml index 7f9bc3073..3ddb672b5 100644 --- a/default.config.yml +++ b/default.config.yml @@ -51,6 +51,7 @@ homebrew_installed_packages: - node - nvm - php + - pngpaste - ssh-copy-id - cowsay - readline From 6e028c040bef8f084c17ed9befa0495174d16e80 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Wed, 27 Nov 2024 23:41:55 -0600 Subject: [PATCH 102/115] Remove cowsay, since it's sadly not available in homebrew now. --- README.md | 2 -- default.config.yml | 1 - tests/config.yml | 1 - 3 files changed, 4 deletions(-) diff --git a/README.md b/README.md index 7e70bb051..2605cd403 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,6 @@ You can override any of the defaults configured in `default.config.yml` by creat ```yaml homebrew_installed_packages: - - cowsay - git - go @@ -129,7 +128,6 @@ Packages (installed with Homebrew): - nvm - php - ssh-copy-id - - cowsay - readline - openssl - pv diff --git a/default.config.yml b/default.config.yml index 3ddb672b5..93e123bdf 100644 --- a/default.config.yml +++ b/default.config.yml @@ -53,7 +53,6 @@ homebrew_installed_packages: - php - pngpaste - ssh-copy-id - - cowsay - readline - openssl - pv diff --git a/tests/config.yml b/tests/config.yml index e95fb9294..9631a151e 100644 --- a/tests/config.yml +++ b/tests/config.yml @@ -5,7 +5,6 @@ homebrew_installed_packages: - gettext - sqlite - ssh-copy-id - - cowsay - readline - pv - wget From 4fe7e8bbd19d7cf891161ed112b8110e2660728c Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Sun, 26 Jan 2025 09:30:55 -0600 Subject: [PATCH 103/115] Update link to GitHub Actions CI. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2605cd403..6fd53878a 100644 --- a/README.md +++ b/README.md @@ -162,5 +162,5 @@ Check out [Ansible for DevOps](https://www.ansiblefordevops.com/), which teaches This project was created by [Jeff Geerling](https://www.jeffgeerling.com/) (originally inspired by [MWGriffin/ansible-playbooks](https://github.com/MWGriffin/ansible-playbooks)). -[badge-gh-actions]: https://github.com/geerlingguy/mac-dev-playbook/workflows/CI/badge.svg?event=push -[link-gh-actions]: https://github.com/geerlingguy/mac-dev-playbook/actions?query=workflow%3ACI +[badge-gh-actions]: https://github.com/geerlingguy/mac-dev-playbook/actions/workflows/ci.yml/badge.svg +[link-gh-actions]: https://github.com/geerlingguy/mac-dev-playbook/actions/workflows/ci.yml From ea8c71e6ff67d1c267afdc7d8dc87039adac7574 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Thu, 30 Jan 2025 21:46:29 -0600 Subject: [PATCH 104/115] Skip ansible-lint yamllint since we already yamllint. --- .ansible-lint | 1 + 1 file changed, 1 insertion(+) diff --git a/.ansible-lint b/.ansible-lint index 9bbcef82b..2c59ff822 100644 --- a/.ansible-lint +++ b/.ansible-lint @@ -7,3 +7,4 @@ skip_list: - name[missing] - no-changed-when - risky-file-permissions + - yaml From 58f46d98db97c7009c9a9696c5be6a33d08f4790 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Thu, 30 Jan 2025 22:51:27 -0600 Subject: [PATCH 105/115] Fix linting errors. --- .ansible-lint | 3 +++ .gitignore | 1 + 2 files changed, 4 insertions(+) diff --git a/.ansible-lint b/.ansible-lint index 2c59ff822..de25ce32a 100644 --- a/.ansible-lint +++ b/.ansible-lint @@ -1,4 +1,7 @@ --- +exclude_paths: + - roles/elliotweiser.osx-command-line-tools + skip_list: - schema[meta] - role-name diff --git a/.gitignore b/.gitignore index a97f7a52f..795c74ded 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ *.vagrant .DS_Store +.ansible *.retry roles* config.yml From caa4b9904d09c9f9718bf3880cb6b61d8b08a5e1 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Wed, 12 Mar 2025 15:32:48 -0500 Subject: [PATCH 106/115] Issue #210: Fix up my own mac setup guide. --- full-mac-setup.md | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/full-mac-setup.md b/full-mac-setup.md index 171fd900c..ce63dd412 100644 --- a/full-mac-setup.md +++ b/full-mac-setup.md @@ -9,10 +9,10 @@ This document covers that, at least in terms of setting up a brand new Mac out o Before starting, I completed Apple's mandatory macOS setup wizard (creating a local user account, and optionally signing into my iCloud account). Once on the macOS desktop, I do the following (in order): - Install Ansible (following the guide in [README.md](README.md)) - - **Sign in in App Store** (since `mas` can't sign in automatically) + - **Sign in to App Store** (since `mas` can't sign in automatically) - Clone mac-dev-playbook to the Mac: `git clone git@github.com:geerlingguy/mac-dev-playbook.git` - Drop `config.yml` from `~/Dropbox/Apps/Config` to the playbook (copy over the network or using a USB flash drive). - - Run the playbook with `--skip-tags post`. + - Run the playbook. - If there are errors, you may need to finish up other tasks like installing 'old-fashioned' apps first (since I try to place Photoshop in the Dock and it can't be installed automatically). Then, run the playbook again ;) - Start Synchronization tasks: - Open Photos and make sure iCloud sync options are correct @@ -30,31 +30,32 @@ Before starting, I completed Apple's mandatory macOS setup wizard (creating a lo - Install [Fritzing](https://fritzing.org/download/) - Configure FastMail account: - Log into Fastmail - - Go to settings, go to the setup page for macOS Mail - - Download the profile and double click to install - - Head to the 'Profiles' System Preference pane and click install - - Open Calendar and sign into Google Accounts (have to manually sign in): - - Personal - - Work + - Go to settings, then Privacy & Security + - Create a new app password, and on that page, download the configuration file + - Open the downloaded profile, then go to System Preferences, and Device Management + - Double-click on the Fastmail profile + - Click 'Install...' and install it + - Configure which accounts are enabled in the 'Internet Accounts' System Preferences pane + - Open Calendar and enable personal Google CalDAV account (you have to manually sign in). - Manually copy `~/Development` folder from another Mac (to save time). - Manual settings to automate someday: + - Finder: + - Disable click-to-show Desktop: `defaults write com.apple.WindowManager EnableStandardClickToShowDesktop -bool false` - System Preferences: - Accessibility > Display > Reduce transparency - Keyboard > Keyboard Shortcuts... > Modifier Keys... > Caps Lock to Esc + - Keyboard > Key repeat rate to 'Fast', Delay until repeat to 'Short' + - Privacy & Security > Full Disk Access > enable "Terminal" - Safari: - View > Show Status Bar - Preferences > Advanced > "Show full website address" - Preferences > Advanced > "Show features for web developers" - Install the 'Return YouTube Dislike' Userscript in Userscripts - Dock: - - Add jgeerling, Downloads, and Applications folders - - Terminal: - - Preferences > Profiles > Set JJG-Term as the default theme - - _After Dropbox Sync completes_: Run the playbook with `--tags post` to complete setup. - - Symlink the synchronized `config.yml` into the playbook dir: `ln -s /Users/jgeerling/Dropbox/Apps/Config/mac-dev-playbook/config.yml /Users/jgeerling/Development/mac-dev-playbook/config.yml` + - Add jgeerling, Downloads, Applications, and shared "mercury" folders - These things might be automatable, but I do them manually right now: - - Configure Time Machine backup drive and set Time Machine backups to daily instead of hourly - - Install Wireguard from App Store and add configuration (if needed) + - Configure Time Machine backup drive + - Install Wireguard VPN configurations (if needed) ## To Wrap in Post-provision automation From ae64a2fb39f2e8d0a0edd62c3f7d6520164e803d Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Wed, 12 Mar 2025 15:39:36 -0500 Subject: [PATCH 107/115] Issue #210: A couple more tweaks for my full mac setup. --- full-mac-setup.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/full-mac-setup.md b/full-mac-setup.md index ce63dd412..087ebc057 100644 --- a/full-mac-setup.md +++ b/full-mac-setup.md @@ -65,7 +65,7 @@ The following tasks have to wait for the initial Dropbox sync to complete before # ZSH Aliases. ln -s /Users/jgeerling/Dropbox/Apps/Config/.aliases /Users/jgeerling/.aliases -# Electrum BTC Wallet. +# Electrum BTC Wallet (open Electrum first). ln -s /Users/jgeerling/Dropbox/Apps/Electrum/default_wallet /Users/jgeerling/.electrum/wallets/default_wallet # SSH setup. @@ -99,7 +99,7 @@ mkdir -p ~/.vim/bundle cd ~/.vim/autoload curl https://raw.githubusercontent.com/tpope/vim-pathogen/master/autoload/pathogen.vim > pathogen.vim cd ~/.vim/bundle -git clone git://github.com/scrooloose/nerdtree.git +git clone https://github.com/preservim/nerdtree.git ``` ## When formatting old Mac From 51bea27a1801caf3713dd3d1f2c61f78496ae0db Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Fri, 14 Mar 2025 10:32:17 -0500 Subject: [PATCH 108/115] Add in FCPX actions. --- full-mac-setup.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/full-mac-setup.md b/full-mac-setup.md index 087ebc057..ce3e31d1b 100644 --- a/full-mac-setup.md +++ b/full-mac-setup.md @@ -53,6 +53,9 @@ Before starting, I completed Apple's mandatory macOS setup wizard (creating a lo - Install the 'Return YouTube Dislike' Userscript in Userscripts - Dock: - Add jgeerling, Downloads, Applications, and shared "mercury" folders + - Final Cut Pro + - Install FxFactory and sign in: https://fxfactory.com + - Copy contents of `~/Development/youtube/fcpx` into respective directories - These things might be automatable, but I do them manually right now: - Configure Time Machine backup drive - Install Wireguard VPN configurations (if needed) From 8a63cb5010a0d094df316e0213e9d12785de7b24 Mon Sep 17 00:00:00 2001 From: Sebastien Kempf <56154464+skmpf@users.noreply.github.com> Date: Sat, 22 Mar 2025 17:42:37 +0100 Subject: [PATCH 109/115] docs: typo and improve default config (#217) --- default.config.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/default.config.yml b/default.config.yml index 93e123bdf..0a0026038 100644 --- a/default.config.yml +++ b/default.config.yml @@ -16,7 +16,7 @@ dockitems_persist: [] # pos: 5 configure_sudoers: false -sudoers_custom_config: '' +sudoers_custom_config: "" # Example: # sudoers_custom_config: | # # Allow users in admin group to use sudo with no password. @@ -25,6 +25,7 @@ sudoers_custom_config: '' dotfiles_repo: https://github.com/geerlingguy/dotfiles.git dotfiles_repo_accept_hostkey: true dotfiles_repo_local_destination: ~/Development/GitHub/dotfiles +dotfiles_repo_version: master # Replace with your default branch dotfiles_files: - .zshrc - .gitignore @@ -76,7 +77,7 @@ homebrew_cask_apps: - sublime-text - transmit -# See `geerlingguy.mas` role documentation for usage instructions. +# See `geerlingguy.mac.mas` role documentation for usage instructions. mas_installed_apps: [] mas_email: "" mas_password: "" @@ -105,7 +106,7 @@ pip_packages: [] # Set to 'true' to configure Sublime Text. configure_sublime: false -sublime_base_path: '~/Library/Application Support/Sublime Text' +sublime_base_path: "~/Library/Application Support/Sublime Text" sublime_config_path: "Packages/User" sublime_package_control: - "DocBlockr" From 372da21ce42e6e86c6709513abf4573df965c6ad Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Sun, 23 Mar 2025 22:34:13 -0500 Subject: [PATCH 110/115] Update to use Cobalt2 Color Scheme for Sublime Text. --- default.config.yml | 1 + files/sublime/Cobalt (SL).tmTheme | 589 --------------------- files/sublime/Preferences.sublime-settings | 12 +- tasks/sublime-text.yml | 1 - 4 files changed, 11 insertions(+), 592 deletions(-) delete mode 100644 files/sublime/Cobalt (SL).tmTheme diff --git a/default.config.yml b/default.config.yml index 0a0026038..64c6d92a3 100644 --- a/default.config.yml +++ b/default.config.yml @@ -119,6 +119,7 @@ sublime_package_control: - "Pretty JSON" - "SublimeLinter" - "SublimeLinter-contrib-yamllint" + - "Theme - Cobalt2" - "TrailingSpaces" - "WordCount" diff --git a/files/sublime/Cobalt (SL).tmTheme b/files/sublime/Cobalt (SL).tmTheme deleted file mode 100644 index a9f192432..000000000 --- a/files/sublime/Cobalt (SL).tmTheme +++ /dev/null @@ -1,589 +0,0 @@ - - - - - comment - Created by Jacob Rus. Based on ‘Slate’ by Wilson Miner - author - Jacob Rus - name - Cobalt - settings - - - settings - - background - #002240 - caret - #FFFFFF - foreground - #FFFFFF - invisibles - #FFFFFF26 - lineHighlight - #00000059 - selection - #B36539BF - - - - name - Punctuation - scope - punctuation - (punctuation.definition.string || punctuation.definition.comment) - settings - - fontStyle - - foreground - #E1EFFF - - - - name - Constant - scope - constant - settings - - fontStyle - - foreground - #FF628C - - - - name - Entity - scope - entity - settings - - fontStyle - - foreground - #FFDD00 - - - - name - Keyword - scope - keyword - settings - - fontStyle - - foreground - #FF9D00 - - - - name - Storage - scope - storage - settings - - fontStyle - - foreground - #FFEE80 - - - - name - String - scope - string -string.unquoted.old-plist -string.unquoted.heredoc, string.unquoted.heredoc string - settings - - fontStyle - - foreground - #3AD900 - - - - name - Comment - scope - comment - settings - - fontStyle - italic - foreground - #0088FF - - - - name - Support - scope - support - settings - - fontStyle - - foreground - #80FFBB - - - - name - Variable - scope - variable - settings - - fontStyle - - foreground - #CCCCCC - - - - name - Lang Variable - scope - variable.language - settings - - fontStyle - - foreground - #FF80E1 - - - - name - Function Call - scope - meta.function-call - settings - - foreground - #FFEE80 - - - - name - Invalid - scope - invalid - settings - - background - #800F00 - foreground - #F8F8F8 - - - - name - Embedded Source - scope - text source, string.unquoted.heredoc, source source - settings - - background - #223545 - fontStyle - - foreground - #FFFFFF - - - - name - Entity inherited-class - scope - entity.other.inherited-class - settings - - fontStyle - italic - foreground - #80FCFF - - - - name - String embedded-source - scope - string.quoted source - settings - - fontStyle - - foreground - #9EFF80 - - - - name - String constant - scope - string constant - settings - - foreground - #80FF82 - - - - name - String.regexp - scope - string.regexp - settings - - foreground - #80FFC2 - - - - name - String variable - scope - string variable - settings - - foreground - #EDEF7D - - - - name - Support.function - scope - support.function - settings - - fontStyle - - foreground - #FFB054 - - - - name - Support.constant - scope - support.constant - settings - - fontStyle - - foreground - #EB939A - - - - name - Exception - scope - support.type.exception - settings - - foreground - #FF1E00 - - - - name - C/C++ Preprocessor Line - scope - meta.preprocessor.c - settings - - foreground - #8996A8 - - - - name - C/C++ Preprocessor Directive - scope - meta.preprocessor.c keyword - settings - - foreground - #AFC4DB - - - - name - Doctype/XML Processing - scope - 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 - settings - - foreground - #73817D - - - - name - Meta.tag.A - scope - meta.tag, meta.tag entity - settings - - foreground - #9EFFFF - - - - name - css tag-name - scope - meta.selector.css entity.name.tag - settings - - foreground - #9EFFFF - - - - name - css#id - scope - meta.selector.css entity.other.attribute-name.id - settings - - foreground - #FFB454 - - - - name - css.class - scope - meta.selector.css entity.other.attribute-name.class - settings - - foreground - #5FE461 - - - - name - css property-name: - scope - support.type.property-name.css - settings - - foreground - #9DF39F - - - - name - css property-value; - scope - meta.property-group support.constant.property-value.css, meta.property-value support.constant.property-value.css - settings - - foreground - #F6F080 - - - - name - css @at-rule - scope - meta.preprocessor.at-rule keyword.control.at-rule - settings - - foreground - #F6AA11 - - - - name - css additional-constants - scope - meta.property-value support.constant.named-color.css, meta.property-value constant - settings - - foreground - #EDF080 - - - - name - css constructor.argument - scope - meta.constructor.argument.css - settings - - foreground - #EB939A - - - - name - diff.header - scope - meta.diff, meta.diff.header - settings - - background - #000E1A - fontStyle - - foreground - #F8F8F8 - - - - name - diff.deleted - scope - markup.deleted - settings - - background - #4C0900 - foreground - #F8F8F8 - - - - name - diff.changed - scope - markup.changed - settings - - background - #806F00 - foreground - #F8F8F8 - - - - name - diff.inserted - scope - markup.inserted - settings - - background - #154F00 - foreground - #F8F8F8 - - - - name - Raw Markup - scope - markup.raw - settings - - background - #8FDDF630 - - - - name - Block Quote - scope - markup.quote - settings - - background - #004480 - - - - name - List - scope - markup.list - settings - - background - #130D26 - - - - name - Bold Markup - scope - markup.bold - settings - - fontStyle - bold - foreground - #C1AFFF - - - - name - Italic Markup - scope - markup.italic - settings - - fontStyle - italic - foreground - #B8FFD9 - - - - name - Heading Markup - scope - markup.heading - settings - - background - #001221 - fontStyle - bold - foreground - #C8E4FD - - - - name - SublimeLinter Error - scope - sublimelinter.mark.error - settings - - foreground - #DA2000 - - - name - SublimeLinter Warning - scope - sublimelinter.mark.warning - settings - - foreground - #EDBA00 - - - name - SublimeLinter Gutter Mark - scope - sublimelinter.gutter-mark - settings - - foreground - #FFFFFF - - - uuid - 06CD1FB2-A00A-4F8C-97B2-60E131980454 - - \ No newline at end of file diff --git a/files/sublime/Preferences.sublime-settings b/files/sublime/Preferences.sublime-settings index 46d6e2f96..c169b6114 100644 --- a/files/sublime/Preferences.sublime-settings +++ b/files/sublime/Preferences.sublime-settings @@ -302,7 +302,7 @@ "*.zip" ], "close_windows_when_empty": true, - "color_scheme": "Packages/User/Cobalt (SL).tmTheme", + "color_scheme": "Packages/Theme - Cobalt2/cobalt2.tmTheme", "create_window_at_startup": false, "detect_indentation": true, "draw_minimap_border": false, @@ -388,6 +388,13 @@ "varname", "vg" ], + "indent_guide_options": ["draw_normal", "draw_active"], + "hide_tab_scrolling_buttons": true, + "highlight_modified_tabs": true, + "line_padding_bottom": 1, + "line_padding_top": 1, + "caret_style": "blink", + "bold_folder_labels": false, "line_numbers": true, "margin": 4, "match_brackets": true, @@ -399,8 +406,9 @@ "smart_indent": true, "spell_check": false, "tab_size": 2, - "theme": "auto", + "theme": "Cobalt2.sublime-theme", "translate_tabs_to_spaces": true, "trim_automatic_white_space": false, "trim_trailing_white_space_on_save": false, + "index_files": true, } diff --git a/tasks/sublime-text.yml b/tasks/sublime-text.yml index 349df9ecd..d07f7698a 100644 --- a/tasks/sublime-text.yml +++ b/tasks/sublime-text.yml @@ -22,7 +22,6 @@ src: "files/sublime/{{ item }}" dest: "{{ sublime_base_path }}/{{ sublime_config_path }}/{{ item }}" loop: - - "Cobalt (SL).tmTheme" - "Markdown.sublime-settings" - "Plain text.sublime-settings" - "Preferences.sublime-settings" From 269ce488ee07e43053720bbd10f75d4e22dac86c Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Tue, 25 Mar 2025 22:02:35 -0500 Subject: [PATCH 111/115] Update default config with new Sublime defaults. --- default.config.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/default.config.yml b/default.config.yml index 64c6d92a3..35aca2970 100644 --- a/default.config.yml +++ b/default.config.yml @@ -115,13 +115,12 @@ sublime_package_control: - "GitHub Flavored Markdown Preview" - "Jinja2" - "Package Control" - - "PHP-Twig" - "Pretty JSON" - "SublimeLinter" - "SublimeLinter-contrib-yamllint" - "Theme - Cobalt2" - "TrailingSpaces" - - "WordCount" + - "WordingStatus" # Glob pattern to ansible task files to run after all other tasks are finished. post_provision_tasks: [] From 4dc3352b2a852b802fedd6f7c0dfc6e87d77a0dc Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Tue, 25 Mar 2025 23:40:19 -0500 Subject: [PATCH 112/115] Fix path for ansible collections on my computers. --- full-mac-setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/full-mac-setup.md b/full-mac-setup.md index ce3e31d1b..cfd9c419f 100644 --- a/full-mac-setup.md +++ b/full-mac-setup.md @@ -84,7 +84,7 @@ sudo ln -s /Users/jgeerling/Dropbox/VMs/roles /etc/ansible/roles mkdir -p /Users/jgeerling/.ansible ln -s /Users/jgeerling/Dropbox/Apps/Config/ansible/galaxy_token /Users/jgeerling/.ansible/galaxy_token ln -s /Users/jgeerling/Dropbox/Apps/Config/ansible/mm-vault-password.txt /Users/jgeerling/.ansible/mm-vault-password.txt -ln -s /Users/jgeerling/Dropbox/VMs/ /Users/jgeerling/.ansible/collections +ln -s /Users/jgeerling/Dropbox/VMs/ansible_collections /Users/jgeerling/.ansible/collections # Final Cut Pro setup. (Open Motion first) cp -r /Users/jgeerling/Dropbox/Apps/Config/Motion/Motion\ Templates.localized/ /Users/jgeerling/Movies/Motion\ Templates.localized/ From 5e6054062b3617c49b131ea74d43b920b6f419fd Mon Sep 17 00:00:00 2001 From: Bharath Sadashivaiah <46544104+bsadashi@users.noreply.github.com> Date: Sat, 19 Apr 2025 16:23:32 -0400 Subject: [PATCH 113/115] add dependabot.yml (#218) --- .github/dependabot.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..386190298 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,16 @@ +--- +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + groups: + updates: + applies-to: version-updates + patterns: + - "*" + security-updates: + applies-to: security-updates + patterns: + - "*" From 79a49c741af8cb4dd34ad7d9b86c042e6022d476 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 19 Apr 2025 15:46:29 -0500 Subject: [PATCH 114/115] Bump the updates group with 3 updates (#219) Bumps the updates group with 3 updates: [actions/checkout](https://github.com/actions/checkout), [actions/setup-python](https://github.com/actions/setup-python) and [actions/stale](https://github.com/actions/stale). Updates `actions/checkout` from 2 to 4 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v2...v4) Updates `actions/setup-python` from 2 to 5 - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/v2...v5) Updates `actions/stale` from 8 to 9 - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/v8...v9) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '4' dependency-type: direct:production update-type: version-update:semver-major dependency-group: updates - dependency-name: actions/setup-python dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major dependency-group: updates - dependency-name: actions/stale dependency-version: '9' dependency-type: direct:production update-type: version-update:semver-major dependency-group: updates ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 6 +++--- .github/workflows/stale.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a31961853..1e3cc0426 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,10 +15,10 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out the codebase. - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Set up Python 3. - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: python-version: '3.x' @@ -41,7 +41,7 @@ jobs: steps: - name: Check out the codebase. - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Uninstall GitHub Actions' built-in Homebrew. run: tests/uninstall-homebrew.sh diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 5a6647f2b..22ac0548d 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -11,7 +11,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/stale@v8 + - uses: actions/stale@v9 with: days-before-stale: 120 days-before-close: 60 From e2a1168f0eb57b7ca905fefaa14ac4d407ab185d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Aug 2025 00:48:38 -0400 Subject: [PATCH 115/115] Bump actions/checkout from 4 to 5 in the updates group (#225) Bumps the updates group with 1 update: [actions/checkout](https://github.com/actions/checkout). Updates `actions/checkout` from 4 to 5 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major dependency-group: updates ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1e3cc0426..ac4061090 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out the codebase. - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Set up Python 3. uses: actions/setup-python@v5 @@ -41,7 +41,7 @@ jobs: steps: - name: Check out the codebase. - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Uninstall GitHub Actions' built-in Homebrew. run: tests/uninstall-homebrew.sh