38 Commits

Author SHA1 Message Date
98573c0066 Add moonlight role for Windows
Role installs the [Moonlight](https://moonlight-stream.org/) game
streaming client.
2022-11-20 21:51:08 +00:00
d95f1f7e32 Switch to Ansible for managing neovim plugins 2022-11-16 18:37:42 +00:00
7da67aaed0 Add labels for improve zsh role output 2022-11-11 17:27:16 +00:00
7ec59f8c52 Add sudo role for Unix systems 2022-11-07 14:38:50 +00:00
bebe6de7cd Set gdb config file based on installed version 2022-11-06 19:47:36 +00:00
08af0f00b6 Add CAD software to Windows playbook
The `autodesk-fusion360` and `prusiaslicer` roles are added to the
`Windows.yaml` playbook but disabled by default behind the
`install_cad_apps` flag. To enable them create a `~/.config/local.yaml`
file with the following:

```yaml
- import_playbook: local/Windows.yaml
  vars:
    install_cad_apps: true
```
2022-11-06 15:54:54 +00:00
3864c0f35d Add PrusaSlicer role for Windows 2022-11-06 15:31:02 +00:00
3218722fcb Add AutoDesk Fusion 360 role for Windows 2022-11-06 15:26:16 +00:00
1895f1561d Ensure $(hostname).local is in hosts file on WSL 2022-11-06 10:56:19 +00:00
cee0c443a3 Add gdb role for Debian 2022-11-05 20:05:48 +00:00
bb945190f8 Add readline role for Unix like systems 2022-11-04 12:53:20 +00:00
4f5a2e6333 Fix htop not setting become: true 2022-11-03 11:47:39 +00:00
833f9a25ef Add powertoys role for Windows 2022-10-31 23:26:07 +00:00
1fbdcdd487 Include jq, yq, and jp in relevant playbooks 2022-10-30 23:23:48 +00:00
9efb5d6c15 Add role for jp on macOS and Debian 2022-10-30 23:23:23 +00:00
d99657e3b8 Fix type in jq task comment 2022-10-30 23:23:04 +00:00
b159445520 Ensure win_owner is recursive for win_git repos 2022-10-29 12:59:19 +01:00
6a4a182cf5 Add role for yq on Debina, macOS, and Windows 2022-10-28 19:41:16 +01:00
55cc3441be Add role for jq on Debina, macOS, and Windows 2022-10-28 18:56:01 +01:00
bd4e5f1941 Always install fzf from apt on Debian
`fzf` is in the `apt` repos for all distros used.
2022-10-08 13:56:03 +01:00
c9845be40c Fix tidy role on Debian 2022-10-06 18:13:51 +01:00
f47b45d82c Use op.exe on WSL for biometrics 2022-10-03 22:45:07 +01:00
854bf8d1e9 Add wget role for macOS & Debian 2022-09-20 22:51:54 +01:00
3272331f08 Add role for htop on macOS/Debian 2022-09-20 18:54:50 +01:00
8c9af58146 Include tasks from tmux config repo 2022-09-20 13:43:01 +01:00
e4a08c843c Fix ag/curl roles on macOS 2022-09-20 12:52:04 +01:00
c77b356968 Add tidy role for http://www.html-tidy.org/ 2022-09-16 10:43:00 +01:00
7404c0ae59 Add curl role 2022-09-10 16:29:27 +01:00
06b511d823 Set the owner of Git repos on Windows
The `win_git` module clones repos as the current user, which since its
an admin login is the admin. This patch adjusts the `win_owner` to so
that repos are owned by the correct user when being used in a non-admin
capacity.
2022-09-10 16:18:21 +01:00
9693194f7f Update powershell role to better handle first install 2022-09-10 15:34:18 +01:00
337237a6e8 Pin Git to v2.36.1 on Windows so win_git works
Git for Windows v2.37.3 (and probably all version in the v2.37 series)
cause the unofficial win_git module to hang. Downgrading the v2.36.1
works around this issue for the time being. The Chocolatey package for
Git also does not respect the version flag, so installation is now
performed manually by grabbing the v2.36.1 installer from the GitHub
release asset and running it manually when installation is required.
2022-09-10 15:04:54 +01:00
31eba75038 On Windows move git role to the beginning 2022-09-10 11:52:07 +01:00
5728aba7df Don't include system-info role in WSL 2022-08-27 17:44:22 +01:00
76b6d63064 Improve bat role 2022-08-27 17:40:00 +01:00
189371d7f2 Fix macOS playbook import 2022-08-12 21:16:29 +01:00
491a9a07b5 Merge op role into 1password role
Additionally:

* Stop using Chocolatey packages for 1password as they are not up to
  date, instead download and install directly.
* Switch to apt repository on Debian.
* Add zsh completions for macOS and Dabian.
* Add powershell completions for Windows.
2022-08-12 21:16:29 +01:00
c4e87f2022 Implement system-info role on Debian 2022-07-29 18:01:03 +01:00
09e7ec3ad4 Merge op role into 1password role
Additionally:

* Stop using Chocolatey packages for 1password as they are not up to
  date, instead download and install directly.
* Switch to apt repository on Debian.
* Add zsh completions for macOS and Dabian.
* Add powershell completions for Windows.
2022-07-03 11:25:05 +01:00
67 changed files with 880 additions and 134 deletions

View File

@@ -2,21 +2,33 @@
- hosts: localhost
roles:
- role: sudo
when: ansible_user_id != "root"
- role: zsh
- role: neovim
- role: tmux
- role: system-info
when: '"WSL" not in ansible_kernel'
- role: ag
- role: bat
- role: curl
- role: fzf
- role: git
- role: op
- role: htop
- role: jp
- role: jq
- role: readline
- role: tidy
- role: tree
- role: yq
- role: llvm
- role: nodejs
- role: python
- role: 1password
- role: wsl
when: '"WSL" in ansible_kernel'

View File

@@ -1,16 +1,22 @@
---
- hosts: windows
vars:
install_cad_apps: false
roles:
- role: git
- role: powershell
- role: neovim
- role: system-info
- role: ag
- role: bat
- role: curl
- role: fzf
- role: git
- role: op
- role: tree
- role: jq
- role: yq
- role: llvm
- role: nodejs
@@ -20,4 +26,10 @@
- role: autohotkey
- role: firefox
- role: obsidian
- role: powertoys
- role: windows-terminal
- role: autodesk-fusion360
when: install_cad_apps
- role: prusaslicer
when: install_cad_apps

View File

@@ -1,5 +1,5 @@
---
- import_playbook: unix.yaml
- import_playbook: Unix.yaml
- hosts: localhost

View File

@@ -1,5 +1,9 @@
---
- name: install homebrew package
homebrew_cask:
name: 1password
name:
- 1password
- 1password-cli
state: latest
- include_tasks: zsh-completion.yaml

View File

@@ -1 +1,48 @@
# TODO: https://support.1password.com/install-linux/#debian-or-ubuntu
---
- name: add apt signing key
when: '"WSL" not in ansible_kernel'
become: true
apt_key:
url: https://downloads.1password.com/linux/keys/1password.asc
keyring: /etc/apt/trusted.gpg.d/1password-archive-keyring.gpg
state: present
- when: ansible_machine == 'x86_64'
set_fact:
arch: amd64
- assert:
that: arch is defined
fail_msg: 'Architecture not currently supported: {{ansible_machine}}'
- name: add apt repository
when: '"WSL" not in ansible_kernel'
become: true
apt_repository:
repo: >-
deb [arch={{arch}}
signed-by=/etc/apt/trusted.gpg.d/1password-archive-keyring.gpg]
https://downloads.1password.com/linux/debian/{{arch}} stable main
- name: install gui package
when: '"WSL" not in ansible_kernel'
become: true
apt:
name: 1password
state: latest
- name: install cli package
when: '"WSL" not in ansible_kernel'
become: true
apt:
name: 1password-cli
state: latest
- name: create symlink to op.exe
when: '"WSL" in ansible_kernel'
file:
state: link
src: /mnt/c/Users/Benie/AppData/Local/1Password/cli/op.exe
dest: ~/.local/bin/op
- include_tasks: zsh-completion.yaml

View File

@@ -1,12 +1,111 @@
---
- name: install chocolatey package
win_chocolatey:
name:
- 1password
state: latest
# NOTE: The 1Password chocolatey packages are not up to date.
# GUI
- set_fact:
app_exe: '{{ansible_env.LOCALAPPDATA}}/1Password/app/8/1Password.exe'
installer_exe: '{{ansible_env.TEMP}}/1PasswordSetup-latest.exe'
- name: check if already installed
win_stat:
path: '{{app_exe}}'
register: app_stat
- name: get installed version
when: app_stat.stat.exists == True
win_command: '{{app_exe}} --version'
register: app_version
changed_when: false
- when: app_stat.stat.exists == True
set_fact:
installed_version: '{{app_version.stdout.strip()}}'
- name: download latest installer
win_get_url:
url: https://downloads.1password.com/win/1PasswordSetup-latest.exe
dest: '{{installer_exe}}'
- name: get installer version
win_shell: |
(Get-ItemProperty {{installer_exe}}).VersionInfo.ProductVersion
register: installer_product_version
changed_when: false
# FIXME: The [5:] is to account for a mystery "\e[6 q" prefix, not sure if this
# is consistent across machines or some other oddity.
- set_fact:
installer_version: '{{installer_product_version.stdout.strip()[5:]}}'
- name: run installer
when: installed_version is not defined or installed_version != installer_version
win_command: '{{installer_exe}}'
- name: create start menu shortcut
win_shortcut:
src: '{{ansible_env.LOCALAPPDATA}}/1Password/app/7/1Password.exe'
src: '{{app_exe}}'
dest: '{{ansible_env.ProgramData}}/Microsoft/Windows/Start Menu/Programs/1Password.lnk'
icon: '{{ansible_env.LOCALAPPDATA}}/1Password/app/7/1Password.exe,0'
icon: '{{app_exe}},0'
# CLI
- set_fact:
cli_dir: '{{ansible_env.LOCALAPPDATA}}\1Password\cli'
cli_zip: '{{ansible_env.TEMP}}/op_windows_amd64.zip'
- set_fact:
cli_exe: '{{cli_dir}}\op.exe'
- name: check if op already installed
win_stat:
path: '{{cli_exe}}'
register: cli_stat
- name: get installed op version
when: cli_stat.stat.exists == True
win_command: '{{cli_exe}} --version'
register: cli_version
changed_when: false
- when: cli_stat.stat.exists == True
set_fact:
cli_installed_version: '{{cli_version.stdout.strip()}}'
- name: get list of op releases
win_uri:
url: https://raw.githubusercontent.com/kbenzie/op-release-scraper/main/op-releases.json
return_content: true
register: releases
- set_fact:
latest: '{{releases.json[0]}}'
- name: download latest op zip archive
when: cli_installed_version is not defined or cli_installed_version != latest.version
win_get_url:
url: '{{latest.downloads.Windows.amd64}}'
dest: '{{cli_zip}}'
- name: unzip op zip archive
when: cli_installed_version is not defined or cli_installed_version != latest.version
win_unzip:
src: '{{cli_zip}}'
dest: '{{cli_dir}}'
- name: add op install directory to user PATH
win_path:
scope: user
name: Path
elements: '{{cli_dir}}'
- name: get op powershell completion script
win_command:
argv:
- '{{ansible_env.LOCALAPPDATA}}/1Password/cli/op.exe'
- completion
- powershell
register: powershell_completion_script
changed_when: false
- name: create op powershell completion file
win_copy:
content: '{{powershell_completion_script.stdout}}'
dest: '{{cli_dir}}/opProfile.psm1'

View File

@@ -0,0 +1,10 @@
---
- name: get op zsh completion script
command: op completion zsh
register: zsh_completion_script
changed_when: false
- name: create op zsh completion file
copy:
content: '{{zsh_completion_script.stdout}}'
dest: ~/.local/share/zsh/site-functions/_op

View File

@@ -1,5 +1,5 @@
---
- name: install homebrew package
apt:
homebrew:
name: the_silver_searcher
state: latest

View File

@@ -0,0 +1,8 @@
---
- assert:
that: ansible_os_family == "Windows"
- name: install chocolatey package
win_chocolatey:
name: autodesk-fusion360
state: latest

View File

@@ -9,6 +9,10 @@
repo: git@code.infektor.net:config/AutoHotKey.git
dest: '{{autohotkey_repo_dir}}'
branch: master
- win_owner:
path: '{{autohotkey_repo_dir}}'
user: Benie
recurse: true
- name: create scheduled task
win_scheduled_task:

View File

@@ -1,13 +1,13 @@
---
- name: install apt package
become: true
apt:
name: bat
state: latest
- set_fact:
use_github: '{{
ansible_distribution == "Ubuntu" and
ansible_distribution_version == "18.04"
}}'
- debug: msg={{use_github}}
- name: update bat alternative
become: true
alternatives:
name: bat
path: /usr/bin/batcat
link: /usr/local/bin/bat
- when: use_github
include_tasks: deb.yaml
- when: not use_github
include_tasks: apt.yaml

View File

@@ -0,0 +1,5 @@
---
- name: install chocolatey package
win_chocolatey:
name: Bat
state: latest

13
roles/bat/tasks/apt.yaml Normal file
View File

@@ -0,0 +1,13 @@
---
- name: install apt package
become: true
apt:
name: bat
state: latest
- name: update bat alternative
become: true
alternatives:
name: bat
path: /usr/bin/batcat
link: /usr/local/bin/bat

65
roles/bat/tasks/deb.yaml Normal file
View File

@@ -0,0 +1,65 @@
---
- name: get latest github release
uri:
url: https://api.github.com/repos/sharkdp/bat/releases/latest
register: latest
- set_fact:
latest_version: '{{latest.json.tag_name[1:]}}'
bat_exe: '/usr/bin/bat'
- name: check if already installed
stat:
path: '{{bat_exe}}'
register: bat_stat
- name: get installed version
when: bat_stat.stat.exists == True
command: '{{bat_exe}} --version'
register: bat_version
changed_when: false
- when: bat_stat.stat.exists == True
set_fact:
installed_version:
'{{bat_version.stdout.strip() | regex_replace("^.*(\d+\.\d+\.\d+).*$", "\1")}}'
- when: ansible_machine == "x86_64"
set_fact:
arch: amd64
- assert:
that: arch is defined
fail_msg: 'Architecture not currently supported: {{ansible_machine}}'
- set_fact:
assets: '{{latest.json.assets}}'
asset_query: '[?contains(name, `bat-musl_`)] | [?contains(name, `amd64.deb`)] | [0]'
pkg_dir: '{{ansible_env.HOME}}/.local/pkg/bat'
- set_fact:
asset: '{{assets | to_json | from_json | json_query(asset_query)}}'
bat_deb: '{{pkg_dir}}/bat.deb'
- name: create directory for deb file download
file:
state: directory
path: '{{pkg_dir}}'
- name: download .deb file
when: installed_version is not defined or installed_version != latest_version
get_url:
url: '{{asset.browser_download_url}}'
dest: '{{bat_deb}}'
- name: install .deb file
when: installed_version is not defined or installed_version != latest_version
become: true
apt:
deb: '{{bat_deb}}'
- name: remove .deb file
when: installed_version is not defined or installed_version != latest_version
file:
state: absent
path: '{{bat_deb}}'
changed_when: false

View File

@@ -1,5 +1,5 @@
---
- name: install homebrew package
homebrew_cask:
name: 1password-cli
homebrew:
name: curl
state: latest

View File

@@ -0,0 +1,6 @@
---
- name: install apt package
become: true
apt:
name: curl
state: latest

View File

@@ -0,0 +1,5 @@
---
- name: install chocolatey package
win_chocolatey:
name: curl
state: latest

View File

@@ -1,12 +1,6 @@
---
- name: install apt package
when: ansible_distribution == "Debian" and
ansible_distribution_version == "unstable"
become: true
apt:
name: fzf
state: latest
- include_tasks: Debian-old.yaml
when: not (ansible_distribution == "Debian" and
ansible_distribution_version == "unstable")

View File

@@ -0,0 +1,6 @@
---
- name: install apt package
become: true
apt:
name: gdb
state: latest

View File

@@ -0,0 +1,11 @@
---
- set_fact:
gdb_config_dir: '{{ansible_env.HOME}}/.config/gdb'
- name: create config directory
file:
path: '{{gdb_config_dir}}'
state: directory
- set_fact:
gdb_config_file: '{{gdb_config_dir}}/gdbinit'

34
roles/gdb/tasks/main.yaml Normal file
View File

@@ -0,0 +1,34 @@
---
- include_tasks: '{{ansible_os_family}}.yaml'
# gdb 11.1 introduced support for config files that respect the XDG base
# directory spec, handle the boths paths dependant on the gdb version install.
- name: get installed version
command: gdb --version
register: gdb_version_output
changed_when: false
- set_fact:
gdb_version: '{{gdb_version_output.stdout | regex_search("(\d+)\.(\d+)", "\1", "\2")}}'
- set_fact:
gdb_xdg_base_dir_check:
gdb_version[0] | int > 11 or (
gdb_version[0] | int == 11 and gdb_version[1] | int == 1
)
- set_fact:
gdb_config_file: '{{ansible_env.HOME}}/.gdbinit'
gdb_state_dir: '{{ansible_env.HOME}}/.local/state/gdb'
- when: gdb_xdg_base_dir_check
include_tasks: gdb-11.1-config.yaml
- name: create config file
template:
src: gdbinit
dest: '{{gdb_config_file}}'
- name: create state directory
file:
path: '{{gdb_state_dir}}'
state: directory

View File

@@ -0,0 +1,3 @@
# Enable saving command history
set history filename {{gdb_state_dir}}/history
set history save on

View File

@@ -0,0 +1,34 @@
---
- name: get json containing all releases
win_uri:
url: 'https://api.github.com/repos/git-for-windows/git/releases/tags/v{{git_version}}.windows.1'
return_content: true
register: git_release
- set_fact:
git_installer_exe: 'Git-{{git_version}}-64-bit.exe'
- set_fact:
git_asset_query: '[?contains(name, `{{git_installer_exe}}`)] | [0]'
git_installer_path: '{{ansible_env.TEMP}}/{{git_installer_exe}}'
- name: select asset from release
set_fact:
git_asset: '{{git_release.json.assets | json_query(git_asset_query)}}'
- name: download installer
win_get_url:
url: '{{git_asset.browser_download_url}}'
dest: '{{git_installer_path}}'
- name: run installer command
win_command:
argv:
- '{{git_installer_path}}'
- '/GitAndUnixToolsOnPath'
- '/NoShellIntegration'
- '/NoGuiHereIntegration'
- '/NoCredentialManager'
- '/NoOpenSSH'
- '/Silent'
- '/SuppressMsgBoxes'
- '/NoCancel'
- '/NoRestart'

View File

@@ -1,14 +1,35 @@
---
- name: install chocolatey package
win_chocolatey:
name: git
package_params: >-
/GitAndUnixToolsOnPath
/NoShellIntegration
/NoGuiHereIntegration
/NoCredentialManager
/NoOpenSSH
state: latest
# Pinned to 2.36.1 because the unofficial win_git module hangs when using
# 2.37.3, this is either a breaking change in 2.37.x or an incompatibility with
# the win_git module. The git chocolatey package does not respect the version
# argument and always installs the most recent version, so instead download the
# installer from GitHub and install manually.
- set_fact:
git_version: 2.36.1
git_cli_exe: '{{ansible_env.ProgramFiles}}/Git/cmd/git.exe'
git_run_installer: false
- name: detect if Git for Windows is installed
win_stat:
path: '{{git_cli_exe}}'
register: git_cli_stat
- when: not git_cli_stat.stat.exists
set_fact:
git_run_installer: true
- name: check installed version
when: git_cli_stat.stat.exists
win_command: '"{{git_cli_exe}}" --version'
register: git_cli_version
changed_when: false
- when: git_cli_stat.stat.exists and git_version not in git_cli_version.stdout
set_fact:
git_run_installer: true
- include_tasks: Windows-installer.yaml
when: git_run_installer
- name: clone config repos
win_git:
@@ -16,6 +37,11 @@
dest: '{{ansible_env.USERPROFILE}}/.config/{{item.name}}'
version: master
with_items: '{{git_config_repos}}'
- win_owner:
path: '{{ansible_env.USERPROFILE}}/.config/{{item.name}}'
user: Benie
recurse: true
with_items: '{{git_config_repos}}'
# - TODO: install pip packages
# win_pip:

View File

@@ -0,0 +1,5 @@
---
- name: install homebrew package
homebrew:
name: htop
state: latest

View File

@@ -0,0 +1,6 @@
---
- name: install apt package
become: true
apt:
name: htop
state: latest

View File

@@ -0,0 +1,2 @@
---
- include_tasks: '{{ansible_os_family}}.yaml'

View File

@@ -0,0 +1,38 @@
---
- name: get latest github release
uri:
url: https://api.github.com/repos/jmespath/jp/releases/latest
register: latest
# TODO: Support arm64
- set_fact:
asset_query: '[?contains(name, `jp-darwin-amd64`)] | [0]'
assets: '{{latest.json.assets}}'
latest_version: '{{latest.json.tag_name}}'
jp_exe: '{{ansible_env.HOME}}/.local/bin/jp'
- name: check if already installed
stat:
path: '{{jp_exe}}'
register: jp_exe
- name: get installed version
when: jp_stat.stat.exists == True
command: '{{jp_exe}} --version'
register: jp_version_output
changed_when: false
- when: jp_stat.stat.exists == True
set_fact:
installed_version:
'{{jp_version_output.stdout.strip() | regex_replace("^.*(\d+\.\d+\.\d+).*$", "\1")}}'
- set_fact:
asset: '{{assets | to_json | from_json | json_query(asset_query)}}'
- name: download executable
when: installed_version is not defined or installed_version != latest_version
get_url:
url: '{{asset.browser_download_url}}'
dest: '{{jp_exe}}'
mode: +x

View File

@@ -0,0 +1,6 @@
---
- name: install apt package
become: true
apt:
name: jp
state: latest

4
roles/jp/tasks/main.yaml Normal file
View File

@@ -0,0 +1,4 @@
---
- assert:
that: ansible_os_family != "Windows"
- include_tasks: '{{ansible_os_family}}.yaml'

View File

@@ -0,0 +1,5 @@
---
- name: install homebrew package
homebrew:
name: jq
state: latest

View File

@@ -0,0 +1,5 @@
---
- name: install apt package
apt:
name: jq
state: latest

View File

@@ -1,5 +1,5 @@
---
- name: install chocolatey package
win_chocolatey:
name: op
name: jq
state: latest

2
roles/jq/tasks/main.yaml Normal file
View File

@@ -0,0 +1,2 @@
---
- include_tasks: '{{ansible_os_family}}.yaml'

View File

@@ -0,0 +1,5 @@
---
- name: install chocolatey package
win_chocolatey:
name: moonlight-qt
state: latest

View File

@@ -0,0 +1,2 @@
---
- include_tasks: '{{ansible_os_family}}.yaml'

View File

@@ -4,4 +4,4 @@
name: neovim
state: latest
- include_tasks: unix.yaml
- include_tasks: Unix.yaml

View File

@@ -5,4 +5,4 @@
name: neovim
state: latest
- include_tasks: unix.yaml
- include_tasks: Unix.yaml

View File

@@ -0,0 +1,36 @@
---
- name: clone plugin repos
git:
repo: 'https://github.com/{{item.repo}}.git'
dest: '{{plugin_dir}}/{{item.mode | default("start")}}/{{item.repo | regex_replace("^.*\/(.*)$", "\1")}}'
version: '{{item.branch | default("HEAD")}}'
with_items: '{{plugins}}'
- name: get list of managed plugin paths
set_fact:
managed_plugins: >-
{{
managed_plugins | default([]) + [
plugin_dir + "/" +
item.mode | default("start") + "/" +
item.repo | regex_replace("^.*\/(.*)$", "\1")
]
}}
with_items: '{{plugins}}'
- name: find all installed plugin directories
find:
paths:
- '{{plugin_dir}}/start'
- '{{plugin_dir}}/opt'
file_type: directory
register: found_plugins
- name: remove found plugins which are not in the managed list
file:
path: '{{item.path}}'
state: absent
with_items: '{{found_plugins.files}}'
when: item.path not in managed_plugins
loop_control:
label: '{{item.path}}'

View File

@@ -0,0 +1,28 @@
---
- set_fact:
vim_config_dir: '{{ansible_env.HOME}}/.config/nvim'
- name: clone config repo
git:
repo: git@code.infektor.net:config/vim.git
dest: '{{vim_config_dir}}'
version: master
# TODO: - name: set repo email
- name: install pip packages
pip:
name: '{{neovim_pip_packages}}'
state: latest
extra_args: --user
- name: check for config repo tasks.yaml
stat:
path: '{{vim_config_dir}}/tasks.yaml'
register: config_repo_tasks
- when: config_repo_tasks.stat.exists
include_tasks: '{{vim_config_dir}}/tasks.yaml'
- when: plugin_dir is defined and plugins is defined
include_tasks: 'Unix-plugins.yaml'

View File

@@ -0,0 +1,36 @@
---
- name: clone plugin repos
win_git:
repo: 'https://github.com/{{item.repo}}.git'
dest: '{{plugin_dir}}/{{item.mode | default("start")}}/{{item.repo | regex_replace("^.*\/(.*)$", "\1")}}'
branch: '{{item.branch | default("HEAD")}}'
with_items: '{{plugins}}'
- name: get list of managed plugin paths
set_fact:
managed_plugins: >-
{{
managed_plugins | default([]) + [
plugin_dir + "/" +
item.mode | default("start") + "/" +
item.repo | regex_replace("^.*\/(.*)$", "\1")
]
}}
with_items: '{{plugins}}'
- name: find all start plugin directories
win_find:
paths:
- '{{plugin_dir}}/start'
- '{{plugin_dir}}/opt'
file_type: directory
register: found_plugins
- name: remove found plugins which are not in the managed list
win_file:
path: '{{item.path}}'
state: absent
with_items: '{{found_plugins.files}}'
when: item.path not in managed_plugins
loop_control:
label: '{{item.path}}'

View File

@@ -1,14 +1,27 @@
---
- name: install chocolatey packages
win_chocolatey:
name: neovim
state: latest
- set_fact:
vim_config_dir: '{{ansible_env.LOCALAPPDATA}}\nvim'
- name: clone config repo
win_git:
repo: git@code.infektor.net:config/vim.git
dest: '{{ansible_env.LOCALAPPDATA}}/nvim'
version: master
dest: '{{vim_config_dir}}'
branch: master
# clone: false
update: true
- win_owner:
path: '{{vim_config_dir}}'
user: Benie
recurse: true
- assert:
that: False
# - TODO: neovim set repo email
# win_git_config:
@@ -23,3 +36,27 @@
dest: '{{ansible_env.ProgramData}}/Microsoft/Windows/Start Menu/Programs/nvim-qt.lnk'
icon: '{{ansible_env.ChocolateyToolsLocation}}/neovim/nvim-win64/bin/nvim-qt.exe,0'
directory: '{{ansible_env.USERPROFILE}}'
- name: check for config repo tasks.yaml
win_stat:
path: '{{vim_config_dir}}/tasks.yaml'
register: config_repo_tasks
# TODO: this doesn't work for non localhost setups
# probably need to copy the tasks.yaml and plugins.yaml to the controller in a
# temporary directory then include them
- when: config_repo_tasks.stat.exists
fetch:
src: '{{vim_config_dir}}/tasks.yaml'
dest: vim_config_tasks.yaml
flat: true
- when: config_repo_tasks.stat.exists
include_tasks: vim_config_tasks.yaml
- when: ansible_os_family != "Windows" and
plugin_dir is defined and plugins is defined
include_tasks: 'Unix-plugins.yaml'
- when: ansible_os_family == "Windows" and
plugin_dir is defined and plugins is defined
include_tasks: 'Windows-plugins.yaml'

View File

@@ -1,14 +0,0 @@
---
- name: clone config repo
git:
repo: git@code.infektor.net:config/vim.git
dest: ~/.config/nvim
version: master
# TODO: - name: set repo email
- name: install pip packages
pip:
name: '{{neovim_pip_packages}}'
state: latest
extra_args: --user

View File

@@ -1,4 +1,7 @@
---
- set_fact:
obsidian_notes_repo: '{{ansible_env.USERPROFILE}}/Documents/Notes'
- name: install chocolatey package
win_chocolatey:
name: obsidian
@@ -7,5 +10,9 @@
- name: clone notes repository
win_git:
repo: git@github.com:kbenzie/notes.git
dest: '{{ansible_env.USERPROFILE}}/Documents/Notes'
dest: '{{obsidian_notes_repo}}'
branch: main
- win_owner:
path: '{{obsidian_notes_repo}}'
user: Benie
recurse: true

View File

@@ -1,38 +0,0 @@
---
- name: get html of latest versions
uri:
url: https://raw.githubusercontent.com/kbenzie/op-release-scraper/main/op-releases.json
register: op_releases
- when: ansible_machine == "x86"
set_fact: {op_arch: '386'}
- when: ansible_machine == "x86_64"
set_fact: {op_arch: 'amd64'}
- when: ansible_machine == "arm"
set_fact: {op_arch: 'arm'}
- when: ansible_machine == "arm64"
set_fact: {op_arch: 'arm64'}
- set_fact:
op_zip_url: '{{op_releases.json[0].downloads.Linux[op_arch]}}'
- name: create directory for downloaded package
file:
state: directory
dest: ~/.local/src/op
- name: download latest release package
get_url:
url: '{{op_zip_url}}'
dest: ~/.local/src/op/op.zip
- name: extract zip package
unarchive:
src: ~/.local/src/op/op.zip
dest: ~/.local/src/op
- name: create symbolic links
file:
src: ~/.local/src/op/op
dest: ~/.local/bin/op
state: link

View File

@@ -1,16 +1,44 @@
---
- set_fact:
powershell_config_dir:
'{{ansible_env.USERPROFILE}}/Documents/WindowsPowerShell'
- name: clone config repos
win_git:
repo: git@code.infektor.net:config/WindowsPowerShell.git
dest: '{{ansible_env.USERPROFILE}}/Documents/WindowsPowerShell'
dest: '{{powershell_config_dir}}'
branch: master
- win_owner:
path: '{{powershell_config_dir}}'
user: Benie
recurse: true
- name: install chocolatey package
win_chocolatey:
name: Cmder
state: latest
- name: get NuGet package provider
ansible.windows.win_powershell:
script:
Get-PackageProvider -Name NuGet
changed_when: false
register: nuget_package_provider
- name: install NuGet package provider
when: nuget_package_provider.error | length > 0
ansible.windows.win_powershell:
script: |
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force
- name: install PsReadline module
win_psmodule:
name: PsReadline
state: latest
accept_license: true
- name: install posh-git module
win_psmodule:
name: posh-git
state: latest
accept_license: true

View File

@@ -0,0 +1,8 @@
---
- assert:
that: ansible_os_family == 'Windows'
- name: install chocolatey package
win_chocolatey:
name: powertoys
state: present

View File

@@ -0,0 +1,8 @@
---
- assert:
that: ansible_os_family == "Windows"
- name: install chocolatey package
win_chocolatey:
name: prusaslicer
state: latest

View File

@@ -0,0 +1,5 @@
---
- name: create .inputrc config file
template:
src: inputrc
dest: '{{ansible_env.HOME}}/.inputrc'

View File

@@ -0,0 +1,11 @@
# Enable vi mode
set editing-mode vi
# Insert mode mappings
set keymap vi-insert
"\C-[": vi-movement-mode
# Change cursor shape on vi mode change
set show-mode-in-prompt on
set vi-cmd-mode-string "\1\e[2 q\2"
set vi-ins-mode-string "\1\e[6 q\2"

View File

@@ -0,0 +1,12 @@
---
- assert:
that: ansible_user_id != "root"
- name: create /etc/sudoers.d/{user} config file
become: true
template:
src: sudoers
dest: '/etc/sudoers.d/{{ansible_user_id}}'
owner: root
group: root
mode: '0440'

View File

@@ -0,0 +1 @@
{{ansible_user_id}} ALL=(ALL) NOPASSWD:ALL

View File

@@ -1,5 +1,25 @@
---
# TODO:
# cp $script_dir/system-info.service ~/.config/systemd/user/system-info.service
# systemctl --user enable system-info
# systemctl --user start system-info
- name: install apt packages
become: true
apt:
name:
- gawk
- sysstat
state: latest
- name: create systemd user unit directory
file:
state: directory
dest: ~/.config/systemd/user
- name: install system-info systemd unit
copy:
src: ~/.config/tmux/system-info/system-info.service
dest: ~/.config/systemd/user/system-info.service
- name: enable system-info service
systemd:
name: system-info
scope: user
enabled: true
state: started

View File

@@ -0,0 +1,5 @@
---
- name: install homebrew package
homebrew:
name: tidy-html5
state: latest

View File

@@ -0,0 +1,6 @@
---
- name: install apt package
become: true
apt:
name: tidy
state: latest

View File

@@ -0,0 +1,2 @@
---
- include_tasks: '{{ansible_os_family}}.yaml'

View File

@@ -9,31 +9,4 @@
# TODO: - name: set repo email
- name: create layouts directory
file:
state: directory
dest: ~/.local/share/tmux/layouts
- name: create symbolic links
file:
state: link
src: '{{item.src}}'
dest: '{{item.dest}}'
with_items:
- src: ~/.config/tmux/tmux.conf
dest: ~/.tmux.conf
- src: ~/.config/tmux/layouts/session-main
dest: ~/.local/share/tmux/layouts/session-main
- src: ~/.config/tmux/layouts/window-tall
dest: ~/.local/share/tmux/layouts/window-tall
- src: ~/.config/tmux/layouts/window-wide-left
dest: ~/.local/share/tmux/layouts/window-wide-left
- src: ~/.config/tmux/layouts/window-wide-right
dest: ~/.local/share/tmux/layouts/window-wide-right
# TODO: - name: Enable tmux system-info service
# command: system-info/install.sh
# TODO: WSL2 system-info
# when: '"WSL" in ansible_kernel'
# figure out best way to run daemon...
- include_tasks: ~/.config/tmux/tasks.yaml

View File

@@ -0,0 +1,5 @@
---
- name: install homebrew package
homebrew:
name: wget
state: latest

View File

@@ -0,0 +1,5 @@
---
- name: install apt package
apt:
name: wget
state: latest

View File

@@ -0,0 +1,16 @@
---
- include_tasks: '{{ansible_os_family}}.yaml'
- name: create directories
file:
state: directory
dest: '{{item}}'
with_items:
- ~/.config/wget
- ~/.cache/wget
- name: create config file
copy:
content: |
hsts-file = {{ansible_env.HOME}}/.cache/wget/hsts
dest: ~/.config/wget/rc

View File

@@ -40,3 +40,21 @@
with_items:
- win_git.ps1
- win_git.py
- name: read /etc/resolv.conf file contents
set_fact:
resolv_conf: '{{lookup("ansible.builtin.file", "/etc/resolv.conf")}}'
- name: get Windows host IP from /etc/resolv.conf
set_fact:
host_ip: '{{resolv_conf | regex_search("(\d+\.\d+\.\d+\.\d+)")}}'
- name: add $(hostname).local to /etc/hosts
become: true
lineinfile:
path: /etc/hosts
regexp: '^{{host_ip | replace(".", "\.")}}'
line: '{{host_ip}} {{ansible_hostname}}.local'
owner: root
group: root
mode: '0644'

View File

@@ -0,0 +1,5 @@
---
- name: install homebrew package
homebrew:
name: yq
state: latest

View File

@@ -0,0 +1,37 @@
---
- name: get latest github release
uri:
url: https://api.github.com/repos/mikefarah/yq/releases/latest
register: latest
- set_fact:
asset_query: '[?contains(name, `yq_linux_amd64`)] | [0]'
assets: '{{latest.json.assets}}'
latest_version: '{{latest.json.tag_name[1:]}}'
yq_exe: '{{ansible_env.HOME}}/.local/bin/yq'
- name: check if already installed
stat:
path: '{{yq_exe}}'
register: yq_stat
- name: get installed version
when: yq_stat.stat.exists == True
command: '{{yq_exe}} --version'
register: yq_version_output
changed_when: false
- when: yq_stat.stat.exists == True
set_fact:
installed_version:
'{{yq_version_output.stdout.strip() | regex_replace("^.*(\d+\.\d+\.\d+).*$", "\1")}}'
- set_fact:
asset: '{{assets | to_json | from_json | json_query(asset_query)}}'
- name: download executable
when: installed_version is not defined or installed_version != latest_version
get_url:
url: '{{asset.browser_download_url}}'
dest: '{{yq_exe}}'
mode: +x

View File

@@ -0,0 +1,5 @@
---
- name: install chocolatey package
win_chocolatey:
name: yq
state: latest

2
roles/yq/tasks/main.yaml Normal file
View File

@@ -0,0 +1,2 @@
---
- include_tasks: '{{ansible_os_family}}.yaml'

View File

@@ -20,6 +20,8 @@
dest: ~/.config/zsh/zsh-syntax-highlighting
- repo: https://github.com/zsh-users/zsh-completions.git
dest: ~/.config/zsh/zsh-completions
loop_control:
label: '{{item.repo | regex_search("https://github.com/(.*)\.git$", "\1")}}'
- name: create directories
file:
@@ -59,6 +61,8 @@
dest: ~/.local/bin/cmake-uninstall
- src: ~/.config/zsh/$
dest: ~/.local/bin/$
loop_control:
label: '{{item.dest}}'
- name: get absolute path
shell: command -v zsh