initial commit

This commit is contained in:
Phil Skentelbery
2025-09-17 23:40:52 -06:00
commit e8d0f33c57
8 changed files with 231 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
.python-version

7
main.yml Normal file
View File

@@ -0,0 +1,7 @@
---
- hosts: localhost
connection: local
gather_facts: true
become: true
roles:
- role: shell

3
requirements.yml Normal file
View File

@@ -0,0 +1,3 @@
collections:
- name: community.general
version: "*"

View File

@@ -0,0 +1,30 @@
- name: Determine target user
ansible.builtin.set_fact:
shell_user: "{{ shell_user | default( lookup('env','USER') ) }}"
- name: Detect platform
ansible.builtin.set_fact:
is_macos: "{{ ansible_facts['os_family'] == 'Darwin' }}"
- name: Install Stow on macOS using Homebrew cask
community.general.homebrew:
name: stow
state: present
when: is_macos
become: true
become_user: "{{ shell_user }}"
- name: Install Stow on Debian/Ubuntu
ansible.builtin.apt:
name: stow
state: present
update_cache: yes
when: not is_macos and ansible_facts['os_family'] == 'Debian'
become: true
- name: Install Stow on RedHat/CentOS/Fedora
ansible.builtin.yum:
name: stow
state: present
when: not is_macos and ansible_facts['os_family'] in ['RedHat', 'Fedora']
become: true

View File

@@ -0,0 +1,66 @@
---
# Install Meslo LG Nerd Font for the user/system
- name: Determine target user
ansible.builtin.set_fact:
shell_user: "{{ shell_user | default( lookup('env','USER') ) }}"
- name: Detect platform
ansible.builtin.set_fact:
is_macos: "{{ ansible_facts['os_family'] == 'Darwin' }}"
- name: Install Meslo LG Nerd Font on macOS using Homebrew cask
community.general.homebrew_cask:
name: font-meslo-lg-nerd-font
state: present
when: is_macos
become: true
become_user: "{{ shell_user }}"
- name: Ensure ~/.local/share/fonts exists for user
ansible.builtin.file:
path: "/home/{{ shell_user }}/.local/share/fonts"
state: directory
mode: '0755'
owner: "{{ shell_user }}"
recurse: yes
when: not is_macos
become: true
- name: Clone Nerd Fonts repo (temporary)
ansible.builtin.git:
repo: https://github.com/ryanoasis/nerd-fonts.git
dest: "/tmp/nerd-fonts"
update: yes
when: not is_macos
become: true
- name: Copy Meslo patched fonts to user fonts dir
ansible.builtin.find:
paths: "/tmp/nerd-fonts/patched-fonts/Meslo/Regular"
patterns: "*Meslo*.ttf"
register: meslo_files
when: not is_macos
- name: Install Meslo TTFs for user
ansible.builtin.copy:
src: "{{ item.path }}"
dest: "/home/{{ shell_user }}/.local/share/fonts/{{ item.path | basename }}"
remote_src: yes
owner: "{{ shell_user }}"
mode: '0644'
loop: "{{ meslo_files.files }}"
when: not is_macos and meslo_files.files | length > 0
become: true
- name: Refresh font cache on Linux
ansible.builtin.command: fc-cache -fv
when: not is_macos
become: true
- name: Cleanup nerd-fonts clone
ansible.builtin.file:
path: /tmp/nerd-fonts
state: absent
when: not is_macos
become: true

View File

@@ -0,0 +1,42 @@
---
# Install Starship prompt (https://starship.rs/)
- name: Determine target user
ansible.builtin.set_fact:
shell_user: "{{ shell_user | default( lookup('env','USER') ) }}"
- name: Detect platform
ansible.builtin.set_fact:
is_macos: "{{ ansible_facts['os_family'] == 'Darwin' }}"
- name: Check if starship is already installed
ansible.builtin.command: which starship
register: starship_check
failed_when: false
changed_when: false
- name: Install Starship on macOS using Homebrew
community.general.homebrew:
name: starship
state: present
when: is_macos and starship_check.rc != 0
become: true
become_user: "{{ shell_user }}"
- name: Install Starship on Linux using official installer
ansible.builtin.shell: |
curl -fsSL https://starship.rs/install.sh | sh -s -- -y
args:
executable: /bin/bash
when: not is_macos and starship_check.rc != 0
become: true
- name: Ensure starship is in PATH
ansible.builtin.command: which starship
register: starship_check_after
failed_when: false
changed_when: false
- name: Print starship path
ansible.builtin.debug:
msg: "starship path: {{ starship_check_after.stdout }}"

View File

@@ -0,0 +1,16 @@
---
- name: ZSH installation and configuration
import_tasks: zsh.yml
tags: zsh
- name: Install Meslo LG Nerd Font
import_tasks: install_meslo.yml
tags: meslo_font
- name: Install Starship prompt
import_tasks: install_starship.yml
tags: starship
- name: Setup dotfiles using GNU Stow
import_tasks: dotfiles.yml
tags: dotfiles

66
roles/shell/tasks/zsh.yml Normal file
View File

@@ -0,0 +1,66 @@
---
# Setup my shell just right
# Detect zsh binary path (common paths)
- name: Find zsh binary
ansible.builtin.shell: |
command -v zsh || true
register: zsh_path_cmd
changed_when: false
- name: Set zsh_path fact from command
ansible.builtin.set_fact:
zsh_path: "{{ (zsh_path_cmd.stdout | trim) if zsh_path_cmd.stdout | trim != '' else '' }}"
# Determine package manager and install zsh if missing
- name: Install zsh on macOS with Homebrew
community.general.homebrew:
name: zsh
state: present
when:
- ansible_facts['os_family'] == 'Darwin'
- zsh_path == ''
- name: Install zsh on Debian/Ubuntu
ansible.builtin.apt:
name: zsh
state: present
update_cache: yes
when:
- ansible_facts['os_family'] == 'Debian'
- zsh_path == ''
- name: Install zsh on RedHat/CentOS/Fedora
ansible.builtin.yum:
name: zsh
state: present
when:
- ansible_facts['os_family'] in ['RedHat', 'Fedora']
- zsh_path == ''
# Re-check zsh path after potential installation
- name: Re-find zsh binary
ansible.builtin.shell: command -v zsh || true
register: zsh_path_cmd_after
changed_when: false
- name: Update zsh_path fact after install
ansible.builtin.set_fact:
zsh_path: "{{ (zsh_path_cmd_after.stdout | trim) if zsh_path_cmd_after.stdout | trim != '' else zsh_path }}"
# Ensure zsh path is present in /etc/shells
- name: Ensure /etc/shells contains zsh path
ansible.builtin.lineinfile:
path: /etc/shells
line: "{{ zsh_path }}"
create: yes
state: present
insertafter: EOF
when: zsh_path != ''
# Change default shell for the current user
- name: Set default shell to zsh for current user
ansible.builtin.user:
name: "{{ lookup('env','USER') }}"
shell: "{{ zsh_path if zsh_path != '' else '/bin/zsh' }}"
when: zsh_path != ''