Run your first task
Open http://your-server:3000 and sign in with the admin account created during installation.
A project is the unit of separation in Semaphore — one project per team, environment or application. Everything else you create lives inside one. Create the first one from the projects menu.
Before Semaphore can clone a repository or log into a host, it needs a credential. Go to Key Store and create one:
- SSH — a private key, for both Git over SSH and for logging into target hosts.
- Login with password — a username plus password or token. Leave the login field empty to use it as a bare personal access token.
- None — a placeholder for public repositories that need no authentication.
Keys are encrypted at rest with the key you set in access_key_encryption.
Go to Repositories and add the repository holding your playbooks, Terraform code or scripts. Semaphore accepts:
- a local path —
/path/to/the/repo - a local Git repository —
file:// - a remote repository over HTTPS or SSH —
https://,ssh://
Set the branch, and select the Access Key you just created. Every task template needs a repository.
For Ansible runs, create an Inventory — the list of hosts to act on, plus the credential Ansible uses to log into them.
- Static — paste the inventory into the web form.
- File — a path to an inventory file inside your repository, e.g.
inventory/linux-hosts.yaml.
Each inventory needs at least a user credential; add a sudo credential if your plays escalate privileges.
Every task template requires a Variable Group, even an empty one. Create one containing {} to start, and come back later when you have real variables and secrets to pass.
Go to Task Templates → New Template and pick the app you are running — Ansible, Terraform/OpenTofu, Bash, PowerShell or Python. Fill in the repository, the path to the playbook or script, the inventory and the variable group, then Create.
Press Run. The task log streams live; when it finishes, the run is kept in history with who started it and what it did.
Once the run is reliable, stop pressing the button:
- Schedule it — cron syntax or a preset interval.
- Trigger it from Git — a webhook integration fires the template on push.
- Call it from code — the REST API launches tasks with a bearer token.
- Give it to your team — add members with the right role so they can run it without being able to change it.
A minimal first playbook#
If you do not yet have a repository to point at, this is enough to prove the whole path end to end:
---
- hosts: all
gather_facts: true
tasks:
- name: Report who and where
ansible.builtin.debug:
msg: "{{ inventory_hostname }} reached by {{ ansible_user }}"If you target localhost and Semaphore is running in a container, fact gathering fails by design — see Troubleshooting.
What to read next#
- Architecture — what actually ran your task, and where.
- Templates and tasks — task, build and deploy types, prompts and survey variables.
- Runners — move execution off the Semaphore server before it matters.