El Psy Congroo

利用Docker搭建Semaphore测试环境

关于Semaphore

Semaphore是Ansible Tower的开源替代产品,提供了前端页面用于管理主机、变量以及运行Playbook,同时也支持API调用。

系统环境

  • OS X 10.11.5
  • Docker 1.13.0

依赖项

  • MySQL >= 5.6.4/MariaDB >= 5.3
  • ansible in $PATH
  • git >= 2.x in $PATH

准备MySql

  • 启动MySql
    由于Mac系统限制,无法直接访问容器,需要在启动时将容器端口映射到本机。

    1
    2
    3
    docker run --name mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin \
    --volume=/Users/hellfires/workspace/docker/volumes/mysql:/var/lib/mysql \
    mysql:5.7
  • 新建数据库及用户

    1
    2
    CREATE DATABASE semaphore;
    GRANT ALL PRIVILEGES ON semaphore.* TO 'semaphore'@'%' IDENTIFIED BY 'abc123';

准备Semaphore镜像

  • clone项目

    1
    git clone https://github.com/ansible-semaphore/semaphore
  • 下载编译好的Semaphore程序包,build时下载不走代理会比较慢

    1
    curl -L https://github.com/ansible-semaphore/semaphore/releases/download/v2.1.0/semaphore_linux_amd64
  • 修改Dockerfile
    项目本身就包含了Dockerfile,方便我们搭建Docker镜像。简单修改下Dockerfile,增加阿里云alpine镜像,加块build速度

    1
    2
    3
    4
    5
    +RUN echo http://mirrors.aliyun.com/alpine/latest-stable/main/ > /etc/apk/repositories
    -RUN curl -L https://github.com/ansible-semaphore/semaphore/releases/download/v2.1.0/semaphore_linux_amd64 > /usr/bin/semaphore && chmod +x /usr/bin/semaphore && mkdir -p /etc/semaphore/playbooks
    +ADD semaphore_linux_amd64 /usr/bin/semaphore
    +RUN chmod +x /usr/bin/semaphore && mkdir -p /etc/semaphore/playbooks
  • build镜像

    1
    docker build -t semaphore .
  • 创建playbook仓库
    semaphore通过git来访问playbook仓库,可以使用github来存储,方便起见我们在本地init一个git仓库

    1
    git init /Users/hellfires/workspace/docker/volumes/semaphore/playbook_repo

运行Semaphore

1
2
3
4
5
6
7
8
9
10
11
12
13
14
docker run -p 3000:3000 --name semaphore \
-e SEMAPHORE_DB=semaphore \
-e SEMAPHORE_DB_HOST=172.17.0.1 \
-e SEMAPHORE_DB_PORT=3306 \
-e SEMAPHORE_DB_USER=semaphore \
-e SEMAPHORE_DB_PASS=abc123 \
-e SEMAPHORE_PLAYBOOK_PATH=/etc/semaphore \
-e SEMAPHORE_ADMIN=admin \
-e SEMAPHORE_ADMIN_NAME=admin \
-e SEMAPHORE_ADMIN_EMAIL=admin@admin.local \
-e SEMAPHORE_ADMIN_PASSWORD=admin \
-e ANSIBLE_HOST_KEY_CHECKING=False \
--volume=/Users/hellfires/workspace/docker/volumes/semaphore/playbook_repo:/etc/playbook_repo \
semaphore

其中ANSIBLE_HOST_KEY_CHECKING=False用于禁用host key checking,避免当目标主机不在known_hosts中时跳出提示,干扰playbook执行。

但是Semaphore执行playbook时不会继承这个环境变量,只能通过修改ansible配置文件方式来实现。
需要在/etc/ansible/ansible.cfg增加如下配置

1
2
[defaults]
host_key_checking = False

首次使用Semaphore

  • 进入dashboard页面,新建project,点击新建的project进入项目主页面
  • 进入Key Store页面,新建SSH Key,填入公钥及私钥,用于访问目标服务器或登录git
  • 进入Playbook Repositories页面,新建repository,如果是远程仓库,需要指定对应的SSH Key,注意远程仓库不支持https协议访问(因为访问时需要输入密码)。本地仓库直接填目录即可,如file:///etc/playbook_repo,SSH Key随便填。
  • 进入Inventory页面,新建inventory,类型static,选择可用于访问inventory内目标服务器的SSH Key,编辑inventory内容,增加服务器地址
  • 进入Environment页面,增加playbook中使用到的变量,没有可以留空
  • 进入Task Templates页面,新建template,用于执行指定的playbook
  • 点击run,一切顺利的话就可以看到输出结果了,不顺利的话,看看Semaphore代码吧

存在的问题

通过Semaphore我们可以在页面上完成所有的配置及运行工作,提升了ansible的易用性,尤其对于非开发人员(例如测试)来说。但是当我们的环境和服务器数量较多时,相对于ansible最佳实践中推荐的Convention over configuration方式的配置文件结构,Semaphore扁平式的配置管理方式(包括Environment和Inventory)貌似会给配置带来很多麻烦,这块我们会在后续实践中继续探索。