feat: Initial roles

This commit is contained in:
2024-11-26 14:26:58 -05:00
parent 3a4285a397
commit 916e62f6e6
19 changed files with 203 additions and 44 deletions

View File

@@ -1,13 +1,29 @@
work_dir := "/tmp/hpa-playbook-tmp" [private]
default:
just --list
# Run the playbook with the passed in arguments.
[group('plays')]
run-playbook *ARGS: run-playbook *ARGS:
@ansible-playbook ./main.yml \ @ansible-playbook ./main.yml \
--extra-vars output_dir={{work_dir}} \
{{ARGS}} {{ARGS}}
# Run the repo-template option in the `dir` with the passed in arguements.
[group('plays')]
create-repo-template dir *ARGS:
@just run-playbook \
--tags repo-template \
--extra-vars output_dir={{dir}} \
{{ARGS}}
# Run the build-project option in the `dir` with the passed in arguements.
[group('plays')]
build-project dir *ARGS:
@just run-playbook \
--tags build-project \
--extra-vars project_dir={{dir}} \
{{ARGS}}
[group('test')]
test *ARGS: test *ARGS:
@ansible-playbook ./test/test.yml {{ARGS}} @ansible-playbook ./test/test.yml {{ARGS}}
[group("utilities")]
clean:
@rm -rf {{work_dir}}

View File

@@ -2,6 +2,15 @@
- name: HPA Playbook - name: HPA Playbook
hosts: all hosts: all
roles: roles:
- role: "repo_template" - role: repo-template
tags: tags:
- repo-template
- never # makes it so a tag must be supplied to run.
- role: build-project
tags:
- build-project
- never # makes it so a tag must be supplied to run.
- role: setup-project
tags:
- setup-project
- never # makes it so a tag must be supplied to run. - never # makes it so a tag must be supplied to run.

View File

@@ -0,0 +1,31 @@
---
build_dir_name: ".build"
build_dir: "{{ project_dir }}/{{ build_dir_name }}"
project_dir: "{{ lookup('env', 'PWD') }}"
project_vars_dir: "{{ project_dir }}"
# template_dir:
# path: "/path/to/template/dir
# vars: "repo_vars"
# repo: (optional if using a repo as a template)
template_dir:
path: "/path/to/template/dir"
vars: "repo_vars"
# When using a repository as a template dir. In general, it's
# probably best to pin to a particular version of the repo template
# instead of a branch.
#
# repo:
# url: "https://example.com/repo.git"
# version: "main"
repo: {}
copy_on_build:
- "{{ template_dir.path }}/head.tex"
- "{{ template_dir.path }}/Definitions.md"
template_on_build:
- "{{ project_dir }}/Report.md"
- "{{ template_dir.path }}/footer.tex"

View File

@@ -0,0 +1,46 @@
---
- name: Starting build project.
ansible.builtin.debug:
msg: "Build dir: {{ build_dir }}"
- name: Load project vars.
ansible.builtin.include_vars:
dir: "{{ project_vars_dir }}"
ignore_unknown_extensions: true
- name: Ensure build directory exists.
ansible.builtin.file:
path: "{{ build_dir }}"
state: directory
- name: Ensure template repo.
ansible.builtin.git:
repo: "{{ template_dir.repo.url }}"
dest: "{{ template_dir.path }}"
version: "{{ template_dir.repo.version | default('main') }}"
when: template_dir.repo.url is defined
- name: Check for repo vars directory.
ansible.builtin.stat:
path: "{{ template_dir.path }}/{{ template_dir.vars }}"
register: repo_vars
- name: Load repo vars if available.
ansible.builtin.include_vars:
dir: "{{ template_dir.path }}/{{ template_dir.vars }}"
when: repo_vars.stat.isdir is defined
- name: Copy build files.
ansible.builtin.copy:
src: "{{ item }}"
dest: "{{ build_dir }}/{{ item | basename }}"
mode: '0600'
with_items: "{{ copy_on_build }}"
- name: Template build files.
ansible.builtin.template:
src: "{{ item }}"
dest: "{{ build_dir }}/{{ item | basename }}"
mode: '0600'
with_items: "{{ template_on_build }}"

View File

@@ -1,6 +0,0 @@
---
# Variables for use with the copy_if_not_exists role.
source: ""
destination: ""
mode: '0600'

View File

@@ -2,3 +2,4 @@
output_dir: "{{ lookup('env', 'PWD') }}" output_dir: "{{ lookup('env', 'PWD') }}"
use_vault: true use_vault: true
repo_vars_dir: "repo_vars"

View File

@@ -0,0 +1,5 @@
---
on_setup:
- "Report.md"
- "vars.yml"
- "vault.yml" # optional if using vault.

View File

@@ -2,35 +2,34 @@
- name: Starting repo template role. - name: Starting repo template role.
ansible.builtin.debug: ansible.builtin.debug:
msg: "Output directory: {{ output_dir }}" msg: "Output directory: {{ output_dir }}"
tags:
- "repo-template"
- name: Ensure output directory exists. - name: Ensure output directory exists.
ansible.builtin.file: ansible.builtin.file:
path: "{{ output_dir }}" path: "{{ output_dir }}"
state: directory state: directory
tags:
- repo-template - name: Ensure repo vars directory.
ansible.builtin.file:
path: "{{ output_dir }}/{{ repo_vars_dir }}"
state: directory
- name: Copy general files. - name: Copy general files.
ansible.builtin.copy: ansible.builtin.copy:
src: "files/{{ item }}" src: "files/{{ item.src | default(item) }}"
dest: "{{ output_dir }}/{{ item }}" dest: "{{ output_dir }}/{{ item.dest | default(item) }}"
with_items: with_items:
- "Definitions.md" - "Definitions.md"
- "Report.md" - "Report.md"
- "head.tex" - "head.tex"
- "footer.tex" - "footer.tex"
tags: - src: "vars.repo.yml"
- "repo-template" dest: "{{ repo_vars_dir }}/vars.yml"
- name: Copy basic vars files. - name: Copy basic vars files.
ansible.builtin.copy: ansible.builtin.copy:
src: "files/vars.default.yml" src: "files/vars.default.yml"
dest: "{{ output_dir }}/vars.yml" dest: "{{ output_dir }}/vars.yml"
when: "not 'with-vault' in ansible_run_tags" when: not 'with-vault' in ansible_run_tags or use_vault | bool == False
tags:
- "repo-template"
- name: Copy vault and vars files. - name: Copy vault and vars files.
ansible.builtin.copy: ansible.builtin.copy:
@@ -41,6 +40,7 @@
dest: "vars.yml" dest: "vars.yml"
- src: "vault.default.yml" - src: "vault.default.yml"
dest: "vault.yml" dest: "vault.yml"
when: "'with_vault' in ansible_run_tags or use_vault | bool == True"
tags: tags:
- "with-vault" - with-vault
- never - never

View File

@@ -1,11 +1,27 @@
--- ---
template_repo:
repo: "https://example.com/repo.git"
version: "main"
dest: "/path/to/clone"
# template_dir:
# path: "/path/to/template/dir
# vars: "repo_vars"
# repo: (optional if using a repo as a template)
template_dir:
path: "/path/to/template/dir"
vars: "repo_vars"
# When using a repository as a template dir. In general, it's
# probably best to pin to a particular version of the repo template
# instead of a branch.
#
# repo:
# url: "https://example.com/repo.git"
# version: "main"
repo: {}
# The output directory to setup a project in.
output_dir: "{{ lookup('env', 'PWD') }}" output_dir: "{{ lookup('env', 'PWD') }}"
files_to_copy: # Files that are copied from the template directory to the output
# directory.
copy_on_setup:
- "Report.md" - "Report.md"
- "vars.yml" - "vars.yml"

View File

@@ -1,13 +1,15 @@
--- ---
# Check if a file exists at the destination already, copy it if not. # NOTE: This is just an internal task that checks if a file exists
- name: "Check if {{ destination | basename }} exists." # before copying, to prevent changes from being overwritten.
#
- name: "Check if {{ destination | basename }} exists already."
ansible.builtin.stat: ansible.builtin.stat:
path: "{{ destination }}" path: "{{ destination }}"
register: filestat register: filestat
tags: tags:
- always - always
- name: "Copy {{ source }} file to {{ destination }}." - name: "Copy {{ destination | basename }} file."
ansible.builtin.copy: ansible.builtin.copy:
src: "{{ source }}" src: "{{ source }}"
dest: "{{ destination }}" dest: "{{ destination }}"

View File

@@ -2,13 +2,41 @@
- name: Starting setup project. - name: Starting setup project.
ansible.builtin.debug: ansible.builtin.debug:
msg: "Output dir: {{ output_dir }}" msg: "Output dir: {{ output_dir }}"
tags:
- setup-project - name: Ensure output directory exists.
ansible.builtin.file:
path: "{{ output_dir }}"
state: directory
- name: Ensure repo. - name: Ensure repo.
ansible.builtin.git: ansible.builtin.git:
repo: "{{ template_repo.repo }}" repo: "{{ template_dir.repo.url }}"
dest: "{{ template_repo.dest }}" dest: "{{ template_dir.path }}"
version: "{{ template_repo.version }}" version: "{{ template_dir.repo.version | default('main') }}"
when: template_dir.repo.url is defined
- name: Check for repo vars directory.
ansible.builtin.stat:
path: "{{ template_dir.path }}/{{ template_dir.vars }}"
register: repo_vars
- name: Load repo vars if available.
ansible.builtin.include_vars:
dir: "{{ template_dir.path }}/{{ template_dir.vars }}"
when: repo_vars.stat.isdir is defined
- name: Debug on_setup.
ansible.builtin.debug:
msg: "On setup vars: {{ copy_on_setup }}"
tags: tags:
- setup-project - debug
- never
- name: Copy project files.
ansible.builtin.include_tasks:
file: "copy_if_not_exists.yml"
vars:
source: "{{ template_dir.path }}/{{ item }}"
destination: "{{ output_dir }}/{{ item }}"
mode: '0600'
with_items: "{{ copy_on_setup }}"

View File

@@ -4,13 +4,24 @@
roles: roles:
- role: setup-project - role: setup-project
tags: tags:
- setup-project
- never # force passing tags to run. - never # force passing tags to run.
vars: vars:
template_repo: template_dir:
repo: "https://git.housh.dev/michael/ansible-hpa-playbook.git" path: "/tmp/hpa-playbook-tmp"
dest: "/tmp/playbook-clone" vars: "repo_vars"
version: "main" output_dir: "/tmp/hpa-setup-project-tmp"
- role: repo_template - role: repo-template
tags: tags:
- repo-template
- never # force passing tags to run. - never # force passing tags to run.
- role: build-project
tags:
- build-project
- never # force passing tags to run.
vars:
template_dir:
path: "/tmp/hpa-playbook-tmp"
vars: "repo_vars"
project_dir: "/tmp/hpa-setup-project-tmp"