在 Docker 容器中运行 Semaphore Ansible Web UI
Semaphore是一个开源工具,它提供了一个漂亮的 Web 界面来运行 ansible playbook。这个用 Go 语言编写的工具可以安装在 Windows、Linux(x64、ARM、ARM64)和 macOS 系统上。当您的项目增长并且您不需要从命令行部署它时,此工具会派上用场。
与 Semaphore Ansible Web UI 相关的惊人功能是:
- Pure Go允许为多个平台交叉编译它。这是 DevOps 首选它的主要原因。
- 它允许一个人按计划运行剧本
- 随时查看任何运行的详细日志
- 将剧本分组到项目
- 轻松管理环境、库存、存储库和访问密钥。
- 如果需要,您可以从浏览器使用它来构建、部署和回滚。
- 获取有关剧本运行的通知
- 它允许一个授予其他用户运行剧本的权限
除了上述特性,Semaphore 还支持 MySQL、PostgreSQL 和 BoltDB。可以通过多种方式安装和使用 Semaphore Ansible Web UI。这些包括使用 Snap、包管理器、二进制文件等
本文深入说明了如何在 Docker 容器中运行 Semaphore Ansible Web UI。
开始之前准备
本文内容要求同时安装 Docker 引擎和 docker-compose。可以使用以下指南中的帮助将 Docker 安装在 Linux 系统上。
安装 Docker 引擎后,使用以下命令将您的系统用户添加到 Docker 组:
sudo usermod -aG docker $USER newgrp docker
使用专用指南继续安装 Docker-compose:
验证安装
$ docker-compose version Docker Compose version v2.4.1
现在启动并启用 docker 在系统启动时运行。
sudo systemctl start docker && sudo systemctl enable docker
第 1 步 – 提供Semaphore容器
容器将包含两个部分,即
- 数据库 – (MySQL) 用于数据存储
- Ansible Semaphore(最新图片)
使用以下命令创建 docker-compose 文件:
mkdir semaphore && cd semaphore vim docker-compose.yml
将以下行添加到文件中,在需要的地方替换变量。
version: '2' services: mysql: ports: - 3306:3306 image: mysql:5.6 container_name: mysql hostname: mysql environment: MYSQL_RANDOM_ROOT_PASSWORD: 'yes' MYSQL_DATABASE: semaphore_db MYSQL_USER: semaphore_user MYSQL_PASSWORD: StrongPassw0rd semaphore: ports: - 3000:3000 image: ansiblesemaphore/semaphore:latest container_name: semaphore environment: SEMAPHORE_DB_USER: semaphore_user SEMAPHORE_DB_PASS: StrongPassw0rd SEMAPHORE_DB_HOST: mysql SEMAPHORE_DB_PORT: 3306 SEMAPHORE_DB: semaphore_db SEMAPHORE_PLAYBOOK_PATH: /tmp/semaphore/ SEMAPHORE_ADMIN_PASSWORD: AdminPassword SEMAPHORE_ADMIN_NAME: admin SEMAPHORE_ADMIN_EMAIL: admin@computingforgeeks.com SEMAPHORE_ADMIN: admin SEMAPHORE_ACCESS_KEY_ENCRYPTION: MflCLIUF5bn6Lgkuwy4BoAdIFhoZ4Ief2oocXmuZSjs= depends_on: - mysql
在文件中,替换:
- MYSQL_USER和SEMAPHORE_DB_USER与所需的数据库用户。
- MYSQL_PASSWORD和SEMAPHORE_DB_PASS以及用户的数据库密码
- SEMAPHORE_ADMIN_PASSWORD与 Semaphore Ansible Web UI 的管理员用户的密码
- SEMAPHORE_ACCESS_KEY_ENCRYPTION使用密钥来加密数据库中的访问密钥。可以使用以下命令生成此密钥加密:
$ head -c32 /dev/urandom | base64 MflCLIUF5bn6Lgkuwy4BoAdIFhoZ4Ief2oocXmuZSjs=
第 2 步 – 在 Docker 容器中运行 Semaphore Ansible Web UI
现在配置好容器后,我们可以使用以下命令运行 Semaphore:
docker-compose up -d
执行输出:
[+] Running 19/19 ⠿ semaphore Pulled 21.2s ⠿ 4e9f2cdf4387 Pull complete 0.9s ⠿ 8eba5c7ef78e Pull complete 1.3s ⠿ 4b2e0cc6dd21 Pull complete 18.3s ⠿ 5d4e24327603 Pull complete 18.4s ⠿ b53de92b8d36 Pull complete 18.9s ⠿ 8ada155f2bd8 Pull complete 19.2s ⠿ mysql Pulled 19.0s ⠿ 35b2232c987e Pull complete 5.1s ⠿ fc55c00e48f2 Pull complete 5.5s ⠿ 0030405130e3 Pull complete 6.2s ⠿ e1fef7f6a8d1 Pull complete 6.9s ⠿ 1c76272398bb Pull complete 7.6s ⠿ f57e698171b6 Pull complete 9.4s ⠿ f5b825b269c0 Pull complete 9.8s ⠿ dcb0af686073 Pull complete 10.4s ⠿ 27bbfeb886d1 Pull complete 15.6s ⠿ 6f70cc868145 Pull complete 15.9s ⠿ 1f6637f4600d Pull complete 16.3s [+] Running 3/3 ⠿ Network semaphore_default Created 0.3s ⠿ Container semaphore-mysql-1 Started 1.6s ⠿ Container semaphore-semaphore-1 Started
验证容器是否在暴露服务的情况下运行。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ea51aeb59791 ansiblesemaphore/semaphore:latest "/sbin/tini -- /usr/…" 17 seconds ago Up 15 seconds 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp semaphore abf873ba28c2 mysql:5.6 "docker-entrypoint.s…" 18 seconds ago Up 16 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp mysql
第 3 步 – 使用 SSL 证书保护 Semaphore Ansible Web UI
本指南演示了如何使用 Let's Encrypt 和自签名证书保护 Semaphore Ansible Web UI。
首先安装 Nginx Web 服务器。
##On RHEL/CentOS/Rocky Linux 8 sudo yum install nginx ##On Debian/Ubuntu sudo apt install nginx
继续并为 Semaphore 创建虚拟主机文件。
sudo vim /etc/nginx/conf.d/semaphore.conf
在打开的文件中,添加以下行:
upstream semaphore { server 127.0.0.1:3000; } server { listen 80; server_name semaphore.example.com; client_max_body_size 0; chunked_transfer_encoding on; location / { proxy_pass http://semaphore/; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_buffering off; proxy_request_buffering off; } location /api/ws { proxy_pass http://semaphore/api/ws; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Origin ""; } }
保存文件并继续生成 SSL 证书。
1、使用 Let's Encrypt SSL 保护 Semaphore Ansible Web UI
Let's Encrypt 用于免费向域名颁发受信任的 SSL 证书。为了能够生成 SSL 证书,请安装所需的软件包。
##On RHEL 8/CentOS 8/Rocky Linux 8/Fedora sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm sudo dnf install certbot python3-certbot-nginx ##On Debian/Ubuntu sudo apt install certbot python3-certbot-nginx
使用以下命令颁发 SSL 证书:
sudo certbot --nginx
进行如下:
Saving debug log to /var/log/letsencrypt/letsencrypt.log Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): Enter a valid Email address here - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must agree in order to register with the ACME server. Do you agree? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: y - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Would you be willing, once your first certificate is successfully issued, to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: y Account registered. Which names would you like to activate HTTPS for? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: semaphore.example.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate numbers separated by commas and/or spaces, or leave input blank to select all options shown (Enter 'c' to cancel): 1 Requesting a certificate for semaphore.example.com Performing the following challenges: http-01 challenge for semaphore.example.com .... Successfully received certificate. Certificate is saved at: a2enmod ssl
就是这样,你将把你的证书添加到你的 Nginx 配置文件中。
2、使用自签名证书保护 Semaphore Ansible Web UI。
如果您没有 FQDN,您可以为您的域名/IP 地址生成自签名证书,如下所示。
创建一个用于生成证书的配置文件。
$ vim semaphore_ssl.conf [req] default_bits = 2048 default_keyfile = semaphore_ssl.key distinguished_name = req_distinguished_name req_extensions = req_ext x509_extensions = v3_ca [req_distinguished_name] countryName = Country Name (2 letter code) countryName_default = KE stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = Nairobi localityName = Locality Name (eg, city) localityName_default = Nairobi organizationName = Organization Name (eg, company) organizationName_default = Computingforgeeks organizationalUnitName = organizationalunit organizationalUnitName_default = Development commonName = Common Name (e.g. server FQDN or YOUR name) commonName_default = Your_IP-Address commonName_max = 64 [req_ext] subjectAltName = @alt_names [v3_ca] subjectAltName = @alt_names [alt_names] DNS.1 = localhost DNS.2 = Your_IP-Address
使用 OpenSSL 生成 SSL 证书,如下所示:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout semaphore_ssl.key -out semaphore_ssl.crt -config semaphore_ssl.conf
按回车键到最后,您将生成一个 SSL 证书对。将证书复制到/etc/ssl/certs目录。
sudo cp semaphore_ssl.crt /etc/ssl/certs/semaphore_ssl.crt sudo mkdir -p /etc/ssl/private/ sudo cp semaphore_ssl.key /etc/ssl/private/semaphore_ssl.key
现在编辑您的 Nginx 配置文件,如下所示。
sudo vim /etc/nginx/conf.d/semaphore.conf
对文件进行以下更改。
upstream semaphore { server 127.0.0.1:3000; } server { server_name semaphore.example.com; client_max_body_size 0; chunked_transfer_encoding on; location / { proxy_pass http://semaphore/; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_buffering off; proxy_request_buffering off; } location /api/ws { proxy_pass http://semaphore/api/ws; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Origin ""; } listen 443 ssl; # managed by Certbot ssl_certificate /etc/ssl/certs/semaphore_ssl.crt; ssl_certificate_key /etc/ssl/private/semaphore_ssl.key; } server { if ($host = semaphore.example.com) { return 301 https://$host$request_uri; } listen 80; server_name semaphore.example.com; return 404; }
保存文件并重启 Nginx。
sudo systemctl restart nginx
第 4 步 – 访问 Semaphore Ansible Web UI
此时,您将可以通过 HTTPS 访问 Semaphore。允许 HTTP 和 HTTPS 通过防火墙。
##For Firewalld sudo firewall-cmd --add-service=http --permanent sudo firewall-cmd --add-service=https --permanent sudo firewall-cmd --reload ##For UFW sudo ufw allow http sudo ufw allow https
现在继续并使用 URL https://doamin_name访问 Semaphore Ansible Web UI

使用创建的管理员用户和密码登录。继续并创建一个项目。

创建项目后,仪表板将被授予如下。

创建任务模板。模板用于定义 ansible 将如何运行 playbook 。创建新模板需要提供:
- Inventory
- Playbook filename
- Playbook repository
- Environment
- Vault password file
- Extra CLI arguments e.t.c
任务模板可以是:
- 任务
- 建造
- 部署
任务只是运行指定的剧本。

构建模板用于创建工件。在这里,您需要指定工件的起始版本。

部署模板现在将工件部署到服务器。这通常与构建模板相关联。

第 5 步 – 管理容器
在本指南中,我们有两个容器可以使用下面的 docker start 和 stop 命令进行管理:
##To stop docker stop semaphore docker stop mysql ##To start docker start semaphore docker start mysql ##To delete docker rm semaphore docker rm mysql
这些容器可以作为系统服务进行管理。为了能够实现这一点,我们将为每个容器创建服务文件。
For MYSQL
$ sudo vim /etc/systemd/system/mysql_container.service [Unit] Description=MySQL container [Service] Restart=always ExecStart=/usr/bin/docker start -a mysql ExecStop=/usr/bin/docker stop -t 2 mysql [Install] WantedBy=local.target
For Semaphore
$ sudo vim /etc/systemd/system/semaphore_container.service [Unit] Description=Semaphore container [Service] Restart=always ExecStart=/usr/bin/docker start -a semaphore ExecStop=/usr/bin/docker stop -t 2 semaphore [Install] WantedBy=local.target
重新加载系统守护程序。
sudo systemctl daemon-reload
启动并启用容器服务以在启动时运行。
##For MySQL sudo systemctl start mysql_container sudo systemctl enable mysql_container ##For Semaphore sudo systemctl start semaphore_container sudo systemctl enable semaphore_container
检查服务状态:
$ systemctl status mysql_container semaphore_container ● mysql_container.service - MySQL container Loaded: loaded (/etc/systemd/system/mysql_container.service; enabled; vendor preset: disabled) Active: active (running) since Thu 2022-04-28 10:48:47 EDT; 1min 11s ago Main PID: 8906 (docker) Tasks: 5 (limit: 23682) Memory: 38.7M CGroup: /system.slice/mysql_container.service └─8906 /usr/bin/docker start -a mysql ● semaphore_container.service - Semaphore container Loaded: loaded (/etc/systemd/system/semaphore_container.service; enabled; vendor preset: disabled) Active: active (running) since Thu 2022-04-28 10:49:09 EDT; 49s ago Main PID: 8957 (docker) Tasks: 6 (limit: 23682) Memory: 19.4M CGroup: /system.slice/semaphore_container.service └─8957 /usr/bin/docker start -a semaphore
现在,您可以使用Semaphore Ansible Web UI 轻松部署应用程序/服务。