시작하기
Semaphore UI는 Ansible, Terraform/OpenTofu, Bash, PowerShell, Python으로 반복 가능한 자동화를 실행하는 웹 인터페이스와 API입니다. Git에 저장된 자동화 코드, 자격 증명, 변수, 일정, 워크플로, 실행 환경을 통합하고 각 실행의 상태와 로그를 보관합니다.
이 가이드에서는 첫 실행 예제로 Ansible을 사용합니다. 자신의 저장소에 있는 플레이북을 사용하거나 공개 저장소 semaphoreui/semaphore-demo로 스크린샷의 예제를 재현하세요.
1. Semaphore 설치하기
Semaphore를 실행할 환경에 맞는 설치 방법을 선택합니다. 기본값은 네이티브 패키지입니다.
- 네이티브 패키지
- Docker Compose
- 바이너리 압축 파일
- Helm으로 Kubernetes에 설치
amd64의 Debian 또는 Ubuntu:
wget https://github.com/semaphoreui/semaphore/releases/download/v2.19.12/semaphore_2.19.12_linux_amd64.deb
sudo apt install ./semaphore_2.19.12_linux_amd64.deb
amd64의 RHEL, Fedora, Rocky Linux, AlmaLinux 또는 CentOS Stream:
curl -LO https://github.com/semaphoreui/semaphore/releases/download/v2.19.12/semaphore_2.19.12_linux_amd64.rpm
sudo dnf install ./semaphore_2.19.12_linux_amd64.rpm
데이터베이스와 첫 관리자를 설정한 다음 생성된 설정으로 Semaphore를 시작합니다.
semaphore setup --config ./config.json
semaphore server --config ./config.json
로컬 평가용으로는 SQLite를 선택하고, 데이터베이스 및 플레이북 경로를 수락하거나 지정하고, 공개 URL을 입력한 뒤 안내에 따라 첫 관리자를 생성합니다.
compose.yaml을 생성합니다.
services:
semaphore:
image: semaphoreui/semaphore:v2.19.12
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- semaphore-data:/var/lib/semaphore
environment:
SEMAPHORE_DB_DIALECT: sqlite
SEMAPHORE_DB_PATH: /var/lib/semaphore
SEMAPHORE_ADMIN: admin
SEMAPHORE_ADMIN_NAME: Admin
SEMAPHORE_ADMIN_EMAIL: admin@localhost
SEMAPHORE_ADMIN_PASSWORD: ${SEMAPHORE_ADMIN_PASSWORD}
SEMAPHORE_ACCESS_KEY_ENCRYPTION: ${SEMAPHORE_ACCESS_KEY_ENCRYPTION}
volumes:
semaphore-data:
암호화 키를 생성한 다음 강력한 관리자 암호와 함께 compose.yaml 옆의 .env 파일에 저장합니다.
head -c32 /dev/urandom | base64
SEMAPHORE_ADMIN_PASSWORD=replace-with-a-long-password
SEMAPHORE_ACCESS_KEY_ENCRYPTION=paste-the-generated-key-here
.env을 버전 관리에서 제외하고 컨테이너를 시작합니다.
docker compose up -d
docker compose logs -f semaphore
GitHub Releases에서 운영 체제와 CPU 아키텍처에 맞는 압축 파일을 다운로드합니다. Linux amd64 예제:
curl -LO https://github.com/semaphoreui/semaphore/releases/download/v2.19.12/semaphore_2.19.12_linux_amd64.tar.gz
tar -xzf semaphore_2.19.12_linux_amd64.tar.gz
./semaphore setup --config ./config.json
./semaphore server --config ./config.json
로컬 평가용으로는 SQLite를 선택하고, 데이터베 이스 및 플레이북 경로를 수락하거나 지정하고, 공개 URL을 입력한 뒤 안내에 따라 첫 관리자를 생성합니다.
macOS는 darwin 압축 파일, Windows는 .zip을 선택합니다. 이 가이드 뒷부분의 Ansible 절차에는 Ansible이 설치된 Linux, macOS, WSL, 컨테이너 또는 Linux 러너 실행 환경이 필요합니다.
공식 차트를 추가하고 설치 전에 기본값을 확인합니다.
helm repo add semaphoreui https://semaphoreui.github.io/charts
helm repo update
helm show chart semaphoreui/semaphore
helm show values semaphoreui/semaphore > values.yaml
helm upgrade --install semaphore semaphoreui/semaphore \
--namespace semaphore \
--create-namespace \
--values values.yaml
차트의 appVersion은 Semaphore 버전을 나타냅니다. 프로덕션에서 사용하기 전에 values.yaml에 영구 스토리지, 데이터베이스, 관리자 자격 증명, 액세스 키 암호화 키, ingress/TLS를 설정하세요.
안내에 따라 설정하려면 공식 Semaphore 설치 페이지에서 릴리스를 선택하고 설정을 생성하여 해당 다운로드 또는 실행 명령을 확인하세요.
어떤 설치 방법 을 선택할지 모르겠나요?
| 설치 방법 | 적합한 환경 | 상세 가이드 |
|---|---|---|
| 네이티브 패키지 | 지원되는 Linux 서버 | 패키지 관리자로 설치 |
| Docker Compose | 빠른 격리 환경 구성 또는 컨테이너 호스트 | Docker 설치 |
| 바이너리 압축 파일 | macOS, Windows, FreeBSD 또는 적합한 패키지가 없는 Linux | 바이너리 설치 |
| Helm으로 Kubernetes에 설치 | 기존 Kubernetes 클러스터 | Kubernetes 설치 |
상세 가이드는 프로덕션 데이터베이스, 서비스, 시크릿, 스토리지, ingress, 업그레이드를 다룹니다.
이 Ansible 절차에서는 Semaphore 서버 또는 러너에서 git --version과 ansible-playbook --version이 동작해야 합니다. 명령 중 하나라도 사용할 수 없다면 계속하기 전에 Git과 Ansible을 설치하세요.
2. 로그인하기
- 브라우저에서 Semaphore를 엽니다. 로컬 설치는 일반적으로 http://localhost:3000을 사용합니다.
semaphore setup또는 Docker 관리자 변수로 생성한 관리자 로그인 이름과 암호를 입력합니다.- Sign In을 선택합니다.

초기 설정에는 프로젝트와 사용자를 생성할 수 있는 관리자 계정을 사용합니다. 일반 사용자는 관리자가 계정을 생성하고 프로젝트 접근 권한을 부여한 후 같은 페이지에서 로그인합니다. 사용자 관리를 참조하세요.
3. 프로젝트 생성하기
빈 Semaphore 인스턴스에 로그인하면 New Project 페이지가 자동으로 열립니다. 기존 프로젝트가 있다면 프로젝트 선택기를 열고 **New Project...**를 선택합니다. 양식을 작성합니다.
| 필드 | 입력할 내용 |
|---|---|
| Project Name | Production infrastructure 또는 애플리케이션 이름처럼 쉽게 알아볼 수 있는 작업 공간 이름입니다. |
| Max number of parallel tasks | 선택 사항입니다. 프로젝트의 동시 작업 수를 제한합니다. 비워 두면 서버 제한을 사용합니다. |
| Telegram Chat ID | 선택 사항입니다. 프로젝트에 Telegram 알림이 설정된 경우 사용합니다. |
| Allow alerts for this project | 선택 사항입니다. 설정된 프로젝트 알림을 활성화합니다. |
| Create를 선택합니다. |
Create Demo Project는 선택하지 마세요. 이 옵션은 샘플 리소스를 추가하지만 이 가이드는 빈 프로젝트부터 구성합니다. 나중에 다른 프로젝트를 생성할 때는 같은 옵션이 New Project 대화 상자의 Demo 스위치로 표시됩니다.

새 프로젝트에는 Task Templates, Workflows, Schedule, Inventory, Variable Groups, Key Store, Repositories 섹션이 있습니다. 프로젝트 설정, 팀 접근 권한, 활동, 기록은 프로젝트를 참조하세요.
이 단계 보기

4. 핵심 개념 이해하기
새 프로젝트는 빈 Dashboard로 열립니다. 사이드바가 프로젝트의 기본 탐색 메뉴입니다.

- Dashboard는 실행 기록, 통계, 활동, 프로젝트 설정을 표시합니다.
- Task Templates, Workflows, Schedule는 무엇을 언제 실행할지 정의합니다.
- Repositories, Inventory, Variable Groups, Key Store는 코드, 대상, 변수, 자격 증명을 제공합니다.
- Integrations, Team, Runners는 외부 시스템, 사용자, 실행 호스트를 연결합니다.
다음 다이어그램은 이러한 리소스가 실행으로 이어지는 과정을 보여 줍니다.
UI 동작, API 요청 또는 일정은 Task Template을 직접 시작하거나 작업 템플릿을 사용하는 Workflow를 시작할 수 있습니다. Semaphore는 UI에 Task로 표시되는 작업 실행을 생성하고 Semaphore 서버 또는 조건에 맞는 원격 러너로 보냅니다. Ansible의 경우 해당 실행 호스트가 ansible-playbook을 실행하며, Inventory에는 Ansible이 관리하는 시스템이 나열됩니다.
| 개념 | 역할 |
|---|---|
| Project | 자동화 리소스, 권한, 실행 기록을 포함하는 격리된 작업 공간입니다. |
| Repository | 작업에서 사용하는 자동화 파일이 있는 Git 브랜치 또는 태그를 가리킵니다. |
| Key Store | 재사용 가능한 SSH 키, 로그인 자격 증명, 토큰, Ansible Vault 암호를 Git 및 작업 입력과 별도로 저장합니다. |
| Inventory | 관리할 호스트와 그룹, 사용할 자격 증명을 Ansible에 알려 줍니다. |
| Variable Group | 하나 이상의 템플릿에서 재사용할 Ansible 변수, 환경 변수, 시크릿을 저장합니다. |
| Task Template | 자동화 유형, 파일, 저장소, 인벤토리, 변수, 프롬프트, 실행 옵션 등 실행할 내용을 저장합니다. |
| Task (task run) | 고유한 입력, 상태, 타임스탬프, 로그, 상세 정보, 결과를 가진 한 번의 실행입니다. |
| Workflow | 성공, 실패, 승인, 메모 분기가 있는 여러 단계의 경로로 작업 템플릿을 연결합니다. |
| Schedule | cron 표현식에 따라 작업 템플릿이나 워크플로를 한 번 또는 반복해서 시작합니다. |
| Runner | 다른 네트워크나 보안 영역 등 Semaphore 주 서버 외부에서 대기 중인 작업을 실행합니다. |
5. 저장소 연결하기
Repository는 Semaphore를 Git에 저장된 자동화 코드와 연결합니다. Semaphore 자체에는 플레이북이 저장되지 않습니다. 자신의 저장소를 연결하거나 아래 공개 데모 값을 사용해 예제를 그대로 재현하세요. 통합은 GitHub, GitLab 또는 다른 웹훅 소스에서 자동화를 시작하는 별도 기능입니다.
-
Repositories를 열고 New Repository를 선택합니다.
-
저장소 이름, URL, 브랜치, 자격 증명을 입력합니다. 공개 데모를 사용하는 경우 다음 값을 사용합니다.
필드 값 Name DemoURL or path https://github.com/semaphoreui/semaphore-demo.gitBranch / Tag mainAccess Key 공개 저장소이므로 None -
Create를 선택합니다.

이제 저장소가 목록에 표시됩니다. Semaphore는 Repository 레코드를 생성할 때가 아니라 작업 시작 시 실행 호스트에서 저장소를 복제하거나 업데이트합니다. 스크린샷은 이 가이드에서 사용하는 데모 값을 보여 줍니다.

비공개 저장소에는 None 대신 적절한 Key Store 자격 증명을 선택합니다. 로컬 경로, HTTPS, SSH, 브랜치, 자격 증명, 의존성 파일은 저장소를 참조하세요.
6. 원격 관리 대상 호스트의 SSH 키 추가하기
이 SSH 자격 증명을 사용하면 Ansible이 Semaphore 서버 또는 러너에서 Inventory의 원격 호스트로 연결할 수 있습니다. localhost 데모에는 SSH 키가 필요하지 않습니다. 7단계로 진행하세요.
데모는 localhost와 ansible_connection=local을 사용하므로 SSH 연결을 열지 않습니다. 자신의 플레이북으로 원격 호스트를 관리한다면 해당 키를 추가합니다.
- 키의 공개 부분을 관리 대상 호스트의
~/.ssh/authorized_keys에 추가합니다. - Key Store를 열고 New Key를 선택합니다.
Production hosts처럼 쉽게 알아볼 이름을 입력하고 Local을 선택한 상태로 SSH Key를 선택합니다.ubuntu또는ec2-user처럼 Ansible이 호스트에서 사용할 계정을 입력합니다.BEGIN및END줄을 포함한 전체 개인 키를 붙여 넣고 필요한 경우 암호 구문을 추가합니다.- Create를 선택합니다. 다음 단계에서 Inventory → User Credentials 아래에 이 키를 선택합니다.

스크린샷에는 실제로 작동하는 시크릿이 아닌 자리 표시자가 들어 있습니다. 개인 키를 문서, 스크린샷, 작업 인수 또는 버전 관리에 공개하지 마세요.
Semaphore는 시크릿을 로컬에 저장하거나 HashiCorp Vault, Devolutions Server 같은 외부 시크릿 저장소와 통합할 수 있습니다. 지원되는 모든 자격 증명 유형과 저장 옵션은 키 저장소를 참조하세요.
7. Ansible 인벤토리 생성하기
모든 Ansible 작업에는 인벤토리가 필요합니다. 첫 로컬 실행을 위해 저장소에 inventory.ini 같은 파일을 추가합니다.
[local]
localhost ansible_connection=local
여기서 localhost는 Semaphore 서버, 컨테이너 또는 러너인 실행 호스트를 뜻하며, 브라우저가 열린 컴퓨터와 같지 않을 수 있습니다. ansible_connection=local은 Ansible에 SSH를 사용하지 않도록 지시합니다. 데모 저장소는 site 그룹이 있는 동등한 파일 invs/prod/hosts를 사용합니다.
자신의 저장소에 inventory.ini을 만들었다면 계속하기 전에 Semaphore에 연결한 브랜치로 커밋하고 푸시하세요.
-
Inventory를 열고 New Inventory → Ansible Inventory를 선택합니다.
-
인벤토리에 맞는 값을 입력합니다. 예:
필드 값 Name Local(데모에서는Prod)User Credentials localhost에는None, 원격 인벤토리에는 호스트의 SSH 자격 증명 사용Type FilePath to Inventory file inventory.ini(데모에서는invs/prod/hosts) -
Runner tag, Sudo Credentials, Repository를 비워 둔 뒤 Create를 선택합니다.

Repository를 비워 두면 Semaphore는 작업 템플릿에서 선택한 저장소를 기준으로 인벤토리의 상대 경로를 확인합니다. 인벤토리가 다른 곳에 있을 때만 여기서 저장소를 선택합니다. 원격 호스트에는 6단계의 SSH 키를 User Credentials로 사용하세요.
정적, 파일 기반, 동적 인벤토리는 인벤토리를 참조하세요.
8. 변수 그룹 추가하기(선택 사항)
Variable Group은 하나 이상의 작업 템플릿에 연결할 수 있는 재사용 가능한 값 모음입니다. Ansible 변수에는 Extra variables, 프로세스로 내보낼 값에는 Environment variables, 암호화하고 마스킹할 민감한 값에는 Secrets를 사용합니다. 이렇게 하면 환경별 설정을 플레이북 밖에 두고 각 템플릿에 같은 값을 반복 입력하지 않아도 됩니다.
첫 작업은 변수 그룹 없이도 실행됩니다. 예제로 ansible_python_interpreter=auto_silent을 설정하는 그룹을 만듭니다. Ansible은 여전히 Python을 자동으로 찾지만 발견 과정에 관한 안내 경고를 출력하지 않습니다.
-
Variable Groups를 열고 New Group을 선택합니다.
-
Group Name에
Ansible defaults처럼 설명적인 이름을 지정합니다. -
Variables → Extra variables에서 Table을 선택한 상태로 **+**를 선택합니다.
-
다음을 입력합니다.
이름 유형 값 ansible_python_interpreterStringauto_silent -
Save를 선택합니다.

우선순위 규칙과 시크릿 저장 옵션은 변수 그룹을 참조하세요.