Table of Contents
- enroll single-shot
- Synopsis
- What it does
- Required arguments
- Options
- Permutations (valid combinations)
- Local, plain, single-site
- Local, plain, site mode (--fqdn)
- Local, plain, --dangerous
- Local, plain, control JinjaTurtle
- Local, SOPS-encrypted (--sops) output
- Local, SOPS-encrypted + --dangerous
- Local, SOPS-encrypted + site mode
- Remote, plain, single-site
- Remote, plain, site mode
- Remote, plain, --dangerous
- Remote, plain, without sudo
- Remote, SOPS-encrypted output
- Remote, SOPS-encrypted + --dangerous + site mode
- Working with the encrypted manifest output
- Common gotchas
enroll single-shot
Run harvest -> manifest in one command.
This is the convenience "do the whole thing" mode: it collects a harvest bundle (locally or remotely) and immediately generates an Ansible manifest from it.
Synopsis
enroll single-shot \
--harvest <DIR> \
--out <DIR|FILE> \
[--fqdn <HOST>] \
[--dangerous] \
[--sops <GPG_FPR...>] \
[--jinjaturtle | --no-jinjaturtle] \
[--remote-host <HOST>] [--remote-user <USER>] [--remote-port <PORT>] [--no-sudo]]
What it does
- Harvest phase
- Runs the same logic as
enroll harvest - Produces a harvest bundle (plaintext directory unless
--sopsis enabled)
- Manifest phase
- Runs the same logic as
enroll manifest - Produces an Ansible output tree (plaintext directory unless
--sopsis enabled) --fqdncontrols whether the output is single-site (default) or site mode
Required arguments
--harvest <dir>
Where to write the (intermediate) harvest bundle.
- In single-shot,
--harvestis treated as a directory path. - It may be:
- a newly created directory, or
- an existing directory (contents may be overwritten/updated)
Note: Unlike
enroll harvest, single-shot assumes you want a concrete directory for the intermediate harvest output.
--out <path>
Where to write the final manifest output.
- Plain mode (no
--sops)- must be a directory path
- SOPS mode (
--sops ...)- may be a directory (writes
manifest.tar.gz.sopsinside), or - may be a file path (writes that exact file)
- may be a directory (writes
Options
--fqdn <host>
Enable "site mode" output (inventory + per-host vars) in the manifest phase.
If omitted, output is generated in "single-site mode" with a top-level playbook.yml.
--dangerous
Applies to the harvest phase.
Disables "likely secret" safety checks, potentially collecting:
- private keys
- TLS key material
- database passwords
- API tokens
- other credentials
NOTE: Strongly consider using --sops when you enable --dangerous.
--sops <GPG_FINGERPRINT...>
Enable SOPS "encrypt at rest" mode for single-shot.
In single-shot, --sops affects both phases:
- Harvest output is written as a SOPS file (typically
harvest.tar.gz.sops) in the harvest directory - Manifest output is written as a SOPS file (typically
manifest.tar.gz.sops) in the output location
Requires sops available on PATH.
NOTE: If you want plaintext harvest but encrypted manifest (or the other way around), use enroll harvest and enroll manifest separately instead of enroll single-shot.
JinjaTurtle integration
--jinjaturtle
Force templating on for the manifest phase (errors if not installed).
--no-jinjaturtle
Force templating off for the manifest phase.
Default (no flag)
Auto mode: use JinjaTurtle if found on PATH.
Remote harvesting
--remote-host <host>
Run the harvest phase on a remote host over SSH, then generate the manifest locally.
--remote-user <user>
SSH username (default: local $USER).
--remote-port <port>
SSH port (default: 22).
--no-sudo
Don't use sudo on the remote host (may result in partial harvest).
Permutations (valid combinations)
Local, plain, single-site
enroll single-shot --harvest /tmp/enroll-harvest --out /tmp/enroll-ansible
Local, plain, site mode (--fqdn)
enroll single-shot --harvest /tmp/enroll-harvest --out /tmp/enroll-ansible --fqdn "$(hostname -f)"
Local, plain, --dangerous
enroll single-shot --harvest /tmp/enroll-harvest --out /tmp/enroll-ansible --dangerous
Local, plain, control JinjaTurtle
Force off:
enroll single-shot --harvest /tmp/enroll-harvest --out /tmp/enroll-ansible --no-jinjaturtle
Force on:
enroll single-shot --harvest /tmp/enroll-harvest --out /tmp/enroll-ansible --jinjaturtle
Local, SOPS-encrypted (--sops) output
Output to directory:
enroll single-shot --harvest /tmp/enroll-harvest --out /tmp/enroll-ansible --sops <FPR1>
# writes /tmp/enroll-harvest/harvest.tar.gz.sops and /tmp/enroll-ansible/manifest.tar.gz.sops
Output to a specific manifest file:
enroll single-shot --harvest /tmp/enroll-harvest --out /tmp/enroll-ansible/manifest.tar.gz.sops --sops <FPR1>
Local, SOPS-encrypted + --dangerous
enroll single-shot --harvest /tmp/enroll-harvest --out /tmp/enroll-ansible --dangerous --sops <FPR1>
Local, SOPS-encrypted + site mode
enroll single-shot --harvest /tmp/enroll-harvest --out /tmp/enroll-ansible --fqdn "$(hostname -f)" --sops <FPR1>
Remote, plain, single-site
enroll single-shot --remote-host host.example.com --harvest /tmp/enroll-harvest --out /tmp/enroll-ansible
Remote, plain, site mode
enroll single-shot --remote-host host.example.com --harvest /tmp/enroll-harvest --out /tmp/enroll-ansible --fqdn "host.example.com"
Remote, plain, --dangerous
enroll single-shot --remote-host host.example.com --harvest /tmp/enroll-harvest --out /tmp/enroll-ansible --dangerous
Remote, plain, without sudo
enroll single-shot --remote-host host.example.com --no-sudo --harvest /tmp/enroll-harvest --out /tmp/enroll-ansible
Remote, SOPS-encrypted output
enroll single-shot --remote-host host.example.com --harvest /tmp/enroll-harvest --out /tmp/enroll-ansible --sops <FPR1>
Remote, SOPS-encrypted + --dangerous + site mode
enroll single-shot --remote-host host.example.com --harvest /tmp/enroll-harvest --out /tmp/enroll-ansible --fqdn "host.example.com" --dangerous --sops <FPR1>
Working with the encrypted manifest output
If you used --sops, the final output is a single file (typically manifest.tar.gz.sops). To use it with Ansible:
mkdir -p /tmp/enroll-manifest && cd /tmp/enroll-manifest
sops -d /path/to/manifest.tar.gz.sops | tar -xzvf -
Then run Ansible from inside the extracted tree.
Common gotchas
--dangerousaffects harvest only (but in single-shot it still impacts what ends up in the manifest).- In SOPS mode, you must decrypt/extract before running Ansible.
- If you want to mix plaintext and SOPS between phases, use
harvestandmanifestseparately instead of single-shot.