From f2ce25bfca9c1e1465618cc8099aa16ea33c6bef13cc70a4450cd5ccb42a0de9 Mon Sep 17 00:00:00 2001 From: bryan Date: Sun, 14 Dec 2025 21:19:13 -0500 Subject: [PATCH] Add symlink support --- deploy.code-workspace | 6 +- dotfiles/common/root/etc/dnf/dnf.conf | 8 + group_vars/all/dotfiles.yml | 20 +++ roles/dotfiles/tasks/main.yml | 229 ++++++++------------------ 4 files changed, 103 insertions(+), 160 deletions(-) create mode 100644 dotfiles/common/root/etc/dnf/dnf.conf create mode 100644 group_vars/all/dotfiles.yml diff --git a/deploy.code-workspace b/deploy.code-workspace index 4534fc1..075ff83 100644 --- a/deploy.code-workspace +++ b/deploy.code-workspace @@ -5,6 +5,8 @@ } ], "settings": { - "ansible.python.interpreterPath": "/home/bryan/.virtualenvs/deploy/bin/python" - } + "ansible.python.interpreterPath": "/home/bryan/.virtualenvs/deploy/bin/python", + "search.followSymlinks": false, + }, + } \ No newline at end of file diff --git a/dotfiles/common/root/etc/dnf/dnf.conf b/dotfiles/common/root/etc/dnf/dnf.conf new file mode 100644 index 0000000..63f8982 --- /dev/null +++ b/dotfiles/common/root/etc/dnf/dnf.conf @@ -0,0 +1,8 @@ +# see `man dnf.conf` for defaults and possible options + +[main] +# installonly_limit=3 +# best=False +skip_if_unavailable=True +deltarpm=True +fastestmirror=True diff --git a/group_vars/all/dotfiles.yml b/group_vars/all/dotfiles.yml new file mode 100644 index 0000000..16443f0 --- /dev/null +++ b/group_vars/all/dotfiles.yml @@ -0,0 +1,20 @@ +--- +symlinks: + - name: develop + src: "{{ lookup('env', 'HOME') }}/documents/develop" + dest: "{{ lookup('env', 'HOME') }}/develop" + - name: music + src: "{{ lookup('env', 'HOME') }}/media/music" + dest: "{{ lookup('env', 'HOME') }}/music" + - name: pictures + src: "{{ lookup('env', 'HOME') }}/media/pictures" + dest: "{{ lookup('env', 'HOME') }}/pictures" + - name: videos + src: "{{ lookup('env', 'HOME') }}/media/videos" + dest: "{{ lookup('env', 'HOME') }}/videos" + - name: ebooks + src: "{{ lookup('env', 'HOME') }}/media/ebooks" + dest: "{{ lookup('env', 'HOME') }}/ebooks" + - name: bin + src: "{{ lookup('env', 'HOME') }}/.local/bin" + dest: "{{ lookup('env', 'HOME') }}/bin" diff --git a/roles/dotfiles/tasks/main.yml b/roles/dotfiles/tasks/main.yml index ee68b13..a19ddd2 100644 --- a/roles/dotfiles/tasks/main.yml +++ b/roles/dotfiles/tasks/main.yml @@ -1,202 +1,115 @@ --- -- name: Find common home dotfiles (excluding templates) +- name: Find home dotfiles (excluding templates) ansible.builtin.find: - paths: "{{ playbook_dir }}/dotfiles/common/home" + paths: + - "{{ playbook_dir }}/dotfiles/common/home" + - "{{ playbook_dir }}/dotfiles/{{ group_names[0] }}/home" recurse: true file_type: file hidden: true excludes: "*.j2" delegate_to: localhost - register: dotfiles_common_home_files + register: dotfiles_home_files run_once: true ignore_errors: true -- name: Find common root dotfiles (excluding templates) +- name: Find root dotfiles (excluding templates) ansible.builtin.find: - paths: "{{ playbook_dir }}/dotfiles/common/root" + paths: + - "{{ playbook_dir }}/dotfiles/common/root" + - "{{ playbook_dir }}/dotfiles/{{ group_names[0] }}/root" recurse: true file_type: file hidden: true excludes: "*.j2" delegate_to: localhost - register: dotfiles_common_root_files + register: dotfiles_root_files run_once: true ignore_errors: true -- name: Find group home dotfiles (excluding templates) +- name: Find home template files ansible.builtin.find: - paths: "{{ playbook_dir }}/dotfiles/{{ item }}/home" - recurse: true - file_type: file - hidden: true - excludes: "*.j2" - loop: "{{ group_names | default([]) }}" - delegate_to: localhost - register: dotfiles_group_home_files - run_once: true - ignore_errors: true - -- name: Find group root dotfiles (excluding templates) - ansible.builtin.find: - paths: "{{ playbook_dir }}/dotfiles/{{ item }}/root" - recurse: true - file_type: file - hidden: true - excludes: "*.j2" - loop: "{{ group_names | default([]) }}" - delegate_to: localhost - register: dotfiles_group_root_files - run_once: true - ignore_errors: true - -- name: Deploy common home dotfiles (remote) - ansible.builtin.copy: - src: "{{ item.path }}" - dest: "{{ ansible_facts['env']['HOME'] }}/{{ item.path | replace(playbook_dir + '/dotfiles/common/home/', '') }}" - mode: preserve - loop: "{{ dotfiles_common_home_files.files }}" - when: ansible_connection not in ['local', 'localhost'] - -- name: Deploy common root dotfiles (remote) - ansible.builtin.copy: - src: "{{ item.path }}" - dest: "/{{ item.path | replace(playbook_dir + '/dotfiles/common/root/', '') }}" - mode: preserve - loop: "{{ dotfiles_common_root_files.files }}" - when: ansible_connection not in ['local', 'localhost'] - become: true - -- name: Deploy group home dotfiles (remote) - ansible.builtin.copy: - src: "{{ item.1.path }}" - dest: "{{ ansible_facts['env']['HOME'] }}/{{ item.1.path | replace(playbook_dir + '/dotfiles/' + item.0.item + '/home/', '') }}" - mode: preserve - loop: "{{ dotfiles_group_home_files.results | subelements('files', skip_missing=True) }}" - when: ansible_connection not in ['local', 'localhost'] - -- name: Deploy group root dotfiles (remote) - ansible.builtin.copy: - src: "{{ item.1.path }}" - dest: "/{{ item.1.path | replace(playbook_dir + '/dotfiles/' + item.0.item + '/root/', '') }}" - mode: preserve - loop: "{{ dotfiles_group_root_files.results | subelements('files', skip_missing=True) }}" - when: ansible_connection not in ['local', 'localhost'] - become: true - -- name: Symlink common home dotfiles (local) - ansible.builtin.file: - src: "{{ item.path }}" - dest: "{{ ansible_facts['env']['HOME'] }}/{{ item.path | replace((playbook_dir + '/dotfiles/common/home/'), '') }}" - state: link - force: true - loop: "{{ dotfiles_common_home_files.files }}" - when: ansible_connection in ['local', 'localhost'] - -- name: Symlink common root dotfiles (local) - ansible.builtin.file: - src: "{{ item.path }}" - dest: "/{{ item.path | replace((playbook_dir + '/dotfiles/common/root/'), '') }}" - state: link - force: true - loop: "{{ dotfiles_common_root_files.files }}" - when: ansible_connection in ['local', 'localhost'] - become: true - -- name: Symlink group home dotfiles (local) - ansible.builtin.file: - src: "{{ item.1.path }}" - dest: "{{ ansible_facts['env']['HOME'] }}/{{ item.1.path | replace((playbook_dir + '/dotfiles/' + item.0.item + '/home/'), '') }}" - state: link - force: true - loop: "{{ dotfiles_group_home_files.results | subelements('files', skip_missing=True) }}" - when: ansible_connection in ['local', 'localhost'] - -- name: Symlink group root dotfiles (local) - ansible.builtin.file: - src: "{{ item.1.path }}" - dest: "/{{ item.1.path | replace((playbook_dir + '/dotfiles/' + item.0.item + '/root/'), '') }}" - state: link - force: true - loop: "{{ dotfiles_group_root_files.results | subelements('files', skip_missing=True) }}" - when: ansible_connection in ['local', 'localhost'] - become: true - -- name: Find template files in common home dotfiles - ansible.builtin.find: - paths: "{{ playbook_dir }}/dotfiles/common/home" + paths: + - "{{ playbook_dir }}/dotfiles/common/home" + - "{{ playbook_dir }}/dotfiles/{{ group_names[0] }}/home" recurse: true file_type: file hidden: true patterns: "*.j2" delegate_to: localhost - register: dotfiles_common_home_templates + register: dotfiles_home_templates run_once: true ignore_errors: true -- name: Find template files in common root dotfiles +- name: Find root template files ansible.builtin.find: - paths: "{{ playbook_dir }}/dotfiles/common/root" + paths: + - "{{ playbook_dir }}/dotfiles/common/root" + - "{{ playbook_dir }}/dotfiles/{{ group_names[0] }}/root" recurse: true file_type: file hidden: true patterns: "*.j2" delegate_to: localhost - register: dotfiles_common_root_templates + register: dotfiles_root_templates run_once: true ignore_errors: true -- name: Find template files in group home dotfiles - ansible.builtin.find: - paths: "{{ playbook_dir }}/dotfiles/{{ item }}/home" - recurse: true - file_type: file - hidden: true - patterns: "*.j2" - loop: "{{ group_names | default([]) }}" - delegate_to: localhost - register: dotfiles_group_home_templates - run_once: true - ignore_errors: true - -- name: Find template files in group root dotfiles - ansible.builtin.find: - paths: "{{ playbook_dir }}/dotfiles/{{ item }}/root" - recurse: true - file_type: file - hidden: true - patterns: "*.j2" - loop: "{{ group_names | default([]) }}" - delegate_to: localhost - register: dotfiles_group_root_templates - run_once: true - ignore_errors: true - -- name: Template common home dotfiles - ansible.builtin.template: +- name: Symlink home dotfiles (local) + ansible.builtin.file: src: "{{ item.path }}" - dest: "{{ ansible_facts['env']['HOME'] }}/{{ item.path | replace(playbook_dir + '/dotfiles/common/home/', '') | replace('.j2', '') }}" - mode: '0600' - loop: "{{ dotfiles_common_home_templates.files }}" + dest: "{{ ansible_facts['env']['HOME'] }}/{{ item.path | regex_replace('^.+/dotfiles/(?:common|' + group_names[0] + ')/home/', '') }}" + state: link + force: true + loop: "{{ dotfiles_home_files.files }}" + when: ansible_connection in ['local', 'localhost'] -- name: Template common root dotfiles - ansible.builtin.template: +- name: Symlink root dotfiles (local) + ansible.builtin.file: src: "{{ item.path }}" - dest: "/{{ item.path | replace(playbook_dir + '/dotfiles/common/root/', '') | replace('.j2', '') }}" - mode: '0600' - loop: "{{ dotfiles_common_root_templates.files }}" + dest: "/{{ item.path | regex_replace('^.+/dotfiles/(?:common|' + group_names[0] + ')/root/', '') }}" + state: link + force: true + loop: "{{ dotfiles_root_files.files }}" + when: ansible_connection in ['local', 'localhost'] become: true -- name: Template group home dotfiles - ansible.builtin.template: - src: "{{ item.1.path }}" - dest: "{{ ansible_facts['env']['HOME'] }}/{{ item.1.path | replace(playbook_dir + '/dotfiles/' + item.0.item + '/home/', '') | replace('.j2', '') }}" - mode: '0600' - loop: "{{ dotfiles_group_home_templates.results | subelements('files', skip_missing=True) }}" +- name: Deploy home dotfiles (remote) + ansible.builtin.copy: + src: "{{ item.path }}" + dest: "{{ ansible_facts['env']['HOME'] }}/{{ item.path | regex_replace('^.+/dotfiles/(?:common|' + group_names[0] + ')/home/', '') }}" + mode: preserve + loop: "{{ dotfiles_home_files.files }}" + when: ansible_connection not in ['local', 'localhost'] -- name: Template group root dotfiles - ansible.builtin.template: - src: "{{ item.1.path }}" - dest: "/{{ item.1.path | replace(playbook_dir + '/dotfiles/' + item.0.item + '/root/', '') | replace('.j2', '') }}" - mode: '0600' - loop: "{{ dotfiles_group_root_templates.results | subelements('files', skip_missing=True) }}" +- name: Deploy root dotfiles (remote) + ansible.builtin.copy: + src: "{{ item.path }}" + dest: "/{{ item.path | regex_replace('^.+/dotfiles/(?:common|' + group_names[0] + ')/root/', '') }}" + mode: preserve + loop: "{{ dotfiles_root_files.files }}" + when: ansible_connection not in ['local', 'localhost'] become: true + +- name: Template home dotfiles + ansible.builtin.template: + src: "{{ item.path }}" + dest: "{{ ansible_facts['env']['HOME'] }}/{{ item.path | regex_replace('^.+/dotfiles/(?:common|' + group_names[0] + ')/home/', '') | replace('.j2', '') }}" + mode: '0600' + loop: "{{ dotfiles_home_templates.files }}" + +- name: Template root dotfiles + ansible.builtin.template: + src: "{{ item.path }}" + dest: "/{{ item.path | regex_replace('^.+/dotfiles/(?:common|' + group_names[0] + ')/root/', '') | replace('.j2', '') }}" + mode: '0600' + loop: "{{ dotfiles_root_templates.files }}" + become: true + +- name: Deploy symlinks + ansible.builtin.file: + src: "{{ item.src }}" + dest: "{{ item.dest }}" + state: link + force: true + loop: "{{ symlinks | default([]) }}"