# ------------------------------------------------------------------------------ # FILE: roles/deploy-vllm/tasks/systemd.yml # PHASE 4: vLLM systemd service(s). # # vLLM 0.5.x serves ONE model per process. The primary model (role: primary, # e.g. Qwen2.5-32B-Instruct-AWQ) gets the canonical unit name vllm.service # (matches the spec's /etc/systemd/system/vllm.service). Any additional # enabled models (aux/embedding, added in later phases per the "Phased # Strategy") each get their own instance unit vllm-.service on a distinct # port, generated from the same template. # # Idempotent: ansible.builtin.template only reports changed when content # actually differs; the "restart vllm services" handler only fires on that # change (or on api-key.yml rewriting the shared env file). # # vllm_service_state defaults to "stopped" — this role stages everything # (venv, model, unit file, key) but does NOT flip production traffic without # an explicit --extra-vars vllm_service_state=started, matching the deploy- # then-validate-then-cutover sequencing approved for astro-orbiter. # ------------------------------------------------------------------------------ - name: Render systemd unit for each enabled model ansible.builtin.template: src: vllm.service.j2 dest: "/etc/systemd/system/{{ 'vllm.service' if item.role == 'primary' else 'vllm-' + item.id + '.service' }}" owner: root group: root mode: "0644" loop: "{{ vllm_enabled_models }}" loop_control: label: "{{ item.id }}" become: true notify: reload systemd - name: Render workspace helper script (manual debugging / smoke-testing) ansible.builtin.template: src: vllm-workspace.sh.j2 dest: "/home/{{ vllm_venv_owner }}/vllm-workspace.sh" owner: "{{ vllm_venv_owner }}" group: "{{ vllm_venv_owner }}" mode: "0750" become: true - name: Flush handlers so unit files are known to systemd before enabling ansible.builtin.meta: flush_handlers - name: Enable/disable + start/stop each vLLM systemd unit ansible.builtin.systemd: name: "{{ 'vllm.service' if item.role == 'primary' else 'vllm-' + item.id + '.service' }}" enabled: "{{ vllm_service_enabled }}" state: "{{ vllm_service_state }}" daemon_reload: true loop: "{{ vllm_enabled_models }}" loop_control: label: "{{ item.id }}" become: true