├── .github └── workflows │ └── ci.yml ├── .gitignore ├── README.md ├── ansible.cfg ├── bootstrap.sh ├── hosts ├── playbook.yaml ├── roles ├── dev │ ├── tasks │ │ ├── asdf.yml │ │ ├── elixir.yml │ │ ├── javascript.yml │ │ ├── main.yaml │ │ ├── nodejs.yml │ │ └── ruby.yml │ └── templates │ │ └── asdf.sh.j2 ├── ops │ └── tasks │ │ ├── digital_ocean.yml │ │ ├── docker.yml │ │ ├── helm.yml │ │ ├── kubernetes.yml │ │ ├── main.yml │ │ └── pulumi.yml ├── packages │ └── tasks │ │ └── main.yml ├── shell │ └── tasks │ │ ├── dotfiles.yml │ │ ├── main.yml │ │ └── zsh.yml └── workspace │ └── tasks │ └── main.yaml └── vars ├── language_versions.yml ├── prerequisite_packages.yml ├── tool_versions.yml └── user_environment.yml /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | on: 3 | push: 4 | branches: [ master ] 5 | pull_request: 6 | branches: [ master ] 7 | 8 | workflow_dispatch: 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - uses: actions/checkout@v2 15 | 16 | - name: Set up correct configuration files 17 | run: "sed -i 's/user: jasonwc/user: runner/g' vars/user_environment.yml" 18 | 19 | - name: Bootstrap the environment 20 | run: sudo sh bootstrap.sh 21 | 22 | - name: Attempt to provision the box 23 | run: ansible-playbook -K playbook.yaml 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.un~ 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Setup 2 | Ansible Playbooks for setting up an ops/ruby/elixir focused workstation. 3 | 4 | ## ⚠️ Deprecated in favor of Nix-based [workstation](https://github.com/jasonwc/workstation) ⚠️ 5 | 6 | Used on: 7 | - [WSL2](https://devblogs.microsoft.com/commandline/announcing-wsl-2/) with the [Ubuntu app](https://www.microsoft.com/en-us/p/ubuntu/9nblggh4msv6). 8 | - [Multipass](https://github.com/CanonicalLtd/multipass) on Windows running latest Ubuntu. 9 | 10 | ## (Required) Setting up a Linux Environment 11 | There are a couple easy ways to get to a clean Linux environment on Windows: multipass and WSL. 12 | 13 | ### (Recommended) WSL2 14 | Follow the [Windows Subsystem for Linux Installation Guide for Windows 10](https://docs.microsoft.com/en-us/windows/wsl/install-win10) 15 | 16 | ### Multipass 17 | Follow the installation instructions on the [Multipass homepage](https://multipass.run) 18 | 19 | ## (Required) Docker for Desktop 20 | This setup repo won't install the Docker daemon in the Linux environment itself. Instead it assumes you have Docker for Desktop running either in WSL2.0 or on the Windows side and only installs client libs. I've gone with this approach because the Docker and WSL teams are constantly improving the connectivity and it was much harder to try to spin up Docker myself in WSL2.0 and nigh impossible in WSL1.0. 21 | 22 | To install Docker for Desktop on Windows, check out [their instructions](https://docs.docker.com/docker-for-windows/install/). 23 | 24 | If you're using WSL2.0, make sure to use the WSL backend setting in the Docker for Desktop client. Then it's pretty seamless. 25 | 26 | If you're using Multipass, you might have to enable some settings to talk to the Docker socket running in either WSL2.0 or on Hyper V. 27 | 28 | ## Quick Start 29 | You'll need to get an ssh key into your new Linux environment. Afterwards, run the following: 30 | 31 | ```bash 32 | # Clone to your home directory 33 | git clone git@github.com:jasonwc/setup.git 34 | 35 | # (Required) Set your username in playbook.yaml. While you're at it, check out the roles and vars_files too. 36 | # (Required) Set your username, repo directory, and repos in user_environment.yml (or clone my repos, what do I care!) 37 | 38 | # Installs ansible and dependencies 39 | sudo sh bootstrap.sh 40 | 41 | # Run the playbook 42 | ansible-playbook -K playbook.yaml 43 | ``` 44 | 45 | ## What do you get? 46 | This is a _somewhat_ opinionated but *lean* installation of tools that I want to have on a Linux environment. I do a lot of dev _in_ Docker containers, so often those containers will have specialized tools. 47 | 48 | Generally, I'm running this on my primary WSL2 workspace. I also spin up a VM from time to time for specific tasks and provision it with these tools for consistency. 49 | 50 | ### Shell 51 | 52 | > Installs basic tools like vim and tmux and sets up zsh as the default shell. Uses my [dotfiles](https://github.com/jasonwc/dotfiles) repo to configure them. 53 | 54 | - [zsh](http://zsh.sourceforge.net/): "Zsh is a shell designed for interactive use, although it is also a powerful scripting language." 55 | - [oh-my-zsh](https://ohmyz.sh/): "Oh My Zsh is a delightful, open source, community-driven framework for managing your Zsh configuration." 56 | - [vim](https://www.vim.org/): "Vim is a highly configurable text editor for efficiently creating and changing any kind of text." 57 | - [tmux](https://github.com/tmux/tmux): "tmux is a terminal multiplexer: it enables a number of terminals to be created, accessed, and controlled from a single screen. " 58 | - Syncs from my [dotfiles repo](https://github.com/jasonwc/dotfiles). Loads of config for the basics over there. 59 | - Clones some repos I'm working on 60 | - Runs `PlugInstall` in Vim 61 | 62 | ### Ops tooling 63 | 64 | > Tooling for doing operations and infrastructure type tasks. Mostly focused on interacting with cloud providers and working with Kubernetes and Docker. 65 | 66 | - [Docker](https://www.docker.com/): building and running containers 67 | - [Kubectl](https://kubernetes.io/): interacting with Kubernetes clusters 68 | - [Kubeadm](https://github.com/kubernetes/kubeadm): building and managing Kubernetes clusters 69 | - [Helm](https://helm.sh): building, deploying, and using Helm charts 70 | - [Krew](https://krew.sigs.k8s.io/): Plugin manager for `kubectl` 71 | - Configures `kubectl` with some `krew` plugins I like. 72 | 73 | ### Dev tooling 74 | 75 | > Tooling and programming languages for scripting and application development. 76 | 77 | - [asdf](https://asdf-vm.com/#/): version manager for multiple languages, frameworks, and plugings (think nvm, rbenv) 78 | - [ruby](https://www.ruby-lang.org/en/): "A dynamic, open source programming language with a focus on simplicity and productivity." 79 | - [erlang](https://www.erlang.org/): "Erlang is a programming language used to build massively scalable soft real-time systems with requirements on high availability." 80 | - [elixir](https://elixir-lang.org/): "Elixir is a dynamic, functional language designed for building scalable and maintainable applications." 81 | - Handles dependency installation for various languages 82 | - Configurable language versions. Installs whatever is set and sets it globally for easy upgrades. 83 | 84 | ## Troubleshooting 85 | 86 | > [WARNING] Ansible is in a world writable directory 87 | 88 | If you see something like this, you need to set correct permissions on the `setup` directory: 89 | 90 | ```bash 91 | chmod 700 /path/to/setup directory 92 | ``` 93 | 94 | This often happens with WSL installs. 95 | 96 | ## Inspiration 97 | I learned a lot about Ansible during my time at [Mavenlink](https://github.com/mavenlink). Much of the intial idea came from a great tool maintained by the team there called "ansible-workstation" and its successor "bootstrap-workstation". 98 | 99 | These other resources helped me along the way: 100 | 101 | - [Quickstart on how to create local ansible playbooks](https://www.tricksofthetrades.net/2017/10/02/ansible-local-playbooks/) 102 | - [SteveEdson/dev-machine](https://github.com/SteveEdson/dev-machine) 103 | - [ballPointPenguin/ansible-develop](https://github.com/ballPointPenguin/ansible-develop) 104 | - [Wintus/Ansible-WSL](https://github.com/Wintus/Ansible-WSL) 105 | - [Sudo Science - Using Ansible to Set Up Zsh](https://sudo-science.com/using-ansible-to-set-up-zsh/) 106 | - [A Linux Dev Environment on Windows with WSL 2, Docker Desktop and More](https://www.youtube.com/watch?v=idW-an99TAM&) 107 | - [Running Vim commands non-interactively](https://github.com/junegunn/vim-plug/issues/675) 108 | -------------------------------------------------------------------------------- /ansible.cfg: -------------------------------------------------------------------------------- 1 | [defaults] 2 | retry_files_enabled = False 3 | inventory = hosts 4 | ask_become_pass = True -------------------------------------------------------------------------------- /bootstrap.sh: -------------------------------------------------------------------------------- 1 | apt update 2 | apt upgrade -y 3 | 4 | apt install ansible aptitude -y -------------------------------------------------------------------------------- /hosts: -------------------------------------------------------------------------------- 1 | wsl ansible_connection=local -------------------------------------------------------------------------------- /playbook.yaml: -------------------------------------------------------------------------------- 1 | - hosts: wsl 2 | ### Go here to edit variables ### 3 | vars_files: 4 | - vars/language_versions.yml 5 | - vars/prerequisite_packages.yml 6 | - vars/tool_versions.yml 7 | - vars/user_environment.yml 8 | ### Comment out roles you don't need ### 9 | roles: 10 | - packages 11 | - shell 12 | - workspace 13 | - ops 14 | - dev 15 | ### Change to your user! ### 16 | user: jasonwc 17 | -------------------------------------------------------------------------------- /roles/dev/tasks/asdf.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Clone asdf 3 | command: git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v{{ asdf_version }} 4 | args: 5 | creates: ~/.asdf 6 | 7 | - name: "source asdf script" 8 | template: 9 | src: "asdf.sh.j2" 10 | dest: "/etc/profile.d/asdf.sh" 11 | owner: "root" 12 | group: "root" 13 | mode: 0755 14 | become: True 15 | 16 | # TODO: This failed when no plugins existed :/ 17 | - name: Get installed asdf plugins 18 | command: "asdf plugin-list" 19 | register: asdf_plugins 20 | ignore_errors: yes 21 | 22 | - name: Add asdf plugins 23 | command: "asdf plugin-add {{ item }}" 24 | when: "item|string not in asdf_plugins.stdout_lines" 25 | with_items: 26 | - erlang 27 | - elixir 28 | - ruby 29 | - nodejs 30 | -------------------------------------------------------------------------------- /roles/dev/tasks/elixir.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Install Erlang 3 | shell: "asdf install erlang {{ erlang_version }}" 4 | 5 | - name: Install Elixir 6 | shell: "asdf install elixir {{ elixir_version}}" 7 | 8 | - name: Set global Erlang 9 | shell: "asdf global erlang {{ erlang_version }}" 10 | 11 | - name: Set global Elixir 12 | shell: "asdf global elixir {{ elixir_version }}" -------------------------------------------------------------------------------- /roles/dev/tasks/javascript.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Install node dependencies 3 | become: true 4 | apt: 5 | name: "{{ node_dependencies }}" 6 | vars: 7 | node_dependencies: 8 | - dirmngr 9 | - gpg 10 | 11 | - name: Install nodejs 12 | shell: "asdf install nodejs {{ nodejs_version }}" 13 | 14 | - name: Set global nodejs 15 | shell: "asdf global nodejs {{ nodejs_version }}" 16 | -------------------------------------------------------------------------------- /roles/dev/tasks/main.yaml: -------------------------------------------------------------------------------- 1 | # Language Version Management 2 | - include_tasks: asdf.yml 3 | # Languages 4 | - include_tasks: ruby.yml 5 | - include_tasks: elixir.yml 6 | - include_tasks: nodejs.yml 7 | -------------------------------------------------------------------------------- /roles/dev/tasks/nodejs.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Install node dependencies 3 | become: true 4 | apt: 5 | name: "{{ node_dependencies }}" 6 | vars: 7 | node_dependencies: 8 | - dirmngr 9 | - gpg 10 | 11 | - name: Install nodejs 12 | shell: "asdf install nodejs {{ nodejs_version }}" 13 | 14 | - name: Set global nodejs 15 | shell: "asdf global nodejs {{ nodejs_version }}" 16 | -------------------------------------------------------------------------------- /roles/dev/tasks/ruby.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Install Ruby dependencies 3 | become: true 4 | apt: 5 | name: "{{ ruby_dependencies }}" 6 | vars: 7 | ruby_dependencies: 8 | - build-essential 9 | - libssl-dev 10 | - libreadline-dev 11 | - zlib1g-dev 12 | - automake 13 | 14 | - name: Install Ruby 15 | shell: "asdf install ruby {{ ruby_version }}" 16 | 17 | - name: Set global Ruby 18 | shell: "asdf global ruby {{ ruby_version }}" -------------------------------------------------------------------------------- /roles/dev/templates/asdf.sh.j2: -------------------------------------------------------------------------------- 1 | # Taken from https://github.com/cimon-io/ansible-role-asdf/blob/master/templates/asdf.sh.j2 2 | # {{ ansible_managed }} 3 | 4 | [ -n "$BASH_VERSION" ] || return 0 5 | 6 | if [ -f "$HOME/.asdf/asdf.sh" ]; then 7 | source "$HOME/.asdf/asdf.sh" 8 | fi -------------------------------------------------------------------------------- /roles/ops/tasks/digital_ocean.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Download latest doctl release 3 | get_url: 4 | url: https://github.com/digitalocean/doctl/releases/download/v{{ doctl_version }}/doctl-{{ doctl_version }}-linux-amd64.tar.gz 5 | dest: /var/tmp/doctl-{{ doctl_version }}.tar.gz 6 | - name: Untar doctl release 7 | unarchive: 8 | src: /var/tmp/doctl-{{ doctl_version }}.tar.gz 9 | dest: /var/tmp 10 | - name: Add doctl binary to path 11 | become: true 12 | copy: 13 | src: /var/tmp/doctl 14 | dest: /usr/local/bin/doctl 15 | mode: 0755 16 | 17 | -------------------------------------------------------------------------------- /roles/ops/tasks/docker.yml: -------------------------------------------------------------------------------- 1 | # Taken from https://kubernetes.io/blog/2019/03/15/kubernetes-setup-using-ansible-and-vagrant/ 2 | --- 3 | - name: Install packages that allow apt to be used over HTTPS 4 | become: true 5 | apt: 6 | name: "{{ packages }}" 7 | state: present 8 | update_cache: yes 9 | vars: 10 | packages: 11 | - apt-transport-https 12 | - ca-certificates 13 | - curl 14 | - gnupg-agent 15 | - software-properties-common 16 | 17 | - name: Add an apt signing key for Docker 18 | become: true 19 | apt_key: 20 | url: https://download.docker.com/linux/ubuntu/gpg 21 | state: present 22 | 23 | - name: Add apt repository for Docker stable version 24 | become: true 25 | apt_repository: 26 | repo: deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable 27 | state: present 28 | 29 | - name: Install Docker and its dependecies 30 | become: true 31 | apt: 32 | name: "{{ packages }}" 33 | state: present 34 | update_cache: yes 35 | vars: 36 | packages: 37 | - docker-ce 38 | - docker-ce-cli 39 | - containerd.io 40 | -------------------------------------------------------------------------------- /roles/ops/tasks/helm.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Add an apt signing key for Helm 3 | become: true 4 | apt_key: 5 | url: https://baltocdn.com/helm/signing.asc 6 | state: present 7 | 8 | - name: Add apt repository for Helm 9 | become: true 10 | apt_repository: 11 | repo: deb https://baltocdn.com/helm/stable/debian/ all main 12 | state: present 13 | filename: helm-stable-debian.list 14 | 15 | - name: Install helm 16 | become: true 17 | apt: 18 | name: "{{ packages }}" 19 | state: present 20 | update_cache: yes 21 | vars: 22 | packages: 23 | - helm 24 | -------------------------------------------------------------------------------- /roles/ops/tasks/kubernetes.yml: -------------------------------------------------------------------------------- 1 | # Taken from https://kubernetes.io/blog/2019/03/15/kubernetes-setup-using-ansible-and-vagrant/ 2 | --- 3 | - name: Add an apt signing key for Kubernetes 4 | become: true 5 | apt_key: 6 | url: https://packages.cloud.google.com/apt/doc/apt-key.gpg 7 | state: present 8 | 9 | - name: Add apt repository for Kubernetes 10 | become: true 11 | apt_repository: 12 | repo: deb https://apt.kubernetes.io/ kubernetes-xenial main 13 | state: present 14 | filename: kubernetes.list 15 | 16 | - name: Install kubeadm and kubectl 17 | become: true 18 | apt: 19 | name: "{{ packages }}" 20 | state: present 21 | update_cache: yes 22 | vars: 23 | packages: 24 | - kubelet 25 | - kubeadm 26 | - kubectl 27 | 28 | - name: Check for krew 29 | stat: path=/$HOME/.krew 30 | register: krew 31 | 32 | - name: Install krew 33 | shell: | 34 | set -x; cd "$(mktemp -d)" && 35 | OS="$(uname | tr '[:upper:]' '[:lower:]')" && 36 | ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" && 37 | curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/krew.tar.gz" && 38 | tar zxvf krew.tar.gz && 39 | KREW=./krew-"${OS}_${ARCH}" && 40 | "$KREW" install krew 41 | when: not krew.stat.exists 42 | 43 | - name: Get installed krew plugins 44 | command: "kubectl krew list" 45 | register: "krew_plugins" 46 | 47 | - name: Install krew plugins 48 | command: "kubectl krew install {{ item }}" 49 | when: "item|string not in krew_plugins.stdout_lines" 50 | with_items: 51 | - cert-manager 52 | - ctx 53 | - exec-cronjob 54 | - get-all 55 | - krew 56 | - ns 57 | - pod-dive 58 | - roll 59 | - snap 60 | - tail 61 | - view-utilization 62 | -------------------------------------------------------------------------------- /roles/ops/tasks/main.yml: -------------------------------------------------------------------------------- 1 | - include_tasks: docker.yml 2 | - include_tasks: kubernetes.yml 3 | - include_tasks: helm.yml 4 | - include_tasks: digital_ocean.yml 5 | - include_tasks: pulumi.yml 6 | -------------------------------------------------------------------------------- /roles/ops/tasks/pulumi.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Download latest pulumi release 3 | get_url: 4 | url: https://get.pulumi.com/releases/sdk/pulumi-v{{ pulumi_version }}-linux-x64.tar.gz 5 | dest: /var/tmp/pulumi-{{ pulumi_version }}.tar.gz 6 | - name: Untar pulumi release 7 | unarchive: 8 | src: /var/tmp/pulumi-{{ pulumi_version }}.tar.gz 9 | dest: /var/tmp 10 | - name: Add pulumi binary to path 11 | become: true 12 | copy: 13 | src: /var/tmp/pulumi/ 14 | dest: /usr/local/bin/ 15 | mode: 0755 16 | 17 | -------------------------------------------------------------------------------- /roles/packages/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: update package list 3 | become: true 4 | package: 5 | update_cache: yes 6 | 7 | - name: upgrade all packages 8 | become: true 9 | package: 10 | name: "*" 11 | state: latest 12 | 13 | - name: Install packages 14 | become: true 15 | apt: 16 | name: "{{ prerequisite_packages }}" 17 | -------------------------------------------------------------------------------- /roles/shell/tasks/dotfiles.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # TODO: Refactor all of this lol 3 | - name: Clone dotfiles, unless present 4 | shell: cd && (test -d `basename git@github.com:{{ dotfiles_repo }}.git .git` || git clone git@github.com:{{ dotfiles_repo }}.git dotfiles) 5 | 6 | - name: Pull latest dotfiles 7 | shell: cd {{ lookup("env", "HOME") }}/dotfiles && git checkout {{ dotfiles_branch }} && git pull 8 | 9 | - name: Install dotfiles 10 | shell: cd {{ lookup("env", "HOME") }}/dotfiles && {{ dotfiles_command }} 11 | 12 | - name: Run PlugInstall in Vim 13 | shell: vim +'PlugInstall --sync' +qa 14 | -------------------------------------------------------------------------------- /roles/shell/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - include_tasks: zsh.yml 3 | - include_tasks: dotfiles.yml 4 | -------------------------------------------------------------------------------- /roles/shell/tasks/zsh.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: install zsh and friends 3 | become: True 4 | become_user: root 5 | package: name={{ item }} 6 | with_items: 7 | - git-core 8 | - powerline 9 | - zsh 10 | 11 | - name: change user shell to zsh 12 | become: yes 13 | become_user: root 14 | command: chsh -s /bin/zsh {{ user }} 15 | 16 | - name: Check for oh-my-zsh 17 | stat: path=/$HOME/.oh-my-zsh 18 | register: ohmyzsh 19 | 20 | - name: install oh-my-zsh 21 | shell: bash -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" 22 | when: not ohmyzsh.stat.exists 23 | 24 | - name: Check for dircolors 25 | stat: path=/$HOME/.dircolors 26 | register: dircolors 27 | 28 | - name: Install dircolors 29 | command: curl https://raw.githubusercontent.com/seebi/dircolors-solarized/master/dircolors.ansi-dark --output /$HOME/.dircolors 30 | when: not dircolors.stat.exists 31 | 32 | - name: Check for powerlevel10k 33 | stat: path=/$HOME/.oh-my-zsh/custom/themes/powerlevel10k 34 | register: powerlevel10k 35 | 36 | - name: Clone powerlevel10k 37 | command: git clone --depth=1 https://github.com/romkatv/powerlevel10k.git {{ lookup("env", "HOME") }}/.oh-my-zsh/custom/themes/powerlevel10k 38 | when: not powerlevel10k.stat.exists 39 | 40 | -------------------------------------------------------------------------------- /roles/workspace/tasks/main.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: install workspace directory 3 | file: path='{{ lookup("env", "HOME") }}/{{ repo_directory }}' state=directory 4 | 5 | - name: install workspace repos 6 | action: shell cd {{ lookup("env", "HOME") }}/{{ repo_directory}} && (test -d `basename {{ item }} .git` || git clone {{ item }}) 7 | with_items: "{{ repos }}" 8 | -------------------------------------------------------------------------------- /vars/language_versions.yml: -------------------------------------------------------------------------------- 1 | --- 2 | ruby_version: "2.6.3" 3 | elixir_version: "1.8.0" 4 | erlang_version: "22.0" 5 | nodejs_version: "14.17.0" 6 | -------------------------------------------------------------------------------- /vars/prerequisite_packages.yml: -------------------------------------------------------------------------------- 1 | --- 2 | prerequisite_packages: 3 | - vim 4 | - git 5 | - curl 6 | - tmux 7 | - unzip 8 | - fzf 9 | -------------------------------------------------------------------------------- /vars/tool_versions.yml: -------------------------------------------------------------------------------- 1 | --- 2 | helm_version: "3.5.4" 3 | asdf_version: "0.8.0" 4 | doctl_version: "1.61.0" 5 | pulumi_version: "3.3.1" 6 | -------------------------------------------------------------------------------- /vars/user_environment.yml: -------------------------------------------------------------------------------- 1 | --- 2 | user: jasonwc 3 | repo_directory: workspace 4 | repos: 5 | - git@github.com:jasonwc/noobernetes.io.git 6 | - git@github.com:jasonwc/jasoncarter.io.git 7 | - git@github.com:jasonwc/carter.haus.git 8 | dotfiles_repo: jasonwc/dotfiles 9 | dotfiles_branch: master 10 | dotfiles_command: sh install.sh 11 | 12 | --------------------------------------------------------------------------------