Treat omitted host_apps.enabled as true (#36)
Sync runner checkout / sync (push) Successful in 6s

Closes #35.

## Summary
- `#33` used Jinja `rejectattr('enabled', 'equalto', false)` to skip stopped apps. That filter **requires** the key, so every `host_apps` row that omits `enabled` (the documented default) crashed deploy on all webservers before git/compose.
- Filter with `item.enabled | default(true)` instead, in `app-deploy` and `web-static`. `print_forge` (`enabled: false`) still skipped. `url_shortening_service` and every other omitted-key row deploy again.

## Test plan
- [ ] `ansible-playbook playbooks/deploy-apps.yml --syntax-check`
- [ ] Redeploy `url_shortening_service` beta: `deploy.sh --app url_shortening_service --env beta --ref <sha>`
- [ ] Confirm `print_forge` is still not started (no compose up on 8007/8019)

Reviewed-on: #36
This commit was merged in pull request #36.
This commit is contained in:
2026-09-16 08:21:29 -07:00
parent 726ad971cb
commit 658152088e
3 changed files with 26 additions and 4 deletions
+2 -1
View File
@@ -250,7 +250,8 @@ a DB.
Optional `compose_profiles: [worker]` activates docker compose profiles on that Optional `compose_profiles: [worker]` activates docker compose profiles on that
host only (used for `monica_site` / `college_craft` / `print_forge` dj-queue singleton on adama). host only (used for `monica_site` / `college_craft` / `print_forge` dj-queue singleton on adama).
Optional `enabled: false` skips deploy (CI included) but keeps the row for ports Optional `enabled: false` skips deploy (CI included) but keeps the row for ports
and `stop.sh`. Omit the key (or `true`) to deploy as before. and `stop.sh`. Omit the key (or `true`) to deploy as before. Do not use Jinja
`rejectattr('enabled')` — missing key is an error, not "enabled".
- Django app = one compose project per env: project name `<app>_<env>`, host port from `host_apps`. - Django app = one compose project per env: project name `<app>_<env>`, host port from `host_apps`.
Ports match across app hosts so NPM can balance `adama:PORT` + `roslin:PORT` + `starbuck:PORT` + `apollo:PORT`. Ports match across app hosts so NPM can balance `adama:PORT` + `roslin:PORT` + `starbuck:PORT` + `apollo:PORT`.
+12 -2
View File
@@ -35,14 +35,24 @@
- app_env is defined - app_env is defined
- matching_host_apps | length == 0 - matching_host_apps | length == 0
# rejectattr('enabled', …) raises when the key is omitted. Omit = enabled (#35).
- name: Reset deploy targets
ansible.builtin.set_fact:
deploy_targets: []
- name: "Drop disabled host_apps (enabled: false)" - name: "Drop disabled host_apps (enabled: false)"
ansible.builtin.set_fact: ansible.builtin.set_fact:
deploy_targets: "{{ matching_host_apps | rejectattr('enabled', 'equalto', false) | list }}" deploy_targets: "{{ deploy_targets + [item] }}"
loop: "{{ matching_host_apps }}"
when: item.enabled | default(true)
loop_control:
label: "{{ item.name }}/{{ item.env }}"
- name: Show skipped disabled apps - name: Show skipped disabled apps
ansible.builtin.debug: ansible.builtin.debug:
msg: "skip disabled {{ item.name }}/{{ item.env }} on {{ inventory_hostname }}" msg: "skip disabled {{ item.name }}/{{ item.env }} on {{ inventory_hostname }}"
loop: "{{ matching_host_apps | selectattr('enabled', 'equalto', false) | list }}" loop: "{{ matching_host_apps }}"
when: not (item.enabled | default(true))
loop_control: loop_control:
label: "{{ item.name }}/{{ item.env }}" label: "{{ item.name }}/{{ item.env }}"
+12 -1
View File
@@ -6,9 +6,20 @@
ansible.builtin.set_fact: ansible.builtin.set_fact:
_node_names: "{{ app_catalog | dict2items | selectattr('value.type', 'equalto', 'node-static') | map(attribute='key') | list }}" _node_names: "{{ app_catalog | dict2items | selectattr('value.type', 'equalto', 'node-static') | map(attribute='key') | list }}"
# rejectattr('enabled', …) raises when the key is omitted. Omit = enabled (#35).
- name: web-static | reset static apps
ansible.builtin.set_fact:
_static_apps: []
- name: web-static | this host's static apps - name: web-static | this host's static apps
ansible.builtin.set_fact: ansible.builtin.set_fact:
_static_apps: "{{ host_apps | default([]) | rejectattr('enabled', 'equalto', false) | selectattr('name', 'in', _node_names) | list }}" _static_apps: "{{ _static_apps + [item] }}"
loop: "{{ host_apps | default([]) }}"
when:
- item.name in _node_names
- item.enabled | default(true)
loop_control:
label: "{{ item.name }}/{{ item.env }}"
- name: web-static | configure and run - name: web-static | configure and run
when: _static_apps | length > 0 when: _static_apps | length > 0