Compare commits

..

81 Commits

Author SHA1 Message Date
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
8e3375b160 Add fedora support to sunshine role 2024-06-18 23:06:40 +01:00
32bef2d7f3 Add subshine role, not enabled by default 2024-06-15 13:36:00 +01:00
9fee00b0d8 Also enable xremap for X11 sessions 2024-06-15 12:13:24 +01:00
675a4eab18 Fixup neovim install on Debian based distros 2024-05-25 18:38:19 +01:00
0f0cc67e2c Don't stow kitty's lib directory 2024-05-25 18:26:08 +01:00
1c18b938f1 Also symlink other fzf stuff 2024-05-03 10:48:41 +01:00
8a5d7f48d6 Fix python role for new installs 2024-04-29 21:53:50 +01:00
7de099449d Cleanup neovim role 2024-04-29 21:35:40 +01:00
3e6f3bf7ab Update config repos to use main branch explicitly 2024-04-29 19:11:01 +01:00
267a9b7f3d Uninstall Cmder as its no longer used 2024-04-28 21:02:38 +01:00
94538f3887 Use new flatpak module state:latest support 2024-04-25 00:14:52 +01:00
75012793a8 Fix typo in glab role 2024-04-23 20:41:54 +01:00
dcb0f8c08c Fix kitty role, lacking become 2024-04-22 10:06:37 +01:00
6132cc58a6 Fix glab zsh completion install on Debian 2024-04-20 12:59:38 +01:00
056ae6e169 Update kitty to install from GitHub on Debian
Older version of kitty have terrible font rendering on Linux, e.g. the
one shipped with Ubuntu 22.04, so instead install the latest version
from the provided GitHub packages.
2024-04-19 21:51:58 +01:00
e330c3d072 Fix use of stow to not fold directories 2024-04-19 20:50:23 +01:00
5309683d94 Add support for proxy networks & cleanup playbook vars 2024-04-19 13:17:53 +01:00
a1296840f6 Fix python role, actuall remove old pip.conf 2024-04-15 11:29:58 +01:00
5c78bd1da3 Add system-info macOS user service 2024-04-14 15:55:41 +01:00
7379986378 Run tmux install.sh instead of tasks.yaml 2024-04-13 16:30:30 +01:00
d5fc2c3c13 Move zsh install login into script
Enable installing zsh config repo standalone, i.e. without Ansible,
invoke the `install.zsh` script instead.
2024-04-13 16:12:24 +01:00
dc6b7776ff Update config repo branches for tmux & zsh 2024-04-13 14:36:22 +01:00
3fa17e5517 Fix ulauncher role on Fedora 2024-04-11 23:56:54 +01:00
ace72f755a Add ulauncher role 2024-04-11 21:35:28 +01:00
c4c03aabf4 Make guake package become root 2024-04-09 23:18:43 +01:00
e82bff66ce Don't install pynvim globally on Debian
For PEP 668 reasons.
2024-04-09 19:41:31 +01:00
947a6f1b87 Remove python config repo & use templates instead 2024-04-09 19:27:49 +01:00
9bf8c46bb9 Create pip.conf from a template, handle proxy network 2024-04-09 19:09:40 +01:00
91 changed files with 1182 additions and 570 deletions

1
.gitignore vendored
View File

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

View File

@ -1,154 +0,0 @@
#!/usr/bin/python
# Copyright: (c) 2018, Terry Jones <terry.jones@example.org>
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import (absolute_import, division, print_function)
from typing import Dict, List
__metaclass__ = type
DOCUMENTATION = r'''
---
module: my_test
short_description: This is my test module
# If this is part of a collection, you need to use semantic versioning,
# i.e. the version is of the form "2.5.0" and not "2.4".
version_added: "1.0.0"
description: This is my longer description explaining my test module.
options:
name:
description: This is the message to send to the test module.
required: true
type: str
new:
description:
- Control to demo if the result of this module is changed or not.
- Parameter description can be a list as well.
required: false
type: bool
# Specify this value according to your collection
# in format of namespace.collection.doc_fragment_name
# extends_documentation_fragment:
# - my_namespace.my_collection.my_doc_fragment_name
author:
- Your Name (@yourGitHubHandle)
'''
EXAMPLES = r'''
# Pass in a message
- name: Test with a message
my_namespace.my_collection.my_test:
name: hello world
# pass in a message and have changed true
- name: Test with a message and changed output
my_namespace.my_collection.my_test:
name: hello world
new: true
# fail the module
- name: Test failure of the module
my_namespace.my_collection.my_test:
name: fail me
'''
RETURN = r'''
# These are examples of possible return values, and in general should use other names for return values.
original_message:
description: The original name param that was passed in.
type: str
returned: always
sample: 'hello world'
message:
description: The output message that the test module generates.
type: str
returned: always
sample: 'goodbye'
'''
from ansible.module_utils.basic import AnsibleModule, subprocess
def run_module():
# define available arguments/parameters a user can pass to the module
module_args = dict(
keybindings=dict(type='list', require=True),
)
# seed the result dict in the object
# we primarily care about changed and state
# changed is if this module effectively modified the target
# state will include any data that you want your module to pass back
# for consumption, for example, in a subsequent task
result = dict(
changed=False,
original_message='',
message=''
)
# the AnsibleModule object will be our abstraction working with Ansible
# this includes instantiation, a couple of common attr would be the
# args/params passed to the execution, as well as if the module
# supports check mode
module = AnsibleModule(
argument_spec=module_args,
supports_check_mode=True
)
# if the user is working with this module in only check mode we do not
# want to make any changes to the environment, just return the current
# state with no modifications
if module.check_mode:
module.exit_json(**result)
# manipulate or modify the state as needed (this is going to be the
# part where your module will do what it needs to do)
keys = []
for index, keybinding in enumerate(module.params["keybindings"]):
key = f"org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom{index}"
for value in ["binding", "command", "name"]:
subprocess.check_call(
["dconf", "write", f"/{key}{value}", f"'{keybinding[value]}'"]
)
keys.append(key)
subprocess.check_call(
[
"dconf",
"write",
"/org/gnome/settings-daemon/plugins/media-keys",
f"['{"', '".join(keys)}']",
]
)
# result['original_message'] = str(keybinding_entries)
# result["message"] = str(custom_keybindings)
# use whatever logic you need to determine whether or not this module
# made any modifications to your target
# if module.params['new']:
result['changed'] = True
# during the execution of the module, if there is an exception or a
# conditional state that effectively causes a failure, run
# AnsibleModule.fail_json() to pass in the message and the result
# if module.params['name'] == 'fail me':
# module.fail_json(msg='You requested this to fail', **result)
# in the event of a successful module execution, you will want to
# simple AnsibleModule.exit_json(), passing the key/value results
module.exit_json(**result)
def main():
run_module()
if __name__ == '__main__':
main()

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()

View File

@ -108,6 +108,16 @@ function Get-GitCurrentSha {
return $result.stdout.Trim() 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 { function Invoke-GitClone {
[CmdletBinding()] [CmdletBinding()]
Param ( 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 ================================= # ================================ Start logic =================================
if (!$dest) { if (!$dest) {
@ -207,6 +230,10 @@ if (($dest -and ![System.IO.File]::Exists($gitconfig))) {
if (Test-GitLocalChanges $dest) { if (Test-GitLocalChanges $dest) {
$module.FailJson('Local modifications exist in repository.') $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-GitFetch $dest $remote $version
Invoke-GitCheckout $dest $remote $version Invoke-GitCheckout $dest $remote $version
Invoke-GitPull $dest $remote $version Invoke-GitPull $dest $remote $version

View File

@ -22,27 +22,6 @@ seealso:
- module: ansible.builtin.git - 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''' EXAMPLES = r'''
# Test connectivity to a windows host # Test connectivity to a windows host
# ansible winserver -m ansible.windows.win_ping # 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

@ -1,4 +1,6 @@
--- ---
- hosts: localhost - hosts: localhost
vars_files:
- vars/environment.yaml
roles: roles:
- 1password - 1password

View File

@ -2,21 +2,14 @@
- import_playbook: LinuxCLI.yaml - import_playbook: LinuxCLI.yaml
- import_playbook: UnixGUI.yaml - import_playbook: UnixGUI.yaml
- hosts: localhost - hosts: localhost
vars: vars_files:
github_auth_headers: >- - vars/environment.yaml
{{ { 'Authorization': 'Bearer ' + lookup('env', 'GITHUB_TOKEN') }
if lookup('env', 'GITHUB_TOKEN') else {} }}
roles: roles:
- role: firefox - role: firefox
- role: kitty - role: kitty
- role: guake
- role: cider - role: cider
- role: ulauncher
- role: gnome-shell - role: gnome-shell
when: "'GNOME' in ansible_env.XDG_CURRENT_DESKTOP" when: "'GNOME' in ansible_env.XDG_CURRENT_DESKTOP"
- role: xremap - role: xremap
when: > when: "'GNOME' in ansible_env.XDG_CURRENT_DESKTOP"
'GNOME' in ansible_env.XDG_CURRENT_DESKTOP and
ansible_env.XDG_SESSION_TYPE == 'wayland' and (
ansible_os_family == "RedHat" or
ansible_os_family == "Debian"
)

View File

@ -1,15 +1,16 @@
--- ---
- hosts: localhost - hosts: localhost
vars: vars_files:
github_auth_headers: >- - vars/environment.yaml
{{ { 'Authorization': 'Bearer ' + lookup('env', 'GITHUB_TOKEN') }
if lookup('env', 'GITHUB_TOKEN') else {} }}
roles: roles:
- role: rpmfusion - role: rpmfusion
when: ansible_os_family == 'RedHat' and ansible_distribution == 'Fedora' when: ansible_os_family == 'RedHat' and ansible_distribution == 'Fedora'
- import_playbook: UnixCLI.yaml - import_playbook: UnixCLI.yaml
- hosts: localhost - hosts: localhost
vars_files:
- vars/environment.yaml
roles: roles:
- role: gdb - role: gdb
- role: podman - role: podman
- role: system-info - role: system-info
when: disable_systemd is not defined

View File

@ -1,9 +1,7 @@
--- ---
- hosts: localhost - hosts: localhost
vars: vars_files:
github_auth_headers: >- - vars/environment.yaml
{{ { 'Authorization': 'Bearer ' + lookup('env', 'GITHUB_TOKEN') }
if lookup('env', 'GITHUB_TOKEN') else {} }}
roles: roles:
- role: sudo - role: sudo
when: ansible_user_id != "root" when: ansible_user_id != "root"

View File

@ -1,9 +1,7 @@
--- ---
- hosts: localhost - hosts: localhost
vars: vars_files:
github_auth_headers: >- - vars/environment.yaml
{{ { 'Authorization': 'Bearer ' + lookup('env', 'GITHUB_TOKEN') }
if lookup('env', 'GITHUB_TOKEN') else {} }}
roles: roles:
- role: flatpak - role: flatpak
when: ansible_os_family != "Darwin" when: ansible_os_family != "Darwin"

View File

@ -1,9 +1,7 @@
--- ---
- import_playbook: LinuxCLI.yaml - import_playbook: LinuxCLI.yaml
- hosts: localhost - hosts: localhost
vars: vars_files:
github_auth_headers: >- - vars/environment.yaml
{{ { 'Authorization': 'Bearer ' + lookup('env', 'GITHUB_TOKEN') }
if lookup('env', 'GITHUB_TOKEN') else {} }}
roles: roles:
- role: wsl - role: wsl

View File

@ -1,37 +1,16 @@
--- ---
- import_playbook: WindowsCLI.yaml
- hosts: windows - hosts: windows
vars: vars_files:
github_auth_headers: >- - vars/environment.yaml
{{ { 'Authorization': 'Bearer ' + lookup('env', 'GITHUB_TOKEN') }
if lookup('env', 'GITHUB_TOKEN') else {} }}
roles: 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: 1password
- role: autohotkey - role: autohotkey
- role: cider - role: apple-music
- role: ferdium - role: ferdium
- role: firefox - role: firefox
- role: fonts - role: fonts
- role: obsidian - role: obsidian
- role: powertoys - role: powertoys
- role: windows-terminal - role: windows-terminal
- role: wezterm

26
playbooks/WindowsCLI.yaml Normal file
View File

@ -0,0 +1,26 @@
---
- 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: yq
- role: llvm
- role: nodejs

View File

@ -1,22 +1,23 @@
--- ---
- import_playbook: UnixCLI.yaml - import_playbook: UnixCLI.yaml
- hosts: localhost - hosts: localhost
vars_files:
- vars/environment.yaml
roles: roles:
- role: system-info - role: system-info
- import_playbook: UnixGUI.yaml - import_playbook: UnixGUI.yaml
- hosts: localhost - hosts: localhost
vars: vars_files:
github_auth_headers: >- - vars/environment.yaml
{{ { 'Authorization': 'Bearer ' + lookup('env', 'GITHUB_TOKEN') }
if lookup('env', 'GITHUB_TOKEN') else {} }}
roles: roles:
- role: mas - role: mas
- role: hiddenbar - role: hiddenbar
- role: iterm - role: iterm
- role: kitty # TODO: Reenable this once kitty OSC 52 bug is fixed
# - role: kitty
- role: magnet - role: magnet
- role: microsoft-remote-desktop - role: windows-app
- role: viscosity - role: viscosity
- role: macos - role: macos

View File

@ -0,0 +1,15 @@
---
# GitHub may rate limit unauthenticated API requests, this is more likely when
# behind a network proxy. Set the GITHUB_TOKEN environment variable to
# authenticate any GitHub API requests executed while playing roles.
github_auth_headers: >-
{{ { 'Authorization': 'Bearer ' + lookup('env', 'GITHUB_TOKEN') }
if lookup('env', 'GITHUB_TOKEN') else {} }}
# When working behind a network proxy, set the http_proxy and https_proxy
# environment variables. These will be passed through to uses of the `get_url`
# module when playing roles.
proxy_environment: >-
{{ { 'http_proxy': lookup('env', 'http_proxy'),
'https_proxy': lookup('env', 'https_proxy') }
if lookup('env', 'http_proxy') and lookup('env', 'https_proxy') else {} }}

View File

@ -16,6 +16,7 @@
get_url: get_url:
url: https://downloads.1password.com/linux/keys/1password.asc url: https://downloads.1password.com/linux/keys/1password.asc
dest: '{{keyring}}' dest: '{{keyring}}'
environment: '{{proxy_environment}}'
- name: set compatible architecture - name: set compatible architecture
when: ansible_machine == 'x86_64' when: ansible_machine == 'x86_64'
@ -61,4 +62,5 @@
src: /mnt/c/Users/Benie/AppData/Local/1Password/cli/op.exe src: /mnt/c/Users/Benie/AppData/Local/1Password/cli/op.exe
dest: ~/.local/bin/op dest: ~/.local/bin/op
- include_tasks: linux-autostart.yaml
- include_tasks: zsh-completion.yaml - include_tasks: zsh-completion.yaml

View File

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

View File

@ -16,6 +16,7 @@
win_get_url: win_get_url:
url: https://downloads.1password.com/win/1PasswordSetup-latest.exe url: https://downloads.1password.com/win/1PasswordSetup-latest.exe
dest: '{{installer_exe}}' dest: '{{installer_exe}}'
environment: '{{proxy_environment}}'
- name: run installer - name: run installer
when: not app_stat.stat.exists when: not app_stat.stat.exists
@ -68,6 +69,7 @@
win_get_url: win_get_url:
url: '{{latest.downloads.Windows.amd64}}' url: '{{latest.downloads.Windows.amd64}}'
dest: '{{cli_zip}}' dest: '{{cli_zip}}'
environment: '{{proxy_environment}}'
- name: unzip op zip archive - name: unzip op zip archive
when: cli_installed_version is not defined or cli_installed_version != latest.version when: cli_installed_version is not defined or cli_installed_version != latest.version

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: win_chocolatey:
name: ag 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,9 +6,9 @@
- name: clone config repo - name: clone config repo
win_git: win_git:
repo: git@code.infektor.net:config/AutoHotKey.git repo: git@git.infektor.net:config/AutoHotKey.git
dest: '{{autohotkey_repo_dir}}' dest: '{{autohotkey_repo_dir}}'
branch: master branch: main
- name: create scheduled task - name: create scheduled task
win_scheduled_task: win_scheduled_task:
@ -31,3 +31,25 @@
run_level: highest run_level: highest
start_when_available: true start_when_available: true
wake_to_run: false 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: win_chocolatey:
name: Bat name: Bat
state: latest state: absent
- name: install scoop package
community.windows.win_scoop:
name: bat
state: present

View File

@ -51,6 +51,7 @@
get_url: get_url:
url: '{{asset.browser_download_url}}' url: '{{asset.browser_download_url}}'
dest: '{{bat_deb}}' dest: '{{bat_deb}}'
environment: '{{proxy_environment}}'
- name: install .deb file - name: install .deb file
when: installed_version is not defined or installed_version != latest_version when: installed_version is not defined or installed_version != latest_version

View File

@ -13,3 +13,4 @@
become: true become: true
flatpak: flatpak:
name: sh.cider.Cider name: sh.cider.Cider
state: latest

View File

@ -1,5 +1,10 @@
--- ---
- name: install chocolatey package - name: remove chocolatey package
win_chocolatey: win_chocolatey:
name: curl 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 name: fd
state: latest state: latest
- name: install Chocolatey package - name: remove chocolatey package
when: ansible_os_family == 'Windows' when: ansible_os_family == 'Windows'
win_chocolatey: win_chocolatey:
name: fd 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

@ -14,3 +14,4 @@
become: true become: true
flatpak: flatpak:
name: org.ferdium.Ferdium name: org.ferdium.Ferdium
state: latest

View File

@ -17,6 +17,7 @@
get_url: get_url:
url: https://packages.mozilla.org/apt/repo-signing-key.gpg url: https://packages.mozilla.org/apt/repo-signing-key.gpg
dest: /etc/apt/keyrings/packages.mozilla.org.asc dest: /etc/apt/keyrings/packages.mozilla.org.asc
environment: '{{proxy_environment}}'
- name: add mozilla apt repo - name: add mozilla apt repo
become: true become: true

View File

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

View File

@ -37,6 +37,7 @@
get_url: get_url:
url: '{{asset.browser_download_url}}' url: '{{asset.browser_download_url}}'
dest: '{{ansible_env.HOME}}/.local/share/fonts/tmp.zip' dest: '{{ansible_env.HOME}}/.local/share/fonts/tmp.zip'
environment: '{{proxy_environment}}'
- name: install Caskaydia Cove Nerd Font - name: install Caskaydia Cove Nerd Font
when: needs_installed when: needs_installed

View File

@ -9,5 +9,16 @@
- name: create symbolic links - name: create symbolic links
file: file:
state: link state: link
src: ~/.local/src/fzf/bin/fzf src: '{{ item.src }}'
dest: ~/.local/bin/fzf dest: '{{ item.dest }}'
with_items:
- src: ~/.local/src/fzf/bin/fzf
dest: ~/.local/bin/fzf
- src: ~/.local/src/fzf/bin/fzf-tmux
dest: ~/.local/bin/fzf-tmux
- src: ~/.local/src/fzf/bin/fzf-preview.sh
dest: ~/.local/bin/fzf-preview.sh
- src: ~/.local/src/fzf/man/man1/fzf.1
dest: ~/.local/share/man/man1/fzf.1
- src: ~/.local/src/fzf/man/man1/fzf-tmux.1
dest: ~/.local/share/man/man1/fzf-tmux.1

View File

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

View File

@ -15,6 +15,7 @@
url: https://cli.github.com/packages/githubcli-archive-keyring.gpg url: https://cli.github.com/packages/githubcli-archive-keyring.gpg
dest: /usr/share/keyrings/githubcli-archive-keyring.gpg dest: /usr/share/keyrings/githubcli-archive-keyring.gpg
mode: 0644 mode: 0644
environment: '{{proxy_environment}}'
- name: add apt repository list - name: add apt repository list
become: true become: true

View File

@ -4,6 +4,7 @@
get_url: get_url:
url: https://cli.github.com/packages/rpm/gh-cli.repo url: https://cli.github.com/packages/rpm/gh-cli.repo
dest: /etc/yum.repos.d/gh-cli.repo dest: /etc/yum.repos.d/gh-cli.repo
environment: '{{proxy_environment}}'
- name: install dnf package - name: install dnf package
become: true become: true

View File

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

View File

@ -19,6 +19,7 @@
win_get_url: win_get_url:
url: '{{git_asset.browser_download_url}}' url: '{{git_asset.browser_download_url}}'
dest: '{{git_installer_path}}' dest: '{{git_installer_path}}'
environment: '{{proxy_environment}}'
- name: run installer command - name: run installer command
win_command: win_command:

View File

@ -36,7 +36,7 @@
win_git: win_git:
repo: '{{item.repo}}' repo: '{{item.repo}}'
dest: '{{ansible_env.USERPROFILE}}/.config/{{item.name}}' dest: '{{ansible_env.USERPROFILE}}/.config/{{item.name}}'
version: master version: main
with_items: '{{git_config_repos}}' with_items: '{{git_config_repos}}'
# - TODO: install pip packages # - TODO: install pip packages

View File

@ -3,7 +3,7 @@
git: git:
repo: '{{item.repo}}' repo: '{{item.repo}}'
dest: '~/.config/{{item.name}}' dest: '~/.config/{{item.name}}'
version: master version: main
with_items: '{{git_config_repos}}' with_items: '{{git_config_repos}}'
- name: install homebrew packages - name: install homebrew packages

View File

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

View File

@ -40,10 +40,11 @@
url: '{{asset.browser_download_url}}' url: '{{asset.browser_download_url}}'
dest: '{{tea_package_exe}}' dest: '{{tea_package_exe}}'
mode: '0755' mode: '0755'
environment: '{{proxy_environment}}'
- name: install package - name: install package
when: install_required when: install_required
become: true become: true
command: command:
cmd: 'stow --target /usr/local .' cmd: 'stow --no-folding --target /usr/local .'
chdir: '{{tea_package_dir}}' chdir: '{{tea_package_dir}}'

View File

@ -6,7 +6,7 @@
path: '{{glab}}' path: '{{glab}}'
register: stat_glab register: stat_glab
- name: get instlal version - name: get install version
when: stat_glab.stat.exists when: stat_glab.stat.exists
command: '{{glab}} --version' command: '{{glab}} --version'
register: glab_version_output register: glab_version_output
@ -31,8 +31,9 @@
latest_version: '{{releases.json[0].tag_name}}' latest_version: '{{releases.json[0].tag_name}}'
query: > query: >
[?contains(name, `glab`)] | [?contains(name, `glab`)] |
[?contains(name, `Linux`)] | [?contains(name, `linux`)] |
[?contains(name, `{{ansible_machine}}.deb`)] | [0] [?contains(name, `{{
{'x86_64': 'amd64', 'arm64': 'arm64'}[ansible_machine]}}.deb`)] | [0]
- set_fact: - set_fact:
asset: '{{latest.assets.links|json_query(query)}}' asset: '{{latest.assets.links|json_query(query)}}'
@ -48,6 +49,7 @@
get_url: get_url:
url: '{{asset.url}}' url: '{{asset.url}}'
dest: '{{tempdir.path}}/glab.deb' dest: '{{tempdir.path}}/glab.deb'
environment: '{{proxy_environment}}'
- name: install .deb file - name: install .deb file
when: glab_version is not defined or glab_version != latest_version when: glab_version is not defined or glab_version != latest_version
@ -61,7 +63,13 @@
state: absent state: absent
path: '{{tempdir.path}}' path: '{{tempdir.path}}'
- name: get zsh completions source
command: glab completion -s zsh
register: glab_zsh_completions
changed_when: false
- name: install zsh completions - name: install zsh completions
when: glab_version is not defined or glab_version != latest_version become: true
command: copy:
glab completion -s zsh > ~/.local/share/zsh/site-functions/_glab content: '{{glab_zsh_completions.stdout}}'
dest: /usr/local/share/zsh/site-functions/_glab

View File

@ -1,5 +1,12 @@
--- ---
- name: install chocolatey package - name: remove chocolatey package
win_chocolatey: win_chocolatey:
name:
- glab
- glab.portable
state: absent
- name: install scoop package
community.windows.win_scoop:
name: glab 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,37 +2,70 @@
- assert: - assert:
that: "'GNOME' in ansible_env.XDG_CURRENT_DESKTOP" that: "'GNOME' in ansible_env.XDG_CURRENT_DESKTOP"
- name: install gnome-tweaks - name: install packages
become: true become: true
package: package:
name: gnome-tweaks name:
- gnome-tweaks
- gnome-themes-extra
state: latest 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 []'
# NOTE: Use this command to see default keybindings # NOTE: Use this command to see default keybindings
# gsettings list-recursively | grep -i -E 'media-keys|keybindings' # gsettings list-recursively | grep -i -E 'media-keys|keybindings'
# NOTE: Use this command to inspect the current state of the custom 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' # dconf dump / | sed -n '/\[org.gnome.settings-daemon.plugins.media-keys/,/^$/p'
- set_fact: - name: 1password quick access custom keybinding
custom_keybindings: dconf:
# TODO: 1Password Quick Access state: present
# [org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0] key: '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/{{item.key}}'
# binding='<Shift><Alt>space' value: '{{item.value}}'
# command='1password --quick-access' with_items:
# name='1Password Quick Access' - {key: 'binding', value: "'<Shift><Alt>space'"}
- binding: <Shift><Alt>space - {key: 'command', value: "'1password --quick-access'"}
command: 1password --quick-access - {key: 'name', value: "'1Password Quick Access'"}
name: 1Password Quick Access
# TODO: Guake toggle - this requires removing a default binding - name: ulauncher toggle custom keybinding
# [org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1] dconf:
# binding='<Super>space' state: present
# command='guake-toggle' key: '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/{{item.key}}'
# name='Guake Toggle' value: '{{item.value}}'
- binding: <Super>space with_items:
command: guake-toggle - {key: 'binding', value: "'<Alt>space'"}
name: Guake Toggle - {key: 'command', value: "'ulauncher-toggle'"}
- {key: 'name', value: "'Ulauncher Toggle'"}
# TODO: List of custom-keybindings - name: list of entries defining custom-keybindings
# [org/gnome/settings-daemon/plugins/media-keys] dconf:
# custom-keybindings=['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/'] 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

@ -1,8 +0,0 @@
---
- assert:
that: ansible_os_family != 'Darwin' and ansible_os_family != 'Windows'
- name: install package
package:
name: guake
state: latest

View File

@ -40,3 +40,4 @@
url: '{{asset.browser_download_url}}' url: '{{asset.browser_download_url}}'
dest: '{{jp_exe}}' dest: '{{jp_exe}}'
mode: +x mode: +x
environment: '{{proxy_environment}}'

View File

@ -50,3 +50,4 @@
url: '{{asset.browser_download_url}}' url: '{{asset.browser_download_url}}'
dest: '{{ansible_env.HOME}}/.local/bin/jp' dest: '{{ansible_env.HOME}}/.local/bin/jp'
mode: '0755' mode: '0755'
environment: '{{proxy_environment}}'

View File

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

View File

@ -1,6 +1,108 @@
--- ---
- name: install apt package - name: remove apt package
become: true become: true
apt: apt:
name: kitty name: kitty
state: latest state: absent
- name: get latest version
uri:
url: https://api.github.com/repos/kovidgoyal/kitty/releases/latest
headers: '{{github_auth_headers}}'
register: latest
- set_fact:
kitty_latest_version: '{{latest.json.tag_name[1:]}}'
kitty_exe: /usr/local/bin/kitty
kitty_package_dir: /usr/local/stow/kitty
- name: check if already installed
stat:
path: '{{kitty_exe}}'
register: kitty
- name: get installed version
when: kitty.stat.exists
command: '{{kitty_exe}} --version'
register: kitty_version
changed_when: false
- when: kitty.stat.exists
set_fact:
kitty_install_version:
'{{kitty_version.stdout | regex_replace("^.*(\d+\.\d+\.\d+).*$", "\1")}}'
- set_fact:
kitty_asset_query: >
[? contains(name,
`kitty-{{kitty_latest_version}}-{{ansible_architecture}}.txz`)] | [0]
- set_fact:
kitty_install_required: >
{{ kitty_install_version is not defined or
kitty_latest_version != kitty_install_version }}
kitty_asset: "{{ latest.json.assets | json_query(kitty_asset_query) }}"
- name: uninstall package
when: kitty_install_required and kitty.stat.exists
become: true
command:
cmd: 'stow --delete --target /usr/local .'
chdir: '{{kitty_package_dir}}'
- name: remove outdated package
when: kitty_install_required and kitty.stat.exists
become: true
file:
state: absent
path: '{{kitty_package_dir}}'
- set_fact:
kitty_package_archive: '{{kitty_package_dir}}/{{kitty_asset.name}}'
- name: create package directory
become: true
file:
state: directory
path: '{{kitty_package_dir}}'
- name: download package
when: kitty_install_required
become: true
get_url:
url: '{{kitty_asset.browser_download_url}}'
dest: '{{kitty_package_archive}}'
environment: '{{proxy_environment}}'
- name: decompress package
when: kitty_install_required
become: true
unarchive:
src: '{{kitty_package_archive}}'
dest: '{{kitty_package_dir}}'
owner: root
group: staff
- name: remove package archive
when: kitty_install_required
become: true
file:
state: absent
path: '{{kitty_package_archive}}'
# FIXME: This is bound to break something somewhere but on Ubuntu 22.04 this
# file breaks a bunch of other stuff when the kitty package in installed in
# /usr/local with stow so we delete it before stowing.
- name: remove conflicting library
when: kitty_install_required
become: true
file:
state: absent
path: '{{kitty_package_dir}}/lib/libglib-2.0.so.0'
- name: install package
when: kitty_install_required
become: true
command:
cmd: "stow --no-folding --target /usr/local --ignore='lib/.*$' ."
chdir: '{{kitty_package_dir}}'

View File

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

View File

@ -57,6 +57,7 @@
get_url: get_url:
url: https://apt.llvm.org/llvm-snapshot.gpg.key url: https://apt.llvm.org/llvm-snapshot.gpg.key
dest: '{{keyring}}' dest: '{{keyring}}'
environment: '{{proxy_environment}}'
- name: add upstream deb repository - name: add upstream deb repository
become: true become: true

View File

@ -9,6 +9,28 @@
name: neovim name: neovim
state: absent state: absent
- set_fact:
old_package_dir: '/usr/local/lib/nvim/nvim-linux-x86_64'
- 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}}'
- name: install gnu stow for managing tar.gz package - name: install gnu stow for managing tar.gz package
become: true become: true
apt: apt:
@ -17,7 +39,6 @@
state: latest state: latest
- name: install python provider pip package - name: install python provider pip package
become: true
pip: pip:
name: pynvim name: pynvim
state: latest state: latest
@ -47,25 +68,31 @@
install_required: install_required:
'{{installed_version is not defined or '{{installed_version is not defined or
installed_version != latest.json.tag_name}}' 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/lib/nvim' package_dir: '/usr/local/stow/nvim'
- set_fact: - set_fact:
uninstall_required: '{{nvim.stat.exists and install_required}}' uninstall_required: '{{nvim.stat.exists and install_required}}'
asset: '{{latest.json.assets | json_query(asset_query)}}' asset: '{{latest.json.assets | json_query(asset_query)}}'
package_path: '{{package_dir}}/{{latest.json.name}}' package_path: '{{package_dir}}/{{latest.json.name}}'
- name: remove nuisance mimeinfo.cache file
become: true
file:
path: /usr/local/stow/nvim/nvim-linux-x86_64/share/applications/mimeinfo.cache
state: absent
- name: uninstall old package from /usr/local - name: uninstall old package from /usr/local
when: uninstall_required when: uninstall_required
become: true become: true
command: command:
cmd: 'stow --delete --target /usr/local .' cmd: 'stow --delete --target /usr/local .'
chdir: '{{package_dir}}/nvim-linux64' chdir: '{{package_dir}}/nvim-linux-x86_64'
- name: remove old package - name: remove old package
become: true become: true
when: uninstall_required when: uninstall_required
file: file:
path: '{{package_dir}}/nvim-linux64' path: '{{package_dir}}/nvim-linux-x86_64'
state: absent state: absent
- name: create package directory - name: create package directory
@ -80,6 +107,7 @@
get_url: get_url:
url: '{{asset[0].browser_download_url}}' url: '{{asset[0].browser_download_url}}'
dest: '{{package_path}}' dest: '{{package_path}}'
environment: '{{proxy_environment}}'
- name: extract package archive - name: extract package archive
when: install_required when: install_required
@ -95,20 +123,11 @@
path: '{{package_path}}' path: '{{package_path}}'
state: absent state: absent
- name: move man to share/man
when: install_required
become: true
command:
argv:
- mv
- '{{package_dir}}/nvim-linux64/man'
- '{{package_dir}}/nvim-linux64/share'
- name: install package to /usr/local - name: install package to /usr/local
when: install_required when: install_required
become: true become: true
command: command:
cmd: 'stow --target /usr/local .' cmd: 'stow --no-folding --target /usr/local .'
chdir: '{{package_dir}}/nvim-linux64' chdir: '{{package_dir}}/nvim-linux-x86_64'
- include_tasks: Unix.yaml - include_tasks: Unix.yaml

View File

@ -1,36 +0,0 @@
---
- 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

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

View File

@ -1,43 +0,0 @@
---
- 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
- set_fact:
backslashes: '\\'
forwardslash: '/'
- set_fact:
managed_plugins: "{{managed_plugins | replace(backslashes, forwardslash)}}"
found_plugins: "{{found_plugins | replace(backslashes, forwardslash)}}"
- 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,59 +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: win_chocolatey:
name: neovim name: neovim
state: latest state: absent
- set_fact: - set_fact:
vim_config_dir: '{{ansible_env.LOCALAPPDATA}}\nvim' vim_config_dir: '{{ansible_env.LOCALAPPDATA}}\nvim'
- name: clone config repo - name: clone config repo
win_git: win_git:
repo: git@code.infektor.net:config/nvim.git repo: git@git.infektor.net:config/nvim.git
dest: '{{vim_config_dir}}' dest: '{{vim_config_dir}}'
branch: main branch: main
# - TODO: neovim install pip packages # TODO: Create neovim-qt start menu shortcut
# win_pip: # Need a reliable way to get the path to nvim-qt which doesn't reply on
# name: '{{neovim_pip_packages}}' # where.exe or similar as it won't work on first install due to environment
# state: latest # variable update. winget installs the equalsraf.neovim-qt package in
# {{ansible_env.ProgramFiles}}\neovim-qt {{neovim_qt_version}}\bin\nvim.qt.exe
- name: create nvim start menu shortcut # so if I can get the version out of winget that would be a start.
win_shortcut: # - name: create nvim start menu shortcut
src: '{{ansible_env.ChocolateyToolsLocation}}/neovim/nvim-win64/bin/nvim-qt.exe' # win_shortcut:
dest: '{{ansible_env.ProgramData}}/Microsoft/Windows/Start Menu/Programs/nvim-qt.lnk' # src: '{{neovim_qt_exe}}'
icon: '{{ansible_env.ChocolateyToolsLocation}}/neovim/nvim-win64/bin/nvim-qt.exe,0' # dest: '{{ansible_env.ProgramData}}/Microsoft/Windows/Start Menu/Programs/nvim-qt.lnk'
directory: '{{ansible_env.USERPROFILE}}' # icon: '{{neovim_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
- 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,7 +1,3 @@
--- ---
neovim_pip_packages: neovim_pip_packages:
- cmake-language-server
- cmakelint
- compdb - compdb
- vim-vint
- yamllint

View File

@ -13,6 +13,7 @@
get_url: get_url:
url: 'https://nodejs.org/dist/{{latest.json[0].version}}/node-{{latest.json[0].version}}-linux-x64.tar.gz' url: 'https://nodejs.org/dist/{{latest.json[0].version}}/node-{{latest.json[0].version}}-linux-x64.tar.gz'
dest: ~/.local/src/node/node.tar.gz dest: ~/.local/src/node/node.tar.gz
environment: '{{proxy_environment}}'
- name: extract downloaded package - name: extract downloaded package
unarchive: unarchive:

View File

@ -3,6 +3,7 @@
become: true become: true
flatpak: flatpak:
name: md.obsidian.Obsidian name: md.obsidian.Obsidian
state: latest
# Remove old appimage if it exists # Remove old appimage if it exists
- name: stat appimage symlink - name: stat appimage symlink

View File

@ -5,14 +5,14 @@
- name: clone config repos - name: clone config repos
win_git: win_git:
repo: https://code.infektor.net/config/WindowsPowerShell.git repo: git@git.infektor.net:config/WindowsPowerShell.git
dest: '{{powershell_config_dir}}' dest: '{{powershell_config_dir}}'
branch: master branch: main
- name: install chocolatey package - name: remove cmder chocolatey package
win_chocolatey: win_chocolatey:
name: Cmder name: Cmder
state: latest state: absent
- name: get NuGet package provider - name: get NuGet package provider
ansible.windows.win_powershell: ansible.windows.win_powershell:
@ -38,3 +38,14 @@
name: posh-git name: posh-git
state: latest state: latest
accept_license: true 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

@ -1,7 +1,13 @@
--- ---
- name: install config repo - name: stat old config repo
git: stat:
repo: git@code.infektor.net:config/python.git path: ~/.config/python/.git
register: config_python_git
- name: remove old config repo
when: config_python_git.stat.exists
file:
state: absent
dest: ~/.config/python dest: ~/.config/python
- name: create config directories - name: create config directories
@ -13,34 +19,45 @@
- ~/.config/ipython/profile_default - ~/.config/ipython/profile_default
- ~/.config/pip - ~/.config/pip
# Ensure that pip.conf exists before ever installing pip packages since - name: stat pip.conf
# Debian has enabled `EXTERNALLY-MANAGED` from PEP 668 which breaks `pip stat:
# install --user` unless configured otherwise. path: ~/.config/pip/pip.conf
- name: create symbolic links register: pip_conf
- name: remove pip.conf if its a symbolic link
when: pip_conf.stat.exists and pip_conf.stat.islnk
file: file:
state: link state: absent
src: '{{item.src}}' path: ~/.config/pip/pip.conf
dest: '{{item.dest}}'
with_items: # Ensure that pip.conf exists before ever installing pip packages since Debian
- src: ~/.config/python/flake8 # has enabled `EXTERNALLY-MANAGED` from PEP 668 which breaks `pip install
dest: ~/.config/flake8 # --user` unless configured otherwise.
- src: ~/.config/python/pylintrc - name: create user pip.conf from template
dest: ~/.pylintrc template:
- src: ~/.config/python/ipython_config.py src: pip.conf.j2
dest: ~/.config/ipython/profile_default/ipython_config.py dest: ~/.config/pip/pip.conf
- src: ~/.config/python/pip.conf
dest: ~/.config/pip/pip.conf # TODO: Also configure pip to disable `EXTERNALLY-MANAGED` globally?
- name: stat old ipython_config.py
stat:
path: ~/.config/ipython/profile_default/ipython_config.py
register: ipython_config_py
- name: remove ipython_conifg.py if its a symbolic link
when: ipython_config_py.stat.exists and ipython_config_py.stat.islnk
file:
state: absent
path: ~/.config/ipython/profile_default/ipython_config.py
- name: create ipython config from template
template:
src: ipython_config.py
dest: ~/.config/ipython/profile_default/ipython_config.py
- name: install pip packages - name: install pip packages
pip: pip:
name: '{{python_pip_packages}}' name: '{{python_pip_packages}}'
state: latest state: latest
extra_args: --user extra_args: --user
- name: create directories
file:
state: directory
dest: '{{item}}'
with_items:
- ~/.config/ipython/profile_default
- ~/.config/pip

View File

@ -0,0 +1 @@
c.TerminalInteractiveShell.editing_mode = 'vi'

View File

@ -0,0 +1,8 @@
[global]
break-system-packages = true
{% if ansible_env.http_proxy is defined %}
proxy = {{ ansible_env.http_proxy }}
{% endif %}
[list]
format=columns

View File

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

View File

@ -19,8 +19,14 @@
name: ripgrep name: ripgrep
state: latest state: latest
- name: install Chocolatey package - name: remove chocolatey package
when: ansible_os_family == 'Windows' when: ansible_os_family == 'Windows'
win_chocolatey: win_chocolatey:
name: ripgrep 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

@ -0,0 +1,43 @@
---
# FIXME: This will only work for Debian or Ubuntu but not Ubuntu derived distros
- set_fact:
assets: '{{latest.json.assets}}'
asset_name: 'sunshine-{{ ansible_distribution | lower }}-{{ ansible_distribution_version }}-amd64.deb'
- set_fact:
asset_query: '[?contains(name, `{{asset_name}}`)] | [0]'
- set_fact:
asset: '{{assets | json_query(asset_query)}}'
- name: download deb file
get_url:
url: '{{asset.browser_download_url}}'
dest: '/tmp/{{asset_name}}'
environment: '{{proxy_environment}}'
- name: install package from deb file
become: true
apt:
deb: '/tmp/{{asset_name}}'
- name: remove deb file
file:
state: absent
path: '/tmp/{{asset_name}}'
- name: fix systemd unit
become: true
copy:
dest: /usr/lib/systemd/user/sunshine.service
content: |
[Unit]
Description=Sunshine is a self-hosted game stream host for Moonlight.
StartLimitIntervalSec=500
StartLimitBurst=5
[Service]
ExecStart=/usr/bin/sunshine
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=xdg-desktop-autostart.target

View File

@ -0,0 +1,56 @@
---
- assert:
that:
- ansible_distribution == "Fedora"
- assets is defined
- set_fact:
asset_name: 'sunshine-{{ ansible_distribution | lower }}-{{ ansible_distribution_version }}-amd64.rpm'
- set_fact:
asset_query: '[?contains(name, `{{asset_name}}`)] | [0]'
- set_fact:
asset: '{{assets | json_query(asset_query)}}'
- name: download rpm file
get_url:
url: '{{asset.browser_download_url}}'
dest: '/tmp/{{asset_name}}'
environment: '{{proxy_environment}}'
- name: install package from rpm file
dnf:
name: '/tmp/{{asset_name}}'
- name: remove rpm file
file:
state: absent
path: '/tmp/{{asset_name}}'
- name: create udev rules for uinput
become: true
copy:
content: |
KERNEL=="uinput", SUBSYSTEM=="misc", OPTIONS+="static_node=uinput", TAG+="uaccess"
dest: /etc/udev/rules.d/60-sunshine.rules
- name: reload udev rules for uinput
become: true
command: udevadm control --reload-rules
- name: request udev events
become: true
command: udevadm trigger
- name: add uinput module
become: true
modprobe:
name: uinput
- name: stat sunshine
stat:
path: /usr/bin/sunshine
register: sunshine
- name: enable permissions for KMS capture
become: true
command: 'setcap cap_sys_admin+p {{ sunshine.stat.lnk_source }}'

View File

@ -0,0 +1,18 @@
---
- name: get latest version
uri:
url: https://api.github.com/repos/LizardByte/Sunshine/releases/latest
headers: '{{github_auth_headers}}'
register: latest
- set_fact:
assets: '{{latest.json.assets}}'
- include_tasks: '{{ansible_os_family}}.yaml'
- name: enable systemd service
ansible.builtin.systemd_service:
name: sunshine
scope: user
enabled: true
state: started

View File

@ -1,4 +1,25 @@
--- ---
# TODO: create a launchd module that handles user mode services - name: get list of running launchd services
# cp $script_dir/system-info.plist ~/Library/LaunchAgents/system-info.plist command: launchctl list
# launchctl load -w ~/Library/LaunchAgents/system-info.plist register: launchd_running_services
changed_when: false
- 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}}"
- name: install system-info launchd plist
template:
src: system-info.plist.j2
dest: '{{system_info_plist_path}}'
register: system_info_plist
- name: unload running system-info launchd service
when: system_info_plist.changed and system_info_running
command: 'launchctl unload -w {{system_info_plist_path}}'
- name: load system-info launchd service
when: system_info_plist.changed or not system_info_running
command: 'launchctl load -w {{system_info_plist_path}}'

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>system-info</string>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
</dict>
<key>Program</key>
<string>{{ansible_env.HOME}}/.config/tmux/system-info/system-info-macOS.sh</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>

View File

@ -18,6 +18,7 @@
get_url: get_url:
url: https://gist.githubusercontent.com/nicm/ea9cf3c93f22e0246ec858122d9abea1/raw/37ae29fc86e88b48dbc8a674478ad3e7a009f357/tmux-256color url: https://gist.githubusercontent.com/nicm/ea9cf3c93f22e0246ec858122d9abea1/raw/37ae29fc86e88b48dbc8a674478ad3e7a009f357/tmux-256color
dest: ~/tmux-256color dest: ~/tmux-256color
environment: '{{proxy_environment}}'
- name: compile terminal info - name: compile terminal info
when: terminfo_exists.rc == 1 when: terminfo_exists.rc == 1

View File

@ -3,8 +3,11 @@
- name: clone config repo - name: clone config repo
git: git:
repo: git@code.infektor.net:config/tmux.git repo: git@git.infektor.net:config/tmux.git
dest: ~/.config/tmux dest: ~/.config/tmux
version: master version: main
- include_tasks: ~/.config/tmux/tasks.yaml - name: run install script
command: ~/.config/tmux/install.sh
register: tmux_install
changed_when: "'changed' in tmux_install.stdout"

View File

@ -0,0 +1,54 @@
---
- name: install keyring
when: ansible_distribution == 'Debian'
become: true
get_url:
url: '{{ulauncher_keyring_url}}'
dest: '{{ulauncher_keyring_path}}'
mode: '0644'
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
copy:
content: >-
deb [signed-by={{ulauncher_keyring_path}}]
http://ppa.launchpad.net/agornostal/ulauncher/ubuntu
{{codename}} main"
dest: '{{ulauncher_apt_sources_list_path}}'
- name: add ppa repository
when: ansible_distribution != 'Debian'
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

@ -0,0 +1,8 @@
---
- name: install dnf package
become: true
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,2 @@
---
- include_tasks: '{{ansible_os_family}}.yaml'

View File

@ -0,0 +1,4 @@
---
ulauncher_keyring_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x59ebde772980c381ca13fa59faf1020699503176
ulauncher_keyring_path: /usr/share/keyrings/ulauncher-archive-keyring.gpg
ulauncher_apt_list_path: /etc/apt/sources.list.d/ulauncher.list

View File

@ -28,6 +28,7 @@
url: 'https://cdn-2.webcatalog.io/webcatalog/{{appimage}}' url: 'https://cdn-2.webcatalog.io/webcatalog/{{appimage}}'
dest: '{{ansible_env.HOME}}/.local/bin/{{appimage}}' dest: '{{ansible_env.HOME}}/.local/bin/{{appimage}}'
mode: '0755' mode: '0755'
environment: '{{proxy_environment}}'
- name: create directories - name: create directories
file: file:

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 - name: install homebrew cask
homebrew_cask: homebrew_cask:
name: microsoft-remote-desktop name: windows-app
state: latest state: latest

View File

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

View File

@ -1,8 +1,11 @@
--- ---
- assert: - assert:
that: > that: >
'GNOME' in ansible_env.XDG_CURRENT_DESKTOP and 'XDG_CURRENT_DESKTOP' in ansible_env and
ansible_env.XDG_SESSION_TYPE == 'wayland' 'GNOME' in ansible_env.XDG_CURRENT_DESKTOP and (
ansible_env.XDG_SESSION_TYPE == 'wayland' or
ansible_env.XDG_SESSION_TYPE == 'x11'
)
- set_fact: - set_fact:
install_dir: '{{ansible_env.HOME}}/.local/bin' install_dir: '{{ansible_env.HOME}}/.local/bin'
@ -63,6 +66,7 @@
get_url: get_url:
url: '{{asset.browser_download_url}}' url: '{{asset.browser_download_url}}'
dest: '{{install_dir}}/xremap.zip' dest: '{{install_dir}}/xremap.zip'
environment: '{{proxy_environment}}'
- name: extract release archive - name: extract release archive
when: needs_installed when: needs_installed
@ -105,8 +109,9 @@
- name: clone config repo - name: clone config repo
git: git:
repo: git@code.infektor.net:config/xremap.git repo: git@git.infektor.net:config/xremap.git
dest: '{{config_dir}}' dest: '{{config_dir}}'
version: main
notify: restart xremap notify: restart xremap
- name: install xremap systemd unit - name: install xremap systemd unit

View File

@ -36,3 +36,4 @@
url: '{{asset.browser_download_url}}' url: '{{asset.browser_download_url}}'
dest: '{{yq_exe}}' dest: '{{yq_exe}}'
mode: +x mode: +x
environment: '{{proxy_environment}}'

View File

@ -50,3 +50,4 @@
url: '{{asset.browser_download_url}}' url: '{{asset.browser_download_url}}'
dest: '{{ansible_env.HOME}}/.local/bin/yq' dest: '{{ansible_env.HOME}}/.local/bin/yq'
mode: '0755' mode: '0755'
environment: '{{proxy_environment}}'

View File

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

View File

@ -3,84 +3,14 @@
- name: clone config repo - name: clone config repo
git: git:
repo: git@code.infektor.net:config/zsh.git repo: git@git.infektor.net:config/zsh.git
dest: ~/.config/zsh dest: ~/.config/zsh
version: master version: main
- name: clone plugin repos - name: run install script
git: command: ~/.config/zsh/install.zsh
repo: '{{item.repo}}' register: zsh_install
dest: '{{item.dest}}' changed_when: "'changed' in zsh_install.stdout"
with_items:
- repo: https://github.com/zsh-users/zsh-autosuggestions.git
dest: ~/.config/zsh/zsh-autosuggestions
- repo: https://github.com/zsh-users/zsh-history-substring-search.git
dest: ~/.config/zsh/zsh-history-substring-search
- repo: https://github.com/zsh-users/zsh-syntax-highlighting.git
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:
state: directory
dest: '{{item}}'
with_items:
- ~/.local/bin
- ~/.local/share/zsh/site-functions
- name: create symbolic links
file:
state: link
src: '{{item.src}}'
dest: '{{item.dest}}'
with_items:
- src: ~/.config/zsh/zlogin
dest: ~/.zlogin
- src: ~/.config/zsh/zlogout
dest: ~/.zlogout
- src: ~/.config/zsh/zprofile
dest: ~/.zprofile
- src: ~/.config/zsh/zshenv
dest: ~/.zshenv
- src: ~/.config/zsh/zshrc
dest: ~/.zshrc
- src: ~/.config/zsh/prompt_fresh_setup
dest: ~/.local/share/zsh/site-functions/prompt_fresh_setup
- src: ~/.config/zsh/build/_build-dir
dest: ~/.local/share/zsh/site-functions/_build-dir
- src: ~/.config/zsh/sandbox/_sandbox
dest: ~/.local/share/zsh/site-functions/_sandbox
- src: ~/.config/zsh/layout/_layout
dest: ~/.local/share/zsh/site-functions/_layout
- src: ~/.config/zsh/notes/_note
dest: ~/.local/share/zsh/site-functions/_note
- src: ~/.config/zsh/cmake-uninstall
dest: ~/.local/bin/cmake-uninstall
- src: ~/.config/zsh/$
dest: ~/.local/bin/$
- src: ~/.config/zsh/url/url
dest: ~/.local/bin/url
- src: ~/.config/zsh/url/_url
dest: ~/.local/share/zsh/site-functions/_url
loop_control:
label: '{{item.dest}}'
- name: list commands with available completions
command:
zsh {{ansible_env.HOME}}/.config/zsh/list-commands-with-available-completions.zsh
changed_when: false
register: completion_commands
- name: install completions for available commands
file:
state: link
src: '~/.config/zsh/zsh-completions/src/_{{item}}'
dest: '~/.local/share/zsh/site-functions/_{{item}}'
with_items: '{{completion_commands.stdout}}'
- name: get absolute path - name: get absolute path
shell: command -v zsh shell: command -v zsh