{"id":13942154,"url":"https://github.com/TechDufus/dotfiles","last_synced_at":"2025-07-20T05:32:15.730Z","repository":{"id":64401320,"uuid":"575145146","full_name":"TechDufus/dotfiles","owner":"TechDufus","description":"Fully automated development environment for TechDufus using ansible.","archived":false,"fork":false,"pushed_at":"2025-07-17T20:56:19.000Z","size":1145,"stargazers_count":360,"open_issues_count":1,"forks_count":65,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-07-17T22:12:40.316Z","etag":null,"topics":["ansible","archlinux","bash","dotfiles","neovim","ubuntu"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/TechDufus.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":"TechDufus"}},"created_at":"2022-12-06T21:23:24.000Z","updated_at":"2025-07-17T20:56:22.000Z","dependencies_parsed_at":"2024-02-04T20:11:22.788Z","dependency_job_id":"1a003ae0-3f5e-4642-95c7-abc7ba4838a4","html_url":"https://github.com/TechDufus/dotfiles","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/TechDufus/dotfiles","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TechDufus%2Fdotfiles","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TechDufus%2Fdotfiles/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TechDufus%2Fdotfiles/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TechDufus%2Fdotfiles/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TechDufus","download_url":"https://codeload.github.com/TechDufus/dotfiles/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TechDufus%2Fdotfiles/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266071519,"owners_count":23871940,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ansible","archlinux","bash","dotfiles","neovim","ubuntu"],"created_at":"2024-08-08T02:01:43.576Z","updated_at":"2025-07-20T05:32:10.713Z","avatar_url":"https://github.com/TechDufus.png","language":"Shell","funding_links":["https://github.com/sponsors/TechDufus"],"categories":["Shell"],"sub_categories":[],"readme":"\n\n![dotfiles-logo](https://github.com/TechDufus/dotfiles/assets/46715299/6c1d626d-28d2-41e3-bde5-981d9bf93462)\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/TechDufus/dotfiles/actions/workflows/ansible-lint.yml\"\u003e\u003cimg align=\"center\" src=\"https://github.com/TechDufus/dotfiles/actions/workflows/ansible-lint.yml/badge.svg\"/\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/TechDufus/dotfiles/issues\"\u003e\u003cimg align=\"center\" src=\"https://img.shields.io/github/issues/techdufus/dotfiles\"/\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/sponsors/TechDufus\"\u003e\u003cimg align=\"center\" src=\"https://img.shields.io/github/sponsors/techdufus\"/\u003e\u003c/a\u003e\n    \u003ca href=\"https://discord.gg/5M4hjfyRBj\"\u003e\u003cimg align=\"center\" src=\"https://img.shields.io/discord/905178979844116520.svg?label=\u0026logo=discord\u0026logoColor=ffffff\u0026color=7389D8\u0026labelColor=6A7EC2\"/\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/TechDufus/dotfiles/commits/main\"\u003e\u003cimg align=\"center\" src=\"https://img.shields.io/github/commit-activity/m/techdufus/dotfiles\" alt=\"commit frequency\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---\nFully automated development environment for [TechDufus](https://www.twitch.tv/TechDufus) on Twitch.\n\nYou can watch a quick 'tour' (pre-1Password integration) here on YouTube:\n\n\u003ca href=\"https://youtu.be/hPPIScBt4Gw\"\u003e\n    \u003cimg src=\"https://github.com/TechDufus/dotfiles/assets/46715299/b114ea0c-b67b-437b-87d3-7c7732aeccf8\" alt=\"Automating your Dotfiles with Ansible: A Showcase\" style=\"width:60%;\"/\u003e\n\u003c/a\u003e\n\nThis repo is heavily influenced by [ALT-F4-LLC](https://github.com/ALT-F4-LLC/dotfiles)'s repo. Go check it out!\n\n## Goals\n\nProvide fully automated multiple-OS development environment that is easy to set up and maintain.\n\n### Why Ansible?\n\nAnsible replicates what we would do to set up a development environment pretty well. There are many automation solutions out there - I happen to enjoy using Ansible.\n\n## Requirements\n\n### Operating System\n\nThis Ansible playbook only supports multiple OS's on a per-role basis. This gives a high level of flexibility to each role.\n\nThis means that you can run a role, and it will only run if your current OS is configured for that role.\n\nThis is accomplished with this `template` `main.yml` task in each role:\n```yaml\n---\n- name: \"{{ role_name }} | Checking for Distribution Config: {{ ansible_distribution }}\"\n  ansible.builtin.stat:\n    path: \"{{ role_path }}/tasks/{{ ansible_distribution }}.yml\"\n  register: distribution_config\n\n- name: \"{{ role_name }} | Run Tasks: {{ ansible_distribution }}\"\n  ansible.builtin.include_tasks: \"{{ ansible_distribution }}.yml\"\n  when: distribution_config.stat.exists\n```\nThe first task checks for the existence of a `roles/\u003ctarget role\u003e/tasks/\u003ccurrent_distro\u003e.yml` file. If that file exists (example `current_distro:MacOSX` and a `MacOSX.yml` file exists) it will be run automatically. This keeps roles from breaking if you run a role that isn't yet supported or configured for the system you are running `dotfiles` on.\n\nCurrently configured 'bootstrap-able' OS's:\n- Ubuntu\n- Archlinux (btw)\n- MacOSX (darwin)\n\n`bootstrap-able` means the pre-dotfiles setup is configured and performed automatically by this project. For example, before we can run this ansible project, we must first install ansible on each OS type.\n\nTo see details, see the `__task \"Loading Setup for detected OS: $ID\"` section of the `bin/dotfiles` script to see how each OS type is being handled.\n\n### System Upgrade\n\nVerify your `supported OS` installation has all latest packages installed before running the playbook.\n\n```\n# Ubuntu\nsudo apt-get update \u0026\u0026 sudo apt-get upgrade -y\n# Arch\nsudo pacman -Syu\n# MacOSX (brew)\nbrew update \u0026\u0026 brew upgrade\n```\n\n\u003e [!NOTE]\n\u003e This may take some time...\n\n## Setup\n\n### all.yml values file\n\nThe `all.yml` file allows you to personalize your setup to your needs. This file will be created in the file located at `~/.dotfiles/group_vars/all.yaml` after you [Install this dotfiles](#install) and include your desired settings.\n\nBelow is a list of all available values. Not all are required but incorrect values will break the playbook if not properly set.\n\n| Name             | Type                                   | Required |\n| ---------------- | -------------------------------------- | -------- |\n| git_user_name    | string                                 | yes      |\n| op               | object `(see OP Variable below)`       | yes      |\n| go.packages      | list `(for extra go bin installs)`     | no       |\n| helm.repos       | list `(add extra helm repos)`          | no       |\n| k8s.repo.version | string `(specify kubectl bin version)` | no       |\n### 1Password Integration\n\nThis project depends on a 1Password vault. This means you must have a setup and authenticated `op-cli` for CLI access to your vault. This can be done by installing the 1Password desktop application **OR** can be setup with the `op` cli only, but it a bit more annoying that way since the CLI tool can directly integrate with the Desktop application.\n\nThe initial run of `dotfiles` on a new system **should** error without 1Password being setup and having access to a vault (currently defaults to `my.1password.com`)\n\n##### Deprecated `vault.secret` / `ansible-vault` method\n\nThe original method for deploying secrets was to create `ansible-vault` encrypted strings, which would be decrypted by the secret in `~/.ansible-vault/vault.secret`. This method no longer is supported, in favor of a more secure and flexible 1Password vault.\n\nIt is more flexible in the sense that rotating secrets is just updating the 1Password item, instead of needing to re-encrypt a string and commit it to github. The more you mess with encrypting / decrypting / commiting to Github, the higher the risk of a real secret being exposed.\n\nAdditionally, if the original `vault.secret` value was ever discovered, even though it's no longer being used by this project, could still be used to get the encrypted strings via the git history of this project and decrypted. That `vault.secret` password has been scorched from the earth. 🔥\n#### OP (1Password) Variable\n\nManage environment-critical items without needing `ansible-vault`, by using your `1Password` vault.\n\n\u003e [!NOTE]\n\u003e Currently, unless an `account` value is specified, the following `op` vaults assume `my.1password.com` vault.\n##### op.git\n\n`op.git` is where you will store any git-related vault paths. All values must be paths to vault.\n\n###### op.git.user\nThis variable stores `email` which is as `string` of your vault path to you github account email.\n\nExample `op.git.user` config:\n```yaml\nop:\n  git:\n    user:\n      email: \"op://Personal/Github/email\"\n```\n\n###### op.git.allowed_signers\nThis variable stores the `string` to your allowed signers value. This value should be in the following format:\n```\n\u003cemail\u003e namespaces=\"git\" \u003calgo-type[ssh-ed25519]\u003e \u003cssh public key\u003e\n```\n\nExample `op.git.allowed_signers` config:\n```yaml\nop:\n  git:\n    allowed_signers: \"op://Personal/Github/allowed_signers\"\n```\n\nExample full `op.git` config:\n```yaml\nop:\n  git:\n    user:\n      email: \"op://Personal/Github/email\"\n      allowed_signers: \"op://Personal/Github/allowed_signers\"\n```\n##### op.ssh\n`op.ssh` stores references to ssh keys that will be deployed to your local `~/.ssh` directory.\n\n###### op.ssh.github.techdufus\nThis variable stores a list of items containing `name:\u003cstring\u003e vault_path:\u003cstring\u003e`. This list will be looped over and the accompanying ssh pub/private keys will be created with the `name` value you provide.\n\nEXAMPLE: If `name: dufus` is provided, it will extract the values from the `vault_path` and create the `~/.ssh/dufus.pub` and `~/ssh/dufus` ssh keys.\n\n\u003e [!NOTE]\n\u003e This variable can be called anything. Currently it is called `techdufus` just for my brain to know these are associated with my `techdufus` github user account. But if you were in multiple github orgs/users and you wanted a key associated ONLY with your account for that org/user, you would create another `op.ssh.github.some_org_user_here` and list your keys in that var, promoting organizational awareness at a glance of the config.\n\nExample `op.ssh.github.techdufus` config:\n```yaml\nop:\n  ssh:\n    github:\n      techdufus:\n        - name: github_key\n          vault_path: \"op://Personal/github_key SSH\"\n```\n##### op.system.hosts\n\n\u003e [!WARNING]\n\u003e `op.system.hosts` is not implemented yet, but the information is the target implementation structure.\n\n`op.system.hosts` is a list of vault `\u003cstring\u003e` entries that will become a single line in your `/etc/hosts` file.\n\nExample `op.system.hosts` config:\n```yaml\nop:\n  system:\n    hosts:\n      - vault_path: op://Hosts/k8s-ingress\n        account: some-other-account.1password.com\n      - vault_path: op://Hosts/k8s-api\n        account: some-other-account.1password.com\n```\n\nExample full `op` config:\n```yaml\nop:\n  git:\n    user:\n      email: \"op://Personal/Github/email\"\n  ssh:\n    github:\n      techdufus:\n        - name: github_key\n          vault_path: \"op://Personal/github_key SSH\"\n  system:\n    hosts:\n      - vault_path: op://Hosts/k8s-ingress\n        account: some-other-account.1password.com\n      - vault_path: op://Hosts/k8s-api\n        account: some-other-account.1password.com\n```\n\n## Usage\n\n### Install\n\nThis playbook includes a custom shell script located at `bin/dotfiles`. This script is added to your $PATH after installation and can be run multiple times while making sure any Ansible dependencies are installed and updated.\n\nThis shell script is also used to initialize your environment after bootstrapping your `supported-OS` and performing a full system upgrade as mentioned above.\n\n\u003e [!NOTE]\n\u003e You must follow required steps before running this command or things may become unusable until fixed.\n\n```bash\nbash -c \"$(curl -fsSL https://raw.githubusercontent.com/TechDufus/dotfiles/main/bin/dotfiles)\"\n```\n\nIf you want to run only a specific role, you can specify the following bash command:\n```bash\ncurl -fsSL https://raw.githubusercontent.com/TechDufus/dotfiles/main/bin/dotfiles | bash -s -- --tags comma,seperated,tags\n```\n\n### Update\n\nThis repository is continuously updated with new features and settings which become available to you when updating.\n\nTo update your environment run the `dotfiles` command in your shell:\n\n```bash\ndotfiles\n```\n\nThis will handle the following tasks:\n\n- Verify Ansible is up-to-date\n- Clone this repository locally to `~/.dotfiles`\n- Verify any `ansible-galaxy` plugins are updated\n- Run this playbook with the values in `~/.config/dotfiles/group_vars/all.yaml`\n\nThis `dotfiles` command is available to you after the first use of this repo, as it adds this repo's `bin` directory to your path, allowing you to call `dotfiles` from anywhere.\n\nAny flags or arguments you pass to the `dotfiles` command are passed as-is to the `ansible-playbook` command.\n\nFor Example: Running the tmux tag with verbosity\n```bash\ndotfiles -t tmux -vvv\n```\n\nAs an added bonus, the tags have tab completion!\n```bash\ndotfiles -t \u003ctab\u003e\u003ctab\u003e\ndotfiles -t t\u003ctab\u003e\ndotfiles -t ne\u003ctab\u003e\n```\n\n## 🌟 Star History\n\n\u003ca href=\"https://github.com/techdufus/dotfiles/stargazers\" target=\"_blank\" style=\"display: block\" align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=techdufus/dotfiles\u0026type=Date\u0026theme=dark\" /\u003e\n    \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=techdufus/dotfiles\u0026type=Date\" /\u003e\n    \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=techdufus/dotfiles\u0026type=Date\" /\u003e\n  \u003c/picture\u003e\n\u003c/a\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FTechDufus%2Fdotfiles","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FTechDufus%2Fdotfiles","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FTechDufus%2Fdotfiles/lists"}