Add enroll manifest
parent
d8492fb67d
commit
0ad918fb25
1 changed files with 186 additions and 0 deletions
186
enroll-manifest.md
Normal file
186
enroll-manifest.md
Normal file
|
|
@ -0,0 +1,186 @@
|
|||
# enroll manifest
|
||||
|
||||
Generate an Ansible "manifest" (roles/playbooks, and optionally inventory) from an existing harvest bundle.
|
||||
|
||||
---
|
||||
|
||||
## Synopsis
|
||||
|
||||
```bash
|
||||
enroll manifest --harvest <DIR|SOPS_FILE> --out <DIR|FILE> [--fqdn <HOST>] [--jinjaturtle | --no-jinjaturtle] [--sops <GPG_FPR...>]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Inputs
|
||||
|
||||
### `--harvest <path>` (required)
|
||||
Path to the harvest input.
|
||||
|
||||
- **Plain mode (no `--sops`)**
|
||||
- must be a **directory** created by `enroll harvest` (containing `state.json`, `artifacts/`)
|
||||
|
||||
- **SOPS mode (`--sops ...`)**
|
||||
- may be either:
|
||||
- a **directory** (already decrypted), or
|
||||
- a **SOPS-encrypted harvest tarball** produced by `enroll harvest --sops` (e.g. `harvest.tar.gz.sops`)
|
||||
|
||||
---
|
||||
|
||||
## Outputs
|
||||
|
||||
### Plain mode output (directory)
|
||||
In plain mode, `--out` is a directory that is written in-place.
|
||||
|
||||
#### Default (single-site mode, no `--fqdn`)
|
||||
Typical top-level layout:
|
||||
|
||||
- `roles/`
|
||||
- `playbook.yml`
|
||||
|
||||
#### Site mode (`--fqdn <host>`)
|
||||
Adds inventory scaffolding and per-host files:
|
||||
|
||||
- `roles/`
|
||||
- `inventory/hosts.ini`
|
||||
- `inventory/host_vars/<fqdn>/...`
|
||||
- `playbooks/<fqdn>.yml`
|
||||
- `ansible.cfg`
|
||||
|
||||
In site mode, some raw harvested files are stored under:
|
||||
`inventory/host_vars/<fqdn>/<role>/.files/...`
|
||||
to avoid cross-host clobber while still sharing role code.
|
||||
|
||||
### SOPS mode output (single encrypted file)
|
||||
When `--sops <FPR...>` is set, the manifest output is bundled and encrypted into one file:
|
||||
- `manifest.tar.gz.sops`
|
||||
|
||||
`--out` may be:
|
||||
- a directory - `manifest.tar.gz.sops` is created inside it
|
||||
- a file path - that exact filename is written
|
||||
|
||||
---
|
||||
|
||||
## Options
|
||||
|
||||
### `--out <path>` (required)
|
||||
Where to write the manifest output.
|
||||
|
||||
- **Plain mode**: must be a directory path (created if needed).
|
||||
- **SOPS mode**: may be a directory or a file path (see above).
|
||||
|
||||
### `--fqdn <host>`
|
||||
Enable "site mode" output.
|
||||
|
||||
- Generates `inventory/`, `inventory/host_vars/<fqdn>/...`, and `playbooks/<fqdn>.yml`. This includes the `inventory/hosts.ini` with the fqdn inside it.
|
||||
- Generates an `ansible.cfg` with some nice defaults for running against multiple remote hosts.
|
||||
- Useful when you are enrolling multiple hosts into a shared repo layout
|
||||
|
||||
If `--fqdn` is omitted (or empty), the manifest is generated in "single-site mode" with `playbook.yml`, and no inventory files (all role parameters are stored in `defaults/main.yml` in the roles) or `ansible.cfg`. In that scenario, you are responsible for creating the `inventory` file or using `-i`.
|
||||
|
||||
If you *do* include `--fqdn`, and run the command repeatedly against different harvests but with the same `--out` param, Enroll will 'merge' the new host's inventory, roles, and playbooks into your manifest directory, as opposed to **overwrite** it.
|
||||
|
||||
Therefore, if you keep running `harvest` against all your hosts, you can gradually assemble a 'complete' manifest of all roles/playbooks/inventory of all hosts!
|
||||
|
||||
### JinjaTurtle integration
|
||||
|
||||
#### `--jinjaturtle`
|
||||
Force JinjaTurtle templating integration **on**.
|
||||
|
||||
- Errors if `jinjaturtle` is not available on `PATH`.
|
||||
|
||||
#### `--no-jinjaturtle`
|
||||
Force JinjaTurtle integration **off**, even if it’s installed.
|
||||
|
||||
#### Default (no flag)
|
||||
Auto mode: use JinjaTurtle if found on `PATH`, otherwise do not.
|
||||
|
||||
### `--sops <GPG_FINGERPRINT...>`
|
||||
Enable SOPS mode for manifest generation.
|
||||
|
||||
In this mode:
|
||||
1) If `--harvest` is an encrypted file, `enroll` decrypts and extracts it (using `sops -d`) to a secure temp directory.
|
||||
2) It generates the manifest into a secure temp directory.
|
||||
3) It bundles (tar.gz) and encrypts the entire manifest output into `manifest.tar.gz.sops`.
|
||||
|
||||
Requires `sops` available on `PATH`.
|
||||
|
||||
---
|
||||
|
||||
## Permutations (valid combinations)
|
||||
|
||||
### Plain + single-site (default; JinjaTurtle auto)
|
||||
```bash
|
||||
enroll manifest --harvest /path/to/harvest-dir --out /path/to/ansible-dir
|
||||
```
|
||||
|
||||
### Plain + site mode (`--fqdn`)
|
||||
```bash
|
||||
enroll manifest --harvest /path/to/harvest-dir --out /path/to/ansible-dir --fqdn host.example.com
|
||||
```
|
||||
|
||||
### Plain + disable JinjaTurtle
|
||||
```bash
|
||||
enroll manifest --harvest /path/to/harvest-dir --out /path/to/ansible-dir --no-jinjaturtle
|
||||
```
|
||||
|
||||
### Plain + force JinjaTurtle on
|
||||
```bash
|
||||
enroll manifest --harvest /path/to/harvest-dir --out /path/to/ansible-dir --jinjaturtle
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### SOPS output (manifest encrypted), harvest input is a directory
|
||||
Output to a directory (default filename inside):
|
||||
```bash
|
||||
enroll manifest --harvest /path/to/harvest-dir --out /path/to/out-dir --sops <FPR1>
|
||||
# writes /path/to/out-dir/manifest.tar.gz.sops
|
||||
```
|
||||
|
||||
Output to a specific file:
|
||||
```bash
|
||||
enroll manifest --harvest /path/to/harvest-dir --out /path/to/manifest.tar.gz.sops --sops <FPR1>
|
||||
```
|
||||
|
||||
### SOPS output, harvest input is an encrypted file
|
||||
```bash
|
||||
enroll manifest --harvest /path/to/harvest.tar.gz.sops --out /path/to/out-dir --sops <FPR1>
|
||||
```
|
||||
|
||||
### SOPS output + site mode (`--fqdn`)
|
||||
```bash
|
||||
enroll manifest --harvest /path/to/harvest.tar.gz.sops --out /path/to/out-dir --fqdn host.example.com --sops <FPR1>
|
||||
```
|
||||
|
||||
### SOPS output + JinjaTurtle control
|
||||
Force on:
|
||||
```bash
|
||||
enroll manifest --harvest /path/to/harvest.tar.gz.sops --out /path/to/out-dir --sops <FPR1> --jinjaturtle
|
||||
```
|
||||
|
||||
Force off:
|
||||
```bash
|
||||
enroll manifest --harvest /path/to/harvest.tar.gz.sops --out /path/to/out-dir --sops <FPR1> --no-jinjaturtle
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Working with the encrypted manifest (`manifest.tar.gz.sops`)
|
||||
|
||||
The encrypted manifest is one file; to use it with Ansible you typically:
|
||||
|
||||
```bash
|
||||
mkdir -p /tmp/enroll-manifest && cd /tmp/enroll-manifest
|
||||
sops -d /path/to/manifest.tar.gz.sops | tar -xzvf -
|
||||
```
|
||||
|
||||
After extraction, run Ansible from inside the extracted tree.
|
||||
|
||||
---
|
||||
|
||||
## Common gotchas
|
||||
|
||||
- In **plain mode**, `--out` is written in-place. If you re-run against the same output directory, expect files to be updated/overwritten.
|
||||
- In **site mode**, host-specific state lives under `inventory/host_vars/<fqdn>/...`; this is intentionally per-host.
|
||||
- In **SOPS mode**, the manifest is not directly runnable until you decrypt and extract it.
|
||||
Loading…
Add table
Add a link
Reference in a new issue