在 Docker 容器中运行 Semaphore Ansible Web UI

2022年 10月 14日 69.5k 0

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

在 Docker 容器中运行 Semaphore Ansible Web UI

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

在 Docker 容器中运行 Semaphore Ansible Web UI

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

在 Docker 容器中运行 Semaphore Ansible Web UI

创建任务模板。模板用于定义 ansible 将如何运行 playbook 。创建新模板需要提供:

  • Inventory
  • Playbook filename
  • Playbook repository
  • Environment
  • Vault password file
  • Extra CLI arguments e.t.c

任务模板可以是:

  • 任务
  • 建造
  • 部署

任务只是运行指定的剧本。

在 Docker 容器中运行 Semaphore Ansible Web UI

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

在 Docker 容器中运行 Semaphore Ansible Web UI

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

在 Docker 容器中运行 Semaphore Ansible Web UI

第 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 轻松部署应用程序/服务。

相关文章

KubeSphere 部署向量数据库 Milvus 实战指南
探索 Kubernetes 持久化存储之 Longhorn 初窥门径
征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
那些年在 Terraform 上吃到的糖和踩过的坑
无需 Kubernetes 测试 Kubernetes 网络实现
Kubernetes v1.31 中的移除和主要变更

发布评论