This is a collection of prompts I’ve written for projects in various languages that I work with on a regular basis.

Setup

There are some tools that I use with these prompts that you may want to add to your system by running the following commands:

bashutils_url="https://raw.githubusercontent.com/l50/dotfiles/main/bashutils"

bashutils_path="/tmp/bashutils"

if [[ ! -f "${bashutils_path}" ]]; then
   curl -s "${bashutils_url}" -o "${bashutils_path}"
fi

source "${bashutils_path}"

Next, navigate to the directory of the project you want to work on and run the following command:

process_files_from_config $bashutils_path/files/file_patterns.conf

Using patterns specified in the file_patterns.conf file, this function will process files recursively from the current directory and list them in a format that lends itself to parsing and comprehension by ChatGPT. Lastly, it will output the final results to your clipboard using pbcopy for macOS or xclip for Linux.

Note: if you reboot your system, you’ll need to run this script again unless you update the $bashutils_path to a permanent location on disk.

Ansible Prompts

These prompts help fix linting violations, create molecule tests, and handle other common tasks in Ansible.


Fix Linting Violations

Prompt:

Fix each of these linting violations:

```bash
# Placeholder for linting violations - replace with the linting violations
you need to resolve in your ansible code.
# Example Linting Violations - Replace with your data
- no-changed-when: Commands should not change things if nothing needs doing.
- roles/asdf/molecule/default/verify.yml:47 Task/Handler: Check sourcing of
  asdf.sh in shell profile for each user
# End of Placeholder
```

in this ansible role:

```bash
# Placeholder for an Ansible Role - replace with your ansible code content,
# courtesy of process_files_from_config.
# End of Placeholder
```

Refactor Ansible Role

Prompt:

I just refactored my `user_setup` role to be easier to manage
and eliminated a lot of unnecessary code:

"""
./vars/main.yml:

```yaml
---
user_setup_install_packages:
  - bash
  - sudo
```

./tasks/main.yml:

```yaml
---
- name: Gather the list of unique shells to install
  ansible.builtin.set_fact:
    unique_shells: "{{ user_setup_default_users | map(attribute='shell') | unique | map('regex_replace', '^/bin/(.*)$', '\1') | list }}"
  tags: always
- name: Install base packages
  become: true
  ansible.builtin.package:
    name: "{{ user_setup_install_packages }}"
    state: present
    update_cache: true
  environment: "{{ (ansible_os_family == 'Debian') | ternary({'DEBIAN_FRONTEND': 'noninteractive'}, {}) }}"
  tags: packages
- name: Install user-specific shells
  become: true
  ansible.builtin.package:
    name: "{{ item }}"
    state: present
  loop: "{{ unique_shells }}"
  when: item != '' and item != 'bash'
  environment:
    DEBIAN_FRONTEND: "{{ 'noninteractive' if ansible_distribution == 'Debian' else '' }}"
  tags: shells
- name: Ensure groups exist for users
  become: true
  ansible.builtin.group:
    name: "{{ item.usergroup }}"
    state: present
  loop: "{{ user_setup_default_users }}"
  when: item.usergroup is defined and item.usergroup != ''
- name: Create users
  become: true
  ansible.builtin.user:
    name: "{{ item.username }}"
    group: "{{ item.usergroup }}"
    shell: "{{ item.shell }}"
  loop: "{{ user_setup_default_users }}"
- name: Provide sudoers access for relevant users in sudoers.d
  become: true
  ansible.builtin.copy:
    dest: "/etc/sudoers.d/{{ item.username }}"
    content: "{{ item.username }} ALL=(ALL:ALL) NOPASSWD:ALL
"
    validate: "visudo -cf %s"
    mode: "0440"
  when: item.sudo
  loop: "{{ user_setup_default_users }}"
```

./meta/main.yml:

```yaml
---
galaxy_info:
  role_name: user_setup
  author: Jayson Grace
  namespace: cowdogmoo
  description: Sets up user accounts with optional sudo privileges for Unix-like systems.
  company: CowDogMoo
  license: MIT
  min_ansible_version: "2.14"
  platforms:
    - name: Ubuntu
      versions:
        - all
    - name: Kali
      versions:
        - all
    - name: EL
      versions:
        - all
  galaxy_tags:
    - user
    - setup
dependencies: []
```

./defaults/main.yml:

```yaml
---
user_setup_default_username: "{{ ansible_distribution | lower }}"
user_setup_default_users:
  - username: "{{ user_setup_default_username }}"
    usergroup: "{{ user_setup_default_username }}"
    sudo: true
    shell: /bin/zsh
```

./molecule/default/verify.yml:

```yaml
---
- name: Verify
  hosts: all
  gather_facts: true
  tasks:
    - name: Include default variables
      ansible.builtin.include_vars:
        file: "../../defaults/main.yml"
    - name: Include user setup variables
      ansible.builtin.include_vars:
        file: "../../vars/main.yml"
    - name: Check user exists
      ansible.builtin.command: "id -un {{ item.username }}"
      register: user_check
      changed_when: false
      failed_when: user_check.rc != 0
      loop: "{{ user_setup_default_users }}"
      loop_control:
        label: "{{ item.username }}"
    - name: Check user is in sudoers.d
      ansible.builtin.stat:
        path: "/etc/sudoers.d/{{ item.username }}"
      register: sudoers_file_check
      changed_when: false
      failed_when: not sudoers_file_check.stat.exists
      loop: "{{ user_setup_default_users }}"
      when: item.sudo
      loop_control:
        label: "{{ item.username }}"
    - name: Assert user creation
      ansible.builtin.assert:
        that:
          - "'{{ item.username }}' in (user_check.results | map(attribute='stdout') | list)"
      loop: "{{ user_setup_default_users }}"
      loop_control:
        label: "{{ item.username }}"
```

./molecule/default/molecule.yml:

```yaml
---
dependency:
  name: galaxy
driver:
  name: docker
platforms:
  - name: ubuntu_user_setup
    image: "geerlingguy/docker-ubuntu2204-ansible:latest"

    command: ""
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:rw
    cgroupns_mode: host
    privileged: true
  - name: kali_user_setup
    image: cisagov/docker-kali-ansible:latest

    command: ""
    pre_build_image: true
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:rw
    cgroupns_mode: host
    privileged: true
  - name: redhat_user_setup
    image: "geerlingguy/docker-rockylinux9-ansible:latest"

    command: ""
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:rw
    cgroupns_mode: host
    privileged: true
provisioner:
  name: ansible
  playbooks:
    converge: ${MOLECULE_PLAYBOOK:-converge.yml}
verifier:
  name: ansible
```

./molecule/default/converge.yml:

```yaml
---
- name: Converge
  hosts: all
  roles:
    - role: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}"
```

./molecule/default/inventory:

```yaml
localhost
```

"""

ASK: I need you to do the same thing for my ansible role. It will be provided
below in its entirety. If there is not an existing molecule directory in the
role, I will need you to create one using a similar format as the above example.

ANSIBLE ROLE IN NEED OF REFACTORING:

```bash
# Placeholder for an Ansible Role - replace with your ansible code content,
# courtesy of process_files_from_config.
# End of Placeholder
```

Create Molecule Tests

Prompt:

Please create a `verify.yml` for my ansible role that provides
comprehensive test coverage:

"""
./tasks/http_proxy.yml:

```yaml
---
- name: Manage K3s HTTP Proxy Configuration
  ansible.builtin.block:
    - name: Create k3s.service.d directory
      ansible.builtin.file:
        path: "{{ systemd_dir }}/k3s.service.d"
        owner: root
        group: root
        state: directory
        mode: "0755"
    - name: Deploy the K3s http_proxy configuration file
      ansible.builtin.template:
        src: "http_proxy.conf.j2"
        dest: "{{ systemd_dir }}/k3s.service.d/http_proxy.conf"
        owner: root
        group: root
        mode: "0755"
  when: proxy_env is defined
```

./tasks/main.yml:

```yaml
---
- name: Check for PXE-booted system and configure K3s
  block:
    - name: Check if system is PXE-booted
      ansible.builtin.command:
        cmd: cat /proc/cmdline
      register: boot_cmdline
      changed_when: false
      check_mode: false
    - name: Set fact for PXE-booted system
      ansible.builtin.set_fact:
        is_pxe_booted: "{{ 'root=/dev/nfs' in boot_cmdline.stdout }}"
      when: boot_cmdline.stdout is defined
    - name: Include http_proxy configuration tasks
      ansible.builtin.include_tasks: http_proxy.yml
    - name: Configure and manage the K3s service
      ansible.builtin.template:
        src: "k3s.service.j2"
        dest: "{{ systemd_dir }}/k3s-node.service"
        mode: "0755"
      ansible.builtin.systemd:
        name: k3s-node
        daemon_reload: true
        state: restarted
        enabled: true
```

./templates/http_proxy.conf.j2:

```bash
[Service]
Environment=HTTP_PROXY={{ proxy_env.HTTP_PROXY }}
Environment=HTTPS_PROXY={{ proxy_env.HTTPS_PROXY }}
Environment=NO_PROXY={{ proxy_env.NO_PROXY }}
```

./templates/k3s.service.j2:

```bash
[Unit]
Description=Lightweight Kubernetes
Documentation=https:
After=network-online.target
[Service]
Type=notify
ExecStartPre=-/sbin/modprobe br_netfilter
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/k3s agent \
  --server https:
  {% if is_pxe_booted | default(false) %}--snapshotter native \
  {% endif %}--token {{ hostvars[groups[group_name_master | default('master')][0]]['token'] | default(k3s_token) }} \
  {{ extra_agent_args | default("") }}
KillMode=process
Delegate=yes
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target
```

./molecule/default/molecule.yml:

```yaml
---
dependency:
  name: galaxy
driver:
  name: docker
platforms:
  - name: ubuntu_k3s
    image: "geerlingguy/docker-ubuntu2204-ansible:latest"
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:rw
    privileged: true
provisioner:
  name: ansible
verifier:
  name: ansible
```

./molecule/default/converge.yml:

```yaml
---
- name: Converge
  hosts: all
  roles:
    - role: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}"
```

Please stick to this idiomatic style for the complete verify.yml file you
will provide me that is chalk full of reliable molecule tests for my input
ansible role:

```yaml
---
- name: Verify
  hosts: all
  gather_facts: true
  tasks:
    - name: Include default variables
      ansible.builtin.include_vars:
        file: "../../defaults/main.yml"
    - name: Include user setup variables
      ansible.builtin.include_vars:
        file: "../../vars/main.yml"
    - name: Check user exists
      ansible.builtin.command: "id -un {{ item.username }}"
      register: user_check
      changed_when: false
      failed_when: user_check.rc != 0
      loop: "{{ user_setup_default_users }}"
      loop_control:
        label: "{{ item.username }}"
    - name: Check user is in sudoers.d
      ansible.builtin.stat:
        path: "/etc/sudoers.d/{{ item.username }}"
      register: sudoers_file_check
      changed_when: false
      failed_when: not sudoers_file_check.stat.exists
      loop: "{{ user_setup_default_users }}"
      when: item.sudo
      loop_control:
        label: "{{ item.username }}"
    - name: Assert user creation
      ansible.builtin.assert:
        that:
          - "'{{ item.username }}' in (user_check.results | map(attribute='stdout') | list)"
      loop: "{{ user_setup_default_users }}"
      loop_control:
        label: "{{ item.username }}"
```

Git Prompts

These prompts assist in creating commit messages from diffs and handling other git-related tasks.


Create commit message from git diff

Prompt:

Write a commit message for me using this diff:

```bash
# Placeholder for git diff - replace with your git diff output
# End of Placeholder
```

Please adhere to this format for your commit:

Created new `asdf` role with tests and linting.

**Added:**

- Added automated documentation generation for magefile utilities
- Automated Release Playbook - Introduced `galaxy-deploy.yml`, an automated
  release playbook for publishing the collection to Ansible Galaxy.
- Molecule Workflow - Added a new GitHub Actions workflow `molecule.yaml` for
  running Molecule tests on pull requests and pushes.
- Renovate Bot Configuration - Updated Renovate Bot configurations to reflect
  the new repository structure and naming.
- `molecule` configuration - Added new `molecule` configuration for the `asdf`
  role to support local testing and verification.
- asdf role - Added a new `asdf` role with enhanced functionality including
  OS-specific setup. Updated metadata and created new documentation under
  `roles/asdf/README.md` detailing role usage and variables.

**Changed:**

- GitHub Actions Workflows - Refactored the `release.yaml` workflow to align
  with Ansible collection standards, including updating working directory
  paths, setting up Python, installing dependencies, and automating the release
  to Ansible Galaxy.
- Pre-commit hooks - Added new pre-commit hooks for shell script validation and
  formatting.
- Refactored Ansible linting configuration - Moved the `.ansible-lint`
  configuration to `.ansible-lint.yaml` and adjusted linting rules.
  Also, added `mdstyle.rb` and `.mdlrc` for markdown linting configurations.
- Repository Metadata - Updated repository links in `README.md` and
  `galaxy.yml` to reflect the new repository naming and structure.
- Upgrade dependencies - Upgraded versions of pre-commit hooks and dependencies
  in `.pre-commit-config.yaml`, updated mage's `go.sum` to reflect the new
  dependency tree, and removed unused dependencies from mage's `go.sum`.

**Removed:**

- Removed old files in preparation for later refactoring.
- Windows Support for asdf role - Removed Windows support
  from `roles/asdf/README.md` as it is not supported in the tasks.

Keep your answer to 80 characters max per line!

Go Prompts

These prompts assist in writing go code, creating tests, and handling other common tasks in Go.


Add more tests

Prompt:

Add tests to give me better coverage of this go func:

```go
# Placeholder for go func - replace with your go code
```

Existing tests:

```go
# Placeholder for existing tests - replace with your existing tests
```

Generate comments

Prompt:

Update all of the exported resource comments in this code:

```go
# Placeholder for go code - replace with your go code
```

So that it matches this format for struct comments:

```go
// Cloudflare represents information needed to interface
// with the Cloudflare API.
//
// **Attributes:**
//
// CFApiKey: Cloudflare API key.
// CFEmail: Email associated with the Cloudflare account.
// CFZoneID: Zone ID of the domain on Cloudflare.
// Email: Email address for notifications.
// Endpoint: API endpoint for Cloudflare.
// Client: HTTP client for making requests.
```

and this format for exported functions:

```go
// GetDNSRecords retrieves the DNS records from Cloudflare for a
// specified zone ID using the provided Cloudflare credentials.
// It makes a GET request to the Cloudflare API, reads the
// response, and prints the 'name' and 'content' fields of
// each DNS record.
//
// **Parameters:**
//
// cf: A Cloudflare struct containing the necessary credentials
// (email, API key) and the zone ID for which the DNS records
// should be retrieved.
//
// **Returns:**
//
// error: An error if any issue occurs while trying to
// get the DNS records.
```

Please make sure there are no lines that are larger than 80 characters in length.
Adhere to idiomatic go practices (log or fmt output should not start with an
uppercase letter).
Pay close attention to spacing and formatting in these examples - these are
both very important to adhere to!

Create Additional Tests

Prompt:

Write me tests for all exported resources in this go code:

```go
# Placeholder for go code - replace with your go code
```

Using this format:

```go
package some_test

import (
 "testing"
)

func TestSomething(t *testing.T) {
 tests := []struct{
  name string
  // input and output go here
 }{
  {
   name: "something"
   // input and output go here
  },
  {
   name: "another thing"
   // input and output go here
  },
 }

 for _, tc := range testCases {
  t.Run(tc.name, func(t *testing.T) {
   // call function or method being tested
   // check outcome
  })
 }
}
```

Please make sure there are no lines that are larger than 80 characters in length.
Adhere to idiomatic go practices (log or fmt output should not start with an
uppercase letter).
Pay close attention to spacing and formatting in these examples - these are
both very important to adhere to!

Generate tests

Prompt:

Write me tests for all exported resources in this go code:

```go
# Placeholder for go code - replace with your go code
```

Using this format:

```go
package some_test

import (
 "testing"
)

func TestSomething(t *testing.T) {
 tests := []struct{
  name string
  // input and output go here
 }{
  {
   name: "something"
   // input and output go here
  },
  {
   name: "another thing"
   // input and output go here
  },
 }

 for _, tc := range testCases {
  t.Run(tc.name, func(t *testing.T) {
   // call function or method being tested
   // check outcome
  })
 }
}
```

Please make sure there are no lines that are larger than 80 characters in length.
Adhere to idiomatic go practices (log or fmt output should not start with an
uppercase letter).
Pay close attention to spacing and formatting in these examples - these are
both very important to adhere to!