Simplify pipeline credential management

This commit is contained in:
2026-09-16 21:35:07 +00:00
parent 8ff0761820
commit de1b191cd2
3 changed files with 12 additions and 48 deletions

View File

@@ -273,12 +273,11 @@ only reference names.
### Managed credentials
`dnd_pipeline_secrets` defaults to `{}`. Its keys must be valid environment
variable names, and each value is either a nonempty string to manage as the
exact named credential file or `null` to remove that exact file. Omitted names
are unmanaged: the role neither mirrors nor purges the directory. Narratio
loads this conventional sibling directory before configuration resolution; an
already-set process environment value takes precedence. The role adds no
wrapper, service, or parallel credential loader.
variable names, and each string value is managed as the exact named credential
file. Omitted names are unmanaged: the role neither mirrors nor purges the
directory. Narratio loads this conventional sibling directory before
configuration resolution; an already-set process environment value takes
precedence. The role adds no wrapper, service, or parallel credential loader.
Keep values in encrypted inventory, for example with Ansible Vault; Vault is a
consumer workflow, not role functionality:
@@ -287,9 +286,14 @@ consumer workflow, not role functionality:
dnd_pipeline_secrets:
AUDITA_LLM_API_KEY: "{{ vault_dnd_audita_llm_api_key }}"
OPENROUTER_API_KEY: "{{ vault_dnd_openrouter_api_key }}"
RETIRED_PROVIDER_KEY: null
```
Scriptorium profiles continue to own their `api_key_env` selection. To supply
that credential through the suite, add a `dnd_pipeline_secrets` entry whose
name matches the selected profile's `api_key_env`. Narratio's secrets bootstrap
loads the value, and its existing Scriptorium adapter forwards only the
profile-selected credential.
## Validation
`tests/integration` installs the pinned Git dependencies and collection into

View File

@@ -12,7 +12,7 @@
that:
- item.key is string
- item.key is match('^[A-Za-z_][A-Za-z0-9_]*$')
- item.value is none or (item.value is string and item.value | length > 0)
- item.value is string
loop: "{{ dnd_pipeline_secrets | dict2items }}"
loop_control:
label: "{{ item.key }}"
@@ -38,18 +38,6 @@
loop: "{{ dnd_pipeline_secrets | dict2items }}"
loop_control:
label: "{{ item.key }}"
when: item.value is not none
no_log: true
- name: Remove explicitly unmanaged Narratio credentials
become: true
ansible.builtin.file:
path: "/usr/local/etc/narratio/secrets/{{ item.key }}"
state: absent
loop: "{{ dnd_pipeline_secrets | dict2items }}"
loop_control:
label: "{{ item.key }}"
when: item.value is none
no_log: true
- name: Create the Notarius cache root

View File

@@ -164,34 +164,6 @@ if run_converge "$invalid_key_log" "${baseline_args[@]}" \
-e '{"dnd_pipeline_secrets":{"INVALID-KEY":"invalid-key-synthetic-value"}}'; then
exit 1
fi
invalid_value_log="$test_tmp/invalid-value.log"
if run_converge "$invalid_value_log" "${baseline_args[@]}" \
-e '{"dnd_pipeline_secrets":{"EMPTY_VALUE_KEY":""}}'; then
exit 1
fi
removal_key=NARRATIO_TEST_REMOVAL_KEY
removal_value=removal-synthetic-value
removal_present_config="{\"dnd_pipeline_secrets\":{\"AUDITA_LLM_API_KEY\":\"$synthetic_audita_api_key\",\"OPENROUTER_API_KEY\":\"$synthetic_notarius_api_key\",\"$removal_key\":\"$removal_value\"},\"dnd_pipeline_narratio_notarius_llm_api_key\":\"$removal_key\"}"
removal_present_log="$test_tmp/removal-present.log"
run_converge "$removal_present_log" "${baseline_args[@]}" -e "$removal_present_config"
removal_present_validation_log="$test_tmp/removal-present-validation.log"
/usr/bin/sudo -u narratio /usr/local/bin/narratio config validate \
--config /usr/local/etc/narratio/pipeline.yml --campaign centaurs | tee "$removal_present_validation_log"
removal_absent_config="{\"dnd_pipeline_secrets\":{\"AUDITA_LLM_API_KEY\":\"$synthetic_audita_api_key\",\"OPENROUTER_API_KEY\":\"$synthetic_notarius_api_key\",\"$removal_key\":null},\"dnd_pipeline_narratio_notarius_llm_api_key\":\"$removal_key\"}"
removal_absent_log="$test_tmp/removal-absent.log"
run_converge "$removal_absent_log" "${baseline_args[@]}" -e "$removal_absent_config"
removal_absent_validation_log="$test_tmp/removal-absent-validation.log"
if /usr/bin/sudo -u narratio /usr/local/bin/narratio config validate \
--config /usr/local/etc/narratio/pipeline.yml --campaign centaurs | tee "$removal_absent_validation_log"; then
exit 1
fi
removal_absent_repeat_log="$test_tmp/removal-absent-repeat.log"
run_converge "$removal_absent_repeat_log" "${baseline_args[@]}" -e "$removal_absent_config"
require_clean_recap "$removal_absent_repeat_log"
! grep -Fq "$synthetic_audita_api_key" "$baseline_log" "$removal_present_log" "$removal_absent_log" "$removal_present_validation_log" "$removal_absent_validation_log"
! grep -Fq "$synthetic_notarius_api_key" "$baseline_log" "$removal_present_log" "$removal_absent_log" "$removal_present_validation_log" "$removal_absent_validation_log"
! grep -Fq "$removal_value" "$removal_present_log" "$removal_absent_log" "$removal_present_validation_log" "$removal_absent_validation_log"
testing_profile_log="$test_tmp/testing-profile.log"
run_converge "$testing_profile_log" "${baseline_args[@]}" \