77 Commits

Author SHA1 Message Date
d20cba3e15 Replace Magnet with Rectangle 2025-12-02 23:23:48 +00:00
27f887b044 Actually output yaml in results 2025-12-02 23:08:50 +00:00
c70a31b633 Install iSMC as part of system-info role 2025-11-26 22:35:06 +00:00
80434f1cfa Add tuck module 2025-11-26 22:33:15 +00:00
658e35a145 Explicitly enable inject_facts_as_vars
Injecting facts as variables is being deprecated by default, override
this in `ansible.cfg` to silence deprecation warnings.
2025-11-26 20:50:00 +00:00
06a4d1b923 Remove corepack from nodejs role 2025-11-23 11:17:38 +00:00
fe220c231a Also install hammerspoon spoons 2025-11-11 23:00:33 +00:00
e633da1e7c Add hammerspoon role 2025-11-06 20:56:42 +00:00
7823cfb683 Ensure gawk is install on macOS for system-info 2025-10-30 17:42:19 +00:00
0a385259a5 Add work specific macOS playbook 2025-10-30 15:41:45 +00:00
cf77532254 Add todo to macos role 2025-10-30 15:41:31 +00:00
7e2a813682 Fix system-info role on macOS fresh install 2025-10-30 15:40:40 +00:00
9bd29dcdd2 Add fedora-workstation role
Install non-free gstreamer plugins
2025-08-26 15:05:12 +01:00
173c7261b3 Add todo to gnome-shell role 2025-08-18 22:30:31 +01:00
ee3ea63383 Add gemini-cli role 2025-08-18 22:30:22 +01:00
d41ea98da0 Add typst role 2025-08-18 13:00:27 +01:00
77a4fdcc16 Add nvtop role 2025-08-17 22:10:44 +01:00
8810309515 Silence deprecation warning on yaml output 2025-08-13 23:03:42 +01:00
b6b18b2b94 Fix 1password-cli install on Windows 2025-08-13 23:03:28 +01:00
2286452f5b Fix win_git error message 2025-08-13 22:50:57 +01:00
ae689d46b1 Reenable kitty role 2025-07-29 12:45:22 +01:00
6882a9dda3 Add neovide role 2025-07-29 12:39:46 +01:00
4bc647bcad Switch back to Chocolatey for 1password on Windows 2025-07-21 09:32:52 +01:00
928f9b2cfc Loop over old neovim stow directories 2025-07-01 12:56:14 +01:00
b47d77b671 Disable kitty role on macOS until OSC 52 bug is fixed 2025-03-18 10:59:04 +00:00
689f83250f Fixes for macOS
* Replace microsoft-remote-desktop with windows-app
* Remove deprecated tap homebrew/cask-fonts
2025-03-18 10:36:43 +00:00
d8a46b017d Add mouse.ahk to autohotkey role
Enable natural scrolling on Windows without relying on the
`FlipFlopWheel` registry key which doesn't always work and depends on
knowing the device instance path for the mouse HID.
2025-02-06 22:30:19 +00:00
518efca73d Fix neovim install after release package asset name change 2025-01-31 10:02:37 +00:00
002bc54819 Fix win_winget requesting input 2025-01-20 23:59:11 +00:00
6b77328851 Add gnome-shell todos 2025-01-16 21:54:10 +00:00
fbd829218b Fix subshine systemd unit task 2025-01-16 21:36:07 +00:00
df5390c31e Accept winget package agreements 2025-01-06 00:23:26 +00:00
5eb6570617 Fix spelling of remove 2025-01-06 00:11:39 +00:00
79b1cf98eb Fix powershell config git url 2024-12-13 21:00:40 +00:00
5210a451b2 Switch neovim role over to winget 2024-12-10 23:27:42 +00:00
d18a9550c9 Remove unnecessary neovim pip packages 2024-12-10 23:27:16 +00:00
1995bf3bc2 Support lists of packages in win_winget module 2024-12-10 23:19:24 +00:00
a9aa1bdaaf Update apple-music role with for new win_winget module 2024-12-10 00:54:17 +00:00
96cf066d74 Add basic win_winget module 2024-12-10 00:54:01 +00:00
5ed3297984 Remove comment from win_git.py 2024-12-07 16:34:55 +00:00
bb2cf61658 Don't install Cider on Windows
Also add the `apple-music` role, although it currently isn't invoked as
the `win_winget` module does not exist yet.
2024-12-06 21:01:52 +00:00
df330b6a73 Add wezterm role for Windows 2024-11-08 22:07:27 +00:00
c2d03c503a Add todo to windows-terminal 2024-11-08 21:17:04 +00:00
0d102debb9 Fix powershell win_scoop usage 2024-11-08 21:08:47 +00:00
d9ce158a2f Add pwsh scoop package and run install.ps1 script 2024-10-16 22:47:00 +01:00
1ecad1214b Fix glab asset query after package names changed 2024-10-09 20:08:07 +01:00
b6a22a295b Ignore __pycache__ 2024-09-11 19:24:06 +01:00
2874dd3674 Fix ripgrep role on not Windows 2024-08-23 20:46:07 +01:00
3008424a13 Transition yq to scoop 2024-08-10 12:36:03 +01:00
5004779045 Transition ripgrep to scoop 2024-08-10 12:13:49 +01:00
3c55848bc8 Assert that Scoop is installed before use 2024-08-10 12:13:29 +01:00
1447a04ab4 Ensure scoop extras bucket is owned by correct user 2024-08-10 12:11:54 +01:00
a624be3ac0 Transition jq to scoop 2024-08-09 21:33:39 +01:00
282d38579c Transition glab to scoop 2024-08-09 21:32:29 +01:00
3cdaa8abd6 Transition gh to scoop 2024-08-09 21:25:01 +01:00
323796eb24 Transition fzf to scoop 2024-08-09 21:19:04 +01:00
d9f7d0513a Transition fd to scoop 2024-08-09 21:17:34 +01:00
d3e4a81b48 Transition curl to scoop 2024-08-09 21:15:59 +01:00
45b0780f48 Transition bat to scoop 2024-08-09 21:06:59 +01:00
f9a090c798 Transition ag to scoop 2024-08-09 21:05:17 +01:00
6089961e36 Split out CLI from Windows in to WindowsCLI playbook 2024-08-09 21:04:55 +01:00
471a358321 Add scoop role 2024-08-09 20:52:10 +01:00
567ed28def Update win_git to update remote URL if different 2024-08-09 16:07:55 +01:00
5f9de82ca3 Create ~/.config/autostart in 1password role 2024-07-26 22:18:44 +01:00
6e9890fe5d Switch from code.infektor.net to git.infektor.net 2024-07-13 20:57:08 +01:00
1b0dbb4727 Respect disable_systemd variable for Linux CLI playbook 2024-07-13 10:45:57 +01:00
dfbfa7c170 Move ulauncher autostart our of gnome-shell role 2024-07-07 12:01:31 +01:00
fc0e933df6 Move 1password autostart our of gnome-shell role 2024-07-07 12:00:42 +01:00
37f9615643 Add ubuntu gnome-shell config 2024-07-07 11:50:36 +01:00
cf9bc807d6 Add configuration of autostart applications 2024-07-07 11:49:36 +01:00
3e9b32b32f Add psutil to list of python role dependencies 2024-07-06 23:09:13 +01:00
1965529cb6 Finally configure gnome custom keybindings 2024-07-06 23:04:04 +01:00
30e2a123c0 Disable activate-window-menu gnome keybinding 2024-07-06 21:24:12 +01:00
8e0743cbba Add gsettings module & use it
Disable switch-input-source & switch-input-source-backward keybindings.
2024-07-06 21:02:42 +01:00
cbe9b40023 Fix ulauncher role on Ubuntu derived distros 2024-07-06 13:04:10 +01:00
18bf23864c Also install gnome-themes-extra for gnome-shell 2024-07-03 21:35:58 +01:00
1363fb8327 Remove guake role use Gnome extension instead 2024-07-03 21:35:58 +01:00
69 changed files with 1137 additions and 234 deletions

1
.gitignore vendored
View File

@@ -1,2 +1,3 @@
external
playbooks/test.yaml
__pycache__

View File

@@ -2,4 +2,5 @@
collections_path = collections
library = library
roles_path = roles
stdout_callback = yaml
callback_result_format = yaml
inject_facts_as_vars = True

146
library/gsettings.py Normal file
View File

@@ -0,0 +1,146 @@
# -*- coding: utf-8 -*-
from typing import Tuple
from ansible.module_utils.basic import AnsibleModule
DOCUMENTATION = """
module: gsettings
author:
- Kenneth Benzie (Benie)
short_description: Ansible module for the gsettings configuration tool
options:
schema:
description:
- Schema ID of the settings to configure.
type: str
key:
description:
- Key of an individaul setting to configure.
type: str
value:
description:
- Value to configure the setting with.
- Mutually exclusive with reset.
type: str
reset:
description:
- Flag to reset the setting to the default value.
- Mutually exclusive with value.
type:
default: false
"""
EXAMPLES = """
- name: get gnome color-scheme current value
gsettings:
schema: org.gnome.desktop.interface
key: color-scheme
register: color_scheme
- debug: msg={{color_scheme.value}}
- name: set gnome color-scheme to 'prefer-dark'
gsettings:
schema: org.gnome.desktop.interface
key: color-scheme
value: "'prefer-dark'"
- name: reset gnome color-scheme to default value
gsettings:
schema: org.gnome.desktop.interface
key: color-scheme
reset: true
"""
RETURN = """
value:
description: Value of the setting.
returned: Returned when there is a value.
type: str
sample: "'default'"
stderr:
description: Error output from gsettings.
returned: Returned when there is an error.
type: str
sample: No such key “doesnt-exist”
"""
class GSettingsError(Exception):
def __init__(self, command, rc, stderr):
self.command = command
self.rc = (rc,)
self.stderr = stderr
def gsettings_get(module: AnsibleModule) -> Tuple[bool, str]:
command = [
"gsettings",
"get",
module.params["schema"],
module.params["key"],
]
rc, stdout, stderr = module.run_command(command)
if rc != 0:
raise GSettingsError(command, rc, stderr)
return False, stdout.rstrip()
def gsettings_set(module: AnsibleModule) -> Tuple[bool, str]:
command = [
"gsettings",
"set",
module.params["schema"],
module.params["key"],
module.params["value"],
]
_, before = gsettings_get(module)
rc, _, stderr = module.run_command(command)
if rc != 0:
raise GSettingsError(command, rc, stderr)
_, after = gsettings_get(module)
return before != after, after
def gsettings_reset(module: AnsibleModule) -> Tuple[bool, str]:
command = [
"gsettings",
"reset",
module.params["schema"],
module.params["key"],
]
_, before = gsettings_get(module)
rc, stdout, stderr = module.run_command(command)
if rc != 0:
raise GSettingsError(command, rc, stderr)
_, after = gsettings_get(module)
return before != after, after
def main() -> None:
module = AnsibleModule(
argument_spec=dict(
schema=dict(type="str"),
key=dict(type="str"),
value=dict(type="str"),
reset=dict(type="bool", default=False),
),
mutually_exclusive=[["value", "reset"]],
required_together=[["schema", "key"]],
)
try:
if module.params["value"]:
changed, value = gsettings_set(module)
elif module.params["reset"]:
changed, value = gsettings_reset(module)
else:
changed, value = gsettings_get(module)
module.exit_json(changed=changed, value=value)
except GSettingsError as error:
module.fail_json(
f"{error.command} failed ({error.rc}): {error.stderr}", stderr=error.stderr
)
if __name__ == "__main__":
main()

121
library/tuck.py Normal file
View File

@@ -0,0 +1,121 @@
# -*- coding: utf-8 -*-
import os
import subprocess
from os import environ
from pathlib import Path
import requests
from ansible.module_utils.basic import AnsibleModule
DOCUMENTATION = """
module: tuck
author:
- Kenneth Benzie (Benie)
short_description: Ansible kmodule for the tuck tool
options:
name:
description:
- GitHub project name of the package to manage
type: str
state:
description:
- Desired state of the package
type: str
choices:
- "latest"
- "absent"
"""
EXAMPLES = """
- name: install package
tuck:
name: kbenzie/tuck
state: present
- name: uninstall package
tuck:
name: kbenzie/tuck
state: absent
"""
def installed(tuck) -> list[str]:
result = subprocess.run(
[tuck, "list", "--quiet"],
capture_output=True,
check=True,
)
return result.stdout.decode("utf-8").split("\n")
def present(tuck: Path, package: str) -> dict:
if package in installed(tuck):
return dict(changed=False)
return latest(tuck, package)
def latest(tuck: Path, package: str) -> dict:
result = subprocess.run(
[tuck, "install", package],
capture_output=True,
check=True,
)
return dict(changed=True, stdout=result.stdout)
def absent(tuck: Path, package: str) -> dict:
if package not in installed(tuck):
return dict(changed=False)
result = subprocess.run(
[tuck, "remove", package],
capture_output=True,
check=True,
)
return dict(changed=True, stdout=result.stdout)
def main():
module = AnsibleModule(
argument_spec=dict(
name=dict(type="str"),
state=dict(
type="str",
choices=[
"absent",
"latest",
"present",
],
default="present",
),
),
supports_check_mode=False,
)
tuck = Path(environ["HOME"]) / ".local" / "bin" / "tuck"
try:
if not (tuck.is_file() and os.access(tuck, os.X_OK)):
response = requests.get("https://kbenzie.github.io/tuck/get.sh")
response.raise_for_status()
subprocess.run(
["/bin/sh"],
input=response.text.encode("utf-8"),
check=True,
)
module.exit_json(
**{
"absent": absent,
"present": present,
"latest": latest,
}[module.params["state"]](tuck, module.params["name"])
)
except requests.RequestException as error:
module.fail_json(f"failed to install tuck: {error}")
except subprocess.CalledProcessError as error:
module.fail_json(f"failed to install tuck: {error.stderr}")
if __name__ == "__main__":
main()

View File

@@ -93,7 +93,7 @@ function Get-GitRemoteHeadBranch {
$result = Run-Command -command $command -working_directory $dest
if ($result.rc -ne 0) {
$module.FailJson("Could not determine the default HEAD branch of remote: $remote" ` +
"$result.stdout $result.stderr")
$result.stderr)
}
return $result.stdout.Trim().Replace("$remote/", '')
}
@@ -108,6 +108,16 @@ function Get-GitCurrentSha {
return $result.stdout.Trim()
}
function Get-GitRemoteUrl {
[CmdletBinding()]
Param (
[Parameter(Mandatory = $true)] [String] $dest,
[Parameter(Mandatory = $true)] [String] $remote
)
$result = Run-Command -command "`"$git`" remote get-url $remote" -working_directory $dest
return $result.stdout.Trim()
}
function Invoke-GitClone {
[CmdletBinding()]
Param (
@@ -187,6 +197,19 @@ function Invoke-GitSubmoduleUpdate {
}
}
function Invoke-GitRemoteSetUrl {
[CmdletBinding()]
Param (
[Parameter(Mandatory = $true)] [String] $dest,
[Parameter(Mandatory = $true)] [String] $remote,
[Parameter(Mandatory = $true)] [String] $url
)
$result = Run-Command -command "`"$git`" remote set-url $remote `"$url`"" -working_directory $dest
if ($result.rc -ne 0) {
$module.FailJson("Failed to set remote URL:`n" + $result.stderr)
}
}
# ================================ Start logic =================================
if (!$dest) {
@@ -207,6 +230,10 @@ if (($dest -and ![System.IO.File]::Exists($gitconfig))) {
if (Test-GitLocalChanges $dest) {
$module.FailJson('Local modifications exist in repository.')
}
$url = Get-GitRemoteUrl $dest $remote
if ($url -ne $repo) {
Invoke-GitRemoteSetUrl $dest $remote $repo
}
Invoke-GitFetch $dest $remote $version
Invoke-GitCheckout $dest $remote $version
Invoke-GitPull $dest $remote $version

View File

@@ -22,27 +22,6 @@ seealso:
- module: ansible.builtin.git
'''
# DOCUMENTATION = r'''
# ---
# module: win_ping
# short_description: A windows version of the classic ping module
# description:
# - Checks management connectivity of a windows host.
# - This is NOT ICMP ping, this is just a trivial test module.
# - For non-Windows targets, use the M(ansible.builtin.ping) module instead.
# options:
# data:
# description:
# - Alternate data to return instead of 'pong'.
# - If this parameter is set to C(crash), the module will cause an exception.
# type: str
# default: pong
# seealso:
# - module: ansible.builtin.ping
# author:
# - Chris Church (@cchurch)
# '''
EXAMPLES = r'''
# Test connectivity to a windows host
# ansible winserver -m ansible.windows.win_ping

99
library/win_winget.ps1 Normal file
View File

@@ -0,0 +1,99 @@
#!powershell
#AnsibleRequires -CSharpUtil Ansible.Basic
#AnsibleRequires -PowerShell Ansible.ModuleUtils.CommandUtil
$module = [Ansible.Basic.AnsibleModule]::Create($args, @{
options = @{
name = @{
type = "list"
elements = "str"
required = $true
}
state = @{
type = "str"
default = "present"
choices = ("absent", "latest", "present")
}
}
supports_check_mode = $false
})
$names = $module.Params.name
$state = $module.Params.state
$winget = Get-ExecutablePath "winget"
$noPackageString = "No installed package found matching input criteria."
if ($name -and $id) {
$module.FailJson("name `"$name`" and id `"$id`" must not both be provided")
}
function Test-Installed {
$command = "`"$winget`" list `"$name`""
$result = Run-Command -command $command
if ($result.rc -eq 0) {
return $true
}
return $false
}
function Test-UpgradeAvailable {
if (!(Test-Installed)) {
return $true
}
$command = "`"$winget`" list --upgrade-available `"$name`""
$result = Run-Command -command $command
if ($result.stdout.Contains($noPackageString)) {
return $false
}
return $true
}
foreach ($name in $names) {
switch ($state) {
"absent" {
if (Test-Installed) {
$command = "`"$winget`" uninstall `"$name`""
$result = Run-Command -command $command
if ($result.rc -ne 0) {
$module.Result.rc = $result.rc
$module.Result.stdout = $result.stdout
$module.FailJson("Failed to uninstall package `"$name`"")
}
$module.Result.stdout = $result.stdout
$module.Result.changed = $true
}
}
"latest" {
if (Test-UpgradeAvailable) {
$command = "`"$winget`" install --accept-package-agreements --accept-source-agreements `"$name`""
$result = Run-Command -command $command
if ($result.rc -ne 0) {
$module.Result.rc = $result.rc
$module.Result.stdout = $result.stdout
$module.FailJson("Failed to install package `"$name`"")
}
$module.Result.stdout = $result.stdout
$module.Result.changed = $true
}
}
"present" {
if (!(Test-Installed)) {
$command = "`"$winget`" install --accept-package-agreements --accept-source-agreements `"$name`""
$result = Run-Command -command $command
if ($result.rc -ne 0) {
$module.Result.rc = $result.rc
$module.Result.stdout = $result.stdout
$module.FailJson("Failed to install package `"$name`"")
}
$module.Result.stdout = $result.stdout
$module.Result.changed = $true
}
}
}
}
$module.Result.rc = 0
$module.ExitJson()

47
library/win_winget.py Normal file
View File

@@ -0,0 +1,47 @@
# -*- coding: utf-8 -*-
DOCUMENTATION = '''
module: win_winget
author:
- "Kenneth Benzie (Benie)"
short_desription: Manages packages with WinGet
description:
- Magage packages using WinGet.
options:
name:
description:
- Name of the package to manage.
type: list[str]
state:
description:
- Indicates the desired package state. V(latest) ensures that the latest
version is installed.
type: str
choices: [ absent, present, latest ]
default: present
'''
EXAMPLES = '''
- name: Install Apple Music
win_winget:
name: Apple Music
state: present
- name: Install latest version of Neovim Qt
win_winget:
name: neovim-qt
state: latest
- name: Uninstall Microsoft OneDrive
win_winget:
id: Microsoft.OneDrive
state: absent
'''
RETURN = '''
stdout:
description: Output from WinGet.
returned: Success, when needed.
type: str
sample: ''
'''

View File

@@ -7,9 +7,11 @@
roles:
- role: firefox
- role: kitty
- role: guake
- role: cider
- role: ulauncher
- role: gnome-shell
when: "'GNOME' in ansible_env.XDG_CURRENT_DESKTOP"
- role: xremap
when: "'GNOME' in ansible_env.XDG_CURRENT_DESKTOP"
- role: fedora-workstation
when: ansible_os_family == 'RedHat' and ansible_distribution == 'Fedora'

View File

@@ -11,5 +11,7 @@
- vars/environment.yaml
roles:
- role: gdb
- role: nvtop
- role: podman
- role: system-info
when: disable_systemd is not defined

View File

@@ -30,6 +30,7 @@
- role: ripgrep
- role: tidy
- role: tree
- role: typst
- role: watch
- role: wget
- role: yq

View File

@@ -1,35 +1,17 @@
---
- import_playbook: WindowsCLI.yaml
- hosts: windows
vars_files:
- vars/environment.yaml
roles:
- role: python
- role: git
- role: powershell
- role: neovim
- role: system-info
- role: ag
- role: bat
- role: curl
- role: fd
- role: fzf
- role: gh
- role: glab
- role: jq
- role: ripgrep
- role: tree
- role: yq
- role: llvm
- role: nodejs
- role: 1password
- role: autohotkey
- role: cider
- role: apple-music
- role: ferdium
- role: firefox
- role: fonts
- role: obsidian
- role: powertoys
- role: windows-terminal
- role: wezterm
- role: neovide

27
playbooks/WindowsCLI.yaml Normal file
View File

@@ -0,0 +1,27 @@
---
- hosts: windows
vars_files:
- vars/environment.yaml
roles:
- role: scoop
- role: python
- role: git
- role: powershell
- role: neovim
- role: system-info
- role: ag
- role: bat
- role: curl
- role: fd
- role: fzf
- role: gh
- role: glab
- role: jq
- role: ripgrep
- role: tree
- role: typst
- role: yq
- role: llvm
- role: nodejs

12
playbooks/macOS-work.yaml Normal file
View File

@@ -0,0 +1,12 @@
---
- import_playbook: UnixCLI.yaml
- hosts: localhost
vars_files:
- vars/environment.yaml
roles:
- role: system-info
- role: fonts
- role: iterm
- role: kitty
- role: neovide
- role: macos

View File

@@ -15,8 +15,9 @@
- role: hiddenbar
- role: iterm
- role: kitty
- role: magnet
- role: microsoft-remote-desktop
- role: neovide
- role: rectangle
- role: windows-app
- role: viscosity
- role: macos

View File

@@ -62,4 +62,5 @@
src: /mnt/c/Users/Benie/AppData/Local/1Password/cli/op.exe
dest: ~/.local/bin/op
- include_tasks: linux-autostart.yaml
- include_tasks: zsh-completion.yaml

View File

@@ -20,3 +20,5 @@
dnf:
name: 1password
state: latest
- include_tasks: linux-autostart.yaml

View File

@@ -6,26 +6,10 @@
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: download latest installer
when: not app_stat.stat.exists
win_get_url:
url: https://downloads.1password.com/win/1PasswordSetup-latest.exe
dest: '{{installer_exe}}'
environment: '{{proxy_environment}}'
- name: run installer
when: not app_stat.stat.exists
win_command: '{{installer_exe}}'
- name: remove installer
win_file:
path: '{{installer_exe}}'
state: absent
- name: install chocolatey package
win_chocolatey:
state: latest
name: 1password
- name: create start menu shortcut
win_shortcut:
@@ -34,51 +18,27 @@
icon: '{{app_exe}},0'
# CLI
- name: install scoop cli package
community.windows.win_scoop:
state: present
name: 1password-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: create cli directory
win_file:
state: directory
path: '{{cli_dir}}'
- name: get installed op version
when: cli_stat.stat.exists == True
win_command: '{{cli_exe}} --version'
register: cli_version
changed_when: false
- name: remove old op executable
win_file:
state: absent
path: '{{cli_dir}}\op.exe'
- 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}}'
environment: '{{proxy_environment}}'
- 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
- name: remove old op install directory from user PATH
win_path:
state: absent
scope: user
name: Path
elements: '{{cli_dir}}'
@@ -86,7 +46,7 @@
- name: get op powershell completion script
win_command:
argv:
- '{{ansible_env.LOCALAPPDATA}}/1Password/cli/op.exe'
- '{{ansible_env.LOCALAPPDATA}}\Scoop\shims\op.exe'
- completion
- powershell
register: powershell_completion_script

View File

@@ -0,0 +1,20 @@
---
- name: create ~/.config/autostart directory
file:
state: directory
path: ~/.config/autostart
- name: create autostart desktop file
copy:
dest: '{{ansible_env.HOME}}/.config/autostart/1password.desktop'
content: |
[Desktop Entry]
Name=1Password
Exec=/opt/1Password/1password %U
Terminal=false
Type=Application
Icon=1password
StartupWMClass=1Password
Comment=Password manager and secure wallet
MimeType=x-scheme-handler/onepassword;x-scheme-handler/onepassword8;
Categories=Office;

View File

@@ -1,5 +1,10 @@
---
- name: install chocolatey package
- name: remove chocolatey package
win_chocolatey:
name: ag
state: latest
state: absent
- name: install scoop package
community.windows.win_scoop:
name: ag
state: present

View File

@@ -0,0 +1,10 @@
---
- name: install Apple Music from Microsoft Store
win_winget:
name: Apple Music
state: latest
- name: remove Cider from Chocolatey
win_chocolatey:
name: Cider
state: absent

View File

@@ -6,7 +6,7 @@
- name: clone config repo
win_git:
repo: git@code.infektor.net:config/AutoHotKey.git
repo: git@git.infektor.net:config/AutoHotKey.git
dest: '{{autohotkey_repo_dir}}'
branch: main
@@ -31,3 +31,25 @@
run_level: highest
start_when_available: true
wake_to_run: false
- name: create scheduled task
win_scheduled_task:
path: Benie
name: mouse.ahk
state: present
enable: true
triggers:
- type: logon
enabled: true
- type: registration
enabled: true
actions:
- path: '{{autohotkey_repo_dir}}/mouse.ahk'
disallow_start_if_on_batteries: false
stop_if_going_on_batteries: false
execution_time_limit: PT0S
logon_type: interactive_token
multiple_instances: 3
run_level: highest
start_when_available: true
wake_to_run: false

View File

@@ -1,5 +1,10 @@
---
- name: install chocolatey package
- name: remove chocolatey package
win_chocolatey:
name: Bat
state: latest
state: absent
- name: install scoop package
community.windows.win_scoop:
name: bat
state: present

View File

@@ -1,5 +1,10 @@
---
- name: install chocolatey package
- name: remove chocolatey package
win_chocolatey:
name: curl
state: latest
state: absent
- name: install scoop package
community.windows.win_scoop:
name: curl
state: present

View File

@@ -19,8 +19,14 @@
name: fd
state: latest
- name: install Chocolatey package
- name: remove chocolatey package
when: ansible_os_family == 'Windows'
win_chocolatey:
name: fd
state: latest
state: absent
- name: install scoop package
when: ansible_os_family == 'Windows'
community.windows.win_scoop:
name: fd
state: present

View File

@@ -0,0 +1,16 @@
---
- assert:
that: ansible_os_family == 'RedHat' and ansible_distribution == 'Fedora'
- name: install non-free gstreamer plugins
become: true
dnf:
state: latest
allowerasing: true
name:
- ffmpeg
- gstreamer1-plugins-bad-free
- gstreamer1-plugins-bad-freeworld
- gstreamer1-plugins-base
- gstreamer1-plugins-good
- gstreamer1-plugins-ugly

View File

@@ -1,8 +1,4 @@
---
- name: enable homebrew tap
homebrew_tap:
name: homebrew/cask-fonts
- name: install Caskaydia Cove Nerd Font
homebrew_cask:
name: font-caskaydia-cove-nerd-font

View File

@@ -1,5 +1,10 @@
---
- name: install chocolatey package
- name: remove chocolatey package
win_chocolatey:
name: fzf
state: latest
state: absent
- name: install scoop package
community.windows.win_scoop:
name: fzf
state: present

View File

@@ -0,0 +1,14 @@
---
- name: install homebrew package
when: ansible_os_family == 'Darwin'
homebrew:
state: latest
name: gemini-cli
- name: install npm package
when: ansible_os_family != 'Darwin'
become: true
community.general.npm:
name: '@google/gemini-cli'
state: latest
global: true

View File

@@ -1,5 +1,10 @@
---
- name: install chocolatey package
- name: remove chocolatey package
win_chocolatey:
name: gh
state: latest
state: absent
- name: install scoop package
community.windows.win_scoop:
name: gh
state: present

View File

@@ -1,8 +1,8 @@
---
git_config_repos:
- repo: git@code.infektor.net:config/git.git
- repo: git@git.infektor.net:config/git.git
name: git
- repo: git@code.infektor.net:benie/config.git
- repo: git@git.infektor.net:benie/config.git
name: private
git_pip_packages:
- git+https://github.com/kbenzie/git-issue.git

View File

@@ -31,8 +31,9 @@
latest_version: '{{releases.json[0].tag_name}}'
query: >
[?contains(name, `glab`)] |
[?contains(name, `Linux`)] |
[?contains(name, `{{ansible_machine}}.deb`)] | [0]
[?contains(name, `linux`)] |
[?contains(name, `{{
{'x86_64': 'amd64', 'arm64': 'arm64'}[ansible_machine]}}.deb`)] | [0]
- set_fact:
asset: '{{latest.assets.links|json_query(query)}}'

View File

@@ -1,5 +1,12 @@
---
- name: install chocolatey package
- name: remove chocolatey package
win_chocolatey:
name:
- glab
- glab.portable
state: absent
- name: install scoop package
community.windows.win_scoop:
name: glab
state: latest
state: present

View File

@@ -0,0 +1,18 @@
---
- name: ubuntu dock disable dock-fixed
gsettings:
schema: org.gnome.shell.extensions.dash-to-dock
key: dock-fixed
value: 'false'
- name: ubuntu dock set dock-position to bottom
gsettings:
schema: org.gnome.shell.extensions.dash-to-dock
key: dock-position
value: "'BOTTOM'"
- name: ubuntu dock disable extend-height
gsettings:
schema: org.gnome.shell.extensions.dash-to-dock
key: extend-height
value: 'false'

View File

@@ -2,29 +2,72 @@
- assert:
that: "'GNOME' in ansible_env.XDG_CURRENT_DESKTOP"
- name: install gnome-tweaks
- name: install packages
become: true
package:
name: gnome-tweaks
name:
- gnome-tweaks
- gnome-themes-extra
state: latest
- name: prefer dark mode
gsettings:
schema: org.gnome.desktop.interface
key: color-scheme
value: "'prefer-dark'"
- name: disable activate-window-menu keybinding
gsettings:
schema: org.gnome.desktop.wm.keybindings
key: activate-window-menu
value: '@as []'
- name: disable switch-input-source keybinding
gsettings:
schema: org.gnome.desktop.wm.keybindings
key: switch-input-source
value: '@as []'
- name: disable switch-input-source-backward keybinding
gsettings:
schema: org.gnome.desktop.wm.keybindings
key: switch-input-source-backward
value: '@as []'
# TODO: window full screen toggle keybinding
# NOTE: Use this command to see default keybindings
# gsettings list-recursively | grep -i -E 'media-keys|keybindings'
# NOTE: Use this command to inspect the current state of the custom keybindings
# dconf dump / | sed -n '/\[org.gnome.settings-daemon.plugins.media-keys/,/^$/p'
# TODO: List of custom-keybindings
# [org/gnome/settings-daemon/plugins/media-keys]
# custom-keybindings=['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/']
- name: 1password quick access custom keybinding
dconf:
state: present
key: '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/{{item.key}}'
value: '{{item.value}}'
with_items:
- {key: 'binding', value: "'<Shift><Alt>space'"}
- {key: 'command', value: "'1password --quick-access'"}
- {key: 'name', value: "'1Password Quick Access'"}
# TODO: 1Password Quick Access
# [org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0]
# binding='<Shift><Alt>space'
# command='1password --quick-access'
# name='1Password Quick Access'
- name: ulauncher toggle custom keybinding
dconf:
state: present
key: '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/{{item.key}}'
value: '{{item.value}}'
with_items:
- {key: 'binding', value: "'<Alt>space'"}
- {key: 'command', value: "'ulauncher-toggle'"}
- {key: 'name', value: "'Ulauncher Toggle'"}
# TODO: Guake toggle - this requires removing a default binding
# [org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1]
# binding='<Super>space'
# command='guake-toggle'
# name='Guake Toggle'
- name: list of entries defining custom-keybindings
dconf:
state: present
key: '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings'
value: "['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/']"
- when: ansible_distribution == 'Ubuntu'
include_tasks: Ubuntu.yaml
# TODO: install gnome extensions
# TODO: /org/gnome/shell/extensions/quake-terminal/terminal-shortcut = ['<Super>space']

View File

@@ -0,0 +1,29 @@
---
- set_fact:
config_dir: '{{ansible_env.HOME}}/.hammerspoon'
- name: create config directory
file:
state: directory
path: '{{config_dir}}'
- name: install config file
template:
src: init.lua
dest: '{{config_dir}}/init.lua'
- name: install homebrew package
homebrew:
state: latest
name: hammerspoon
- name: create spoons directory
file:
state: directory
path: '{{config_dir}}/Spoons'
- name: install SpoonInstall Spoon
unarchive:
src: https://github.com/Hammerspoon/Spoons/raw/master/Spoons/SpoonInstall.spoon.zip
dest: '{{config_dir}}/Spoons'
remote_src: yes

View File

@@ -0,0 +1,20 @@
require('hs.ipc')
hs.loadSpoon("SpoonInstall")
spoon.SpoonInstall:andUse("EmmyLua")
hs.hotkey.bind({'alt', 'cmd'}, 'B', function()
hs.application.launchOrFocus('Firefox')
end)
hs.hotkey.bind({'alt', 'cmd'}, 'T', function()
hs.application.launchOrFocus('kitty')
end)
hs.hotkey.bind({'alt', 'cmd'}, 'F', function()
hs.application.launchOrFocus('Ferdium')
end)
pcall(function()
require('local')
end)

View File

@@ -1,5 +1,10 @@
---
- name: install chocolatey package
- name: remove chocolatey package
win_chocolatey:
name: jq
state: latest
state: absent
- name: install scoop package
community.windows.win_scoop:
name: jq
state: present

View File

@@ -3,6 +3,6 @@
- name: clone config repo
git:
repo: git@code.infektor.net:config/kitty.git
repo: git@git.infektor.net:config/kitty.git
dest: ~/.config/kitty
version: main

View File

@@ -7,3 +7,5 @@
domain: com.apple.desktopservices
key: DSDontWriteNetworkStores
value: 'true'
# TODO: ^Space Keyboard Shortcut for switching Input Sources

View File

@@ -0,0 +1,14 @@
---
- name: install homebrew package
when: ansible_os_family == 'Darwin'
homebrew_cask:
name: neovide-app
state: latest
- name: install winget package
when: ansible_os_family == 'Winodws'
win_winget:
name: Neovide.Neovide
state: latest
# TODO: install linux package

View File

@@ -10,26 +10,12 @@
state: absent
- set_fact:
old_package_dir: '/usr/local/lib/nvim/nvim-linux64'
old_package_dirs:
- /usr/local/lib/nvim/nvim-linux-x86_64
- /usr/local/stow/nvim/nvim-linux64
- name: check if old package directory exists
stat:
path: '{{old_package_dir}}'
register: old_package
- name: uninstall package from old directory
when: old_package.stat.exists
become: true
command:
cmd: 'stow --delete --target /usr/local .'
chdir: '{{old_package_dir}}'
- name: remove old package directory
when: old_package.stat.exists
become: true
file:
state: absent
path: '{{old_package_dir}}'
- include_tasks: sudo-rmdir.yaml
with_items: '{{old_package_dirs}}'
- name: install gnu stow for managing tar.gz package
become: true
@@ -68,7 +54,7 @@
install_required:
'{{installed_version is not defined or
installed_version != latest.json.tag_name}}'
asset_query: '[?contains(name, `nvim-linux64.tar.gz`)]'
asset_query: '[?contains(name, `nvim-linux-x86_64.tar.gz`)]'
package_dir: '/usr/local/stow/nvim'
- set_fact:
uninstall_required: '{{nvim.stat.exists and install_required}}'
@@ -78,7 +64,7 @@
- name: remove nuisance mimeinfo.cache file
become: true
file:
path: /usr/local/stow/nvim/nvim-linux64/share/applications/mimeinfo.cache
path: /usr/local/stow/nvim/nvim-linux-x86_64/share/applications/mimeinfo.cache
state: absent
- name: uninstall old package from /usr/local
@@ -86,13 +72,13 @@
become: true
command:
cmd: 'stow --delete --target /usr/local .'
chdir: '{{package_dir}}/nvim-linux64'
chdir: '{{package_dir}}/nvim-linux-x86_64'
- name: remove old package
become: true
when: uninstall_required
file:
path: '{{package_dir}}/nvim-linux64'
path: '{{package_dir}}/nvim-linux-x86_64'
state: absent
- name: create package directory
@@ -128,6 +114,6 @@
become: true
command:
cmd: 'stow --no-folding --target /usr/local .'
chdir: '{{package_dir}}/nvim-linux64'
chdir: '{{package_dir}}/nvim-linux-x86_64'
- include_tasks: Unix.yaml

View File

@@ -4,7 +4,7 @@
- name: clone config repo
git:
repo: git@code.infektor.net:config/nvim.git
repo: git@git.infektor.net:config/nvim.git
dest: '{{vim_config_dir}}'
version: main

View File

@@ -1,52 +1,34 @@
---
- name: install winget packages
win_winget:
name:
- neovim.neovim
- equalsraf.neovim-qt
state: latest
- name: install chocolatey packages
- name: remove chocolatey package
win_chocolatey:
name: neovim
state: latest
state: absent
- set_fact:
vim_config_dir: '{{ansible_env.LOCALAPPDATA}}\nvim'
- name: clone config repo
win_git:
repo: git@code.infektor.net:config/nvim.git
repo: git@git.infektor.net:config/nvim.git
dest: '{{vim_config_dir}}'
branch: main
# - TODO: neovim install pip packages
# win_pip:
# name: '{{neovim_pip_packages}}'
# state: latest
- name: create nvim start menu shortcut
win_shortcut:
src: '{{ansible_env.ChocolateyToolsLocation}}/neovim/nvim-win64/bin/nvim-qt.exe'
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
changed_when: false
- when: config_repo_tasks.stat.exists
include_tasks: vim_config_tasks.yaml
- name: remove fetched tasks
file:
state: absent
path: vim_config_tasks.yaml
changed_when: false
delegate_to: localhost
# TODO: Create neovim-qt start menu shortcut
# Need a reliable way to get the path to nvim-qt which doesn't reply on
# where.exe or similar as it won't work on first install due to environment
# variable update. winget installs the equalsraf.neovim-qt package in
# {{ansible_env.ProgramFiles}}\neovim-qt {{neovim_qt_version}}\bin\nvim.qt.exe
# so if I can get the version out of winget that would be a start.
# - name: create nvim start menu shortcut
# win_shortcut:
# src: '{{neovim_qt_exe}}'
# dest: '{{ansible_env.ProgramData}}/Microsoft/Windows/Start Menu/Programs/nvim-qt.lnk'
# icon: '{{neovim_qt_exe}},0'
# directory: '{{ansible_env.USERPROFILE}}'

View File

@@ -0,0 +1,19 @@
---
- name: check if {{item}} exists
stat:
path: '{{item}}'
register: old_package
- name: uninstall package from {{item}}
when: old_package.stat.exists
become: true
command:
cmd: 'stow --delete --target /usr/local .'
chdir: '{{item}}'
- name: remove {{item}}
when: old_package.stat.exists
become: true
file:
state: absent
path: '{{item}}'

View File

@@ -1,7 +1,3 @@
---
neovim_pip_packages:
- cmake-language-server
- cmakelint
- compdb
- vim-vint
- yamllint

View File

@@ -26,4 +26,4 @@
state: link
src: '~/.local/src/node/node-{{latest.json[0].version}}-linux-x64/bin/{{item}}'
dest: '~/.local/bin/{{item}}'
with_items: [corepack, node, npm, npx]
with_items: [node, npm, npx]

View File

@@ -0,0 +1,40 @@
---
- name: get latest github release
uri:
url: https://api.github.com/repos/Syllo/nvtop/releases/latest
headers: '{{github_auth_headers}}'
register: latest
- set_fact:
asset_query: '[?contains(name, `x86_64.AppImage`)] | [0]'
assets: '{{latest.json.assets}}'
latest_version: '{{latest.json.tag_name}}'
nvtop_exe: '/usr/local/bin/nvtop'
- name: check if already installed
stat:
path: '{{nvtop_exe}}'
register: nvtop_stat
- name: get installed version
when: nvtop_stat.stat.exists == True
command: '{{nvtop_exe}} --version'
register: nvtop_version_output
changed_when: false
- when: nvtop_stat.stat.exists == True
set_fact:
installed_version:
'{{nvtop_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
become: true
get_url:
url: '{{asset.browser_download_url}}'
dest: '{{nvtop_exe}}'
mode: +x
environment: '{{proxy_environment}}'

View File

@@ -0,0 +1,10 @@
---
- name: install dnf package
when: ansible_os_family == 'RedHat'
become: true
dnf:
state: latest
name: nvtop
- when: ansible_os_family != 'RedHat'
include_tasks: install-appimage.yaml

View File

@@ -5,7 +5,7 @@
- name: clone config repos
win_git:
repo: https://code.infektor.net/config/WindowsPowerShell.git
repo: git@git.infektor.net:config/WindowsPowerShell.git
dest: '{{powershell_config_dir}}'
branch: main
@@ -38,3 +38,14 @@
name: posh-git
state: latest
accept_license: true
- name: install pwsh for powershell lsp
community.windows.win_scoop:
name: pwsh
state: present
- name: run install script
win_command:
cmd: 'powershell.exe {{powershell_config_dir}}/install.ps1'
register: powershell_install
changed_when: "'changed' in powershell_install.stdout"

View File

@@ -6,6 +6,7 @@ python_pip_packages:
- ipython
- isort
- jmespath
- psutil
- pylint
- python-gist
- yapf

View File

@@ -2,7 +2,7 @@
- assert:
that: ansible_os_family == 'Darwin'
- name: install app store package
mas:
id: 441258766
- name: install homebrew package
homebrew_cask:
name: rectangle
state: latest

View File

@@ -19,8 +19,14 @@
name: ripgrep
state: latest
- name: install Chocolatey package
- name: remove chocolatey package
when: ansible_os_family == 'Windows'
win_chocolatey:
name: ripgrep
state: latest
state: absent
- name: install scoop package
when: ansible_os_family == 'Windows'
community.windows.win_scoop:
name: ripgrep
state: present

View File

@@ -0,0 +1,25 @@
---
- name: detect if scoop is installed
win_command: where.exe scoop
changed_when: false
failed_when: false
register: scoop_result
- assert:
that: scoop_result.rc == 0
fail_msg: Scoop is not installed
- name: add extras bucket
community.windows.win_scoop_bucket:
name: extras
state: present
- name: install completions
community.windows.win_scoop:
name: scoop-completion
state: present
- win_owner:
path: '{{ansible_env.LOCALAPPDATA}}/Scoop/buckets/extras'
user: '{{ansible_env.USERNAME}}'
recurse: true

View File

@@ -27,7 +27,7 @@
- name: fix systemd unit
become: true
copy:
path: /usr/lib/systemd/user/sunshine.service
dest: /usr/lib/systemd/user/sunshine.service
content: |
[Unit]
Description=Sunshine is a self-hosted game stream host for Moonlight.

View File

@@ -1,14 +1,34 @@
---
- name: install gawk package
homebrew:
name: gawk
state: latest
- name: install iSMC package
tuck:
name: dkorunic/iSMC
state: latest
- name: get list of running launchd services
command: launchctl list
register: launchd_running_services
changed_when: false
- set_fact:
system_info_plist_dir: '{{ansible_env.HOME}}/Library/LaunchAgents'
- name: create plist directory
file:
state: directory
path: '{{system_info_plist_dir}}'
- name: determine if system-info is currently running
set_fact:
system_info_debug: true
system_info_plist_path: '{{ansible_env.HOME}}/Library/LaunchAgents/system-info.plist'
system_info_running: "{{'system-info' in launchd_running_services.stdout}}"
system_info_plist_path:
'{{system_info_plist_dir}}/system-info.plist'
system_info_running:
"{{'system-info' in launchd_running_services.stdout}}"
- name: install system-info launchd plist
template:

View File

@@ -3,7 +3,7 @@
- name: clone config repo
git:
repo: git@code.infektor.net:config/tmux.git
repo: git@git.infektor.net:config/tmux.git
dest: ~/.config/tmux
version: main

View File

@@ -0,0 +1,76 @@
---
- name: get latest github release
uri:
url: https://api.github.com/repos/typst/typst/releases/latest
headers: '{{github_auth_headers}}'
register: latest
- set_fact:
asset_name: >-
{{
{
'amd64': 'typst-x86_64-unknown-linux-musl',
'x86_64': 'typst-x86_64-unknown-linux-musl',
'arm64': 'typst-aarch64-unknown-linux-musl',
}[ansible_architecture]
}}
- set_fact:
asset_query: '[?contains(name, `{{asset_name}}.tar.xz`)] | [0]'
assets: '{{latest.json.assets}}'
asset_archive: '{{asset_name}}.tar.xz'
latest_version: '{{latest.json.tag_name}}'
exe: '{{ansible_env.HOME}}/.local/bin/typst'
- name: check if already installed
stat:
path: '{{exe}}'
register: stat_exe
- name: get installed version
when: stat_exe.stat.exists == True
command: '{{exe}} --version'
register: version_output
changed_when: false
- when: stat_exe.stat.exists == True
set_fact:
installed_version:
'v{{version_output.stdout.strip() | regex_replace("^.*(\d+\.\d+\.\d+).*$", "\1")}}'
- set_fact:
asset: '{{assets | to_json | from_json | json_query(asset_query)}}'
- name: download archive
when: installed_version is not defined or installed_version != latest_version
get_url:
url: '{{asset.browser_download_url}}'
dest: '/tmp/{{asset_archive}}'
environment: '{{proxy_environment}}'
- name: extract archive
when: installed_version is not defined or installed_version != latest_version
unarchive:
src: '/tmp/{{asset_archive}}'
dest: '/tmp'
- name: remove archive
when: installed_version is not defined or installed_version != latest_version
file:
state: absent
path: '/tmp/{{asset_archive}}'
- name: copy executable
when: installed_version is not defined or installed_version != latest_version
copy:
src: '/tmp/{{asset_name}}/typst'
dest: '{{exe}}'
mode: +x
- name: remove extraced archive
when: installed_version is not defined or installed_version != latest_version
file:
state: absent
path: '/tmp/{{asset_archive}}'
# TODO: install zsh completions

View File

@@ -0,0 +1,15 @@
---
- name: install homebrew package
when: ansible_os_family == 'Darwin'
homebrew:
state: latest
name: typst
- name: install scoop package
when: ansible_os_family == 'Windows'
community.windows.win_scoop:
state: present
name: typst
- when: ansible_os_family != 'Darwin' and ansible_os_family != 'Windows'
include_tasks: Linux.yaml

View File

@@ -9,6 +9,25 @@
force: true
environment: '{{proxy_environment}}'
- name: slurp /etc/os-release
when: ansible_distribution != 'Debian'
slurp:
src: /etc/os-release
register: os_release_slurp
- when: ansible_distribution != 'Debian'
set_fact:
os_release: "{{ os_release_slurp.content |
b64decode | trim() | replace('=', ': ') | from_yaml }}"
- set_fact:
codename: '{{ansible_distribution_release}}'
- when: ansible_distribution != 'Debian' and 'UBUNTU_CODENAME' in os_release
set_fact:
codename: '{{os_release.UBUNTU_CODENAME}}'
- debug: var=codename
- name: add apt sources list
when: ansible_distribution == 'Debian'
become: true
@@ -16,7 +35,7 @@
content: >-
deb [signed-by={{ulauncher_keyring_path}}]
http://ppa.launchpad.net/agornostal/ulauncher/ubuntu
{{ansible_distribution_release}} main"
{{codename}} main"
dest: '{{ulauncher_apt_sources_list_path}}'
- name: add ppa repository
@@ -24,9 +43,12 @@
become: true
apt_repository:
repo: ppa:agornostal/ulauncher
codename: '{{codename}}'
- name: install apt package
become: true
apt:
name: ulauncher
state: latest
- include_tasks: linux-autostart.yaml

View File

@@ -4,3 +4,5 @@
dnf:
name: ulauncher
state: latest
- include_tasks: linux-autostart.yaml

View File

@@ -0,0 +1,15 @@
---
- name: create autostart desktop file
copy:
dest: '{{ansible_env.HOME}}/.config/autostart/ulauncher.desktop'
content: |
[Desktop Entry]
Name=Ulauncher
Comment=Application launcher for Linux
GenericName=Launcher
Categories=GNOME;GTK;Utility;
TryExec=/usr/bin/ulauncher
Exec=env GDK_BACKEND=x11 /usr/bin/ulauncher --hide-window
Icon=ulauncher
Terminal=false
Type=Application

View File

@@ -0,0 +1,10 @@
---
- name: install chocolatey package
win_chocolatey:
name: wezterm
state: latest
- name: clone config repo
win_git:
repo: git@git.infektor.net:config/wezterm.git
dest: '{{ansible_env.USERPROFILE}}/.config/wezterm'

View File

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

View File

@@ -4,5 +4,5 @@
- name: install homebrew cask
homebrew_cask:
name: microsoft-remote-desktop
name: windows-app
state: latest

View File

@@ -4,6 +4,7 @@
src: '{{windows_terminal_settings_json}}'
register: slurped_settings
# TODO: Handle comments in settings.json
- name: decode settings into fact
set_fact:
settings: '{{slurped_settings.content | b64decode | from_json}}'

View File

@@ -109,7 +109,7 @@
- name: clone config repo
git:
repo: git@code.infektor.net:config/xremap.git
repo: git@git.infektor.net:config/xremap.git
dest: '{{config_dir}}'
version: main
notify: restart xremap

View File

@@ -1,5 +1,10 @@
---
- name: install chocolatey package
- name: remove chocolatey package
win_chocolatey:
name: yq
state: latest
state: absent
- name: install scoop package
community.windows.win_scoop:
name: yq
state: present

View File

@@ -3,7 +3,7 @@
- name: clone config repo
git:
repo: git@code.infektor.net:config/zsh.git
repo: git@git.infektor.net:config/zsh.git
dest: ~/.config/zsh
version: main