らくがきちょう

なんとなく

CentOS 7.4 に ansible-tower ライクな OSS「semaphore」の v2.4.1 をインストールする

以前に CentOS7 に Ansible UI である semaphore をインストールするというメモを書きました。 改めて、最新の v2.4.1 ベースでインストール手順をメモしておきます。

Ansible のインストール

最新版の Ansible (現時点では 2.4.0.0) をインストールします。 yum リポジトリ上の Ansible は古い (現時点では 2.3.2.0) 為、Ansible は pip でインストールします。

yum -y install gcc python-devel
curl -L https://bootstrap.pypa.io/get-pip.py | python
pip install ansible

MariaDB のインストール

semaphore のバックエンドとなる MariaDB をインストールします。 まず GPG-KEY をインストールしておきます。

rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

MariaDBリポジトリを定義します。 以下の内容で /etc/yum.repos.d/mariadb.repo というファイルを新規作成します。

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.3.1/centos73-amd64/
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

インストールします。

yum -y install MariaDB-client MariaDB-server

起動&自動起動の設定を行います。

systemctl enable mariadb.service
systemctl start mariadb.service

MariaDB の初期設定

mysql_secure_installation で初期設定を行い、不要なデータベースや anonymous ユーザを削除しておきます。

mysql_secure_installation

MariaDB 上にデータベースやユーザを作成します。

mysql -u root
CREATE DATABASE semaphore;
CREATE USER 'semaphore'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON semaphore.* TO 'semaphore'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
quit

semaphore のインストール

semaphore をインストールします。 Playbook の保存用ディレクトリとして /opt/semaphore を作成します。 インストールが完了したら semaphore -setup を実行して対話型セットアップを開始します。

wget https://github.com/ansible-semaphore/semaphore/releases/download/v2.4.1/semaphore_linux_amd64
mv semaphore_linux_amd64 /usr/bin/semaphore
chmod a+x /usr/bin/semaphore
mkdir /opt/semaphore
semaphore -setup

対話型セットアップの実行例は以下の通りです。

# semaphore -setup

 Hello! You will now be guided through a setup to:

 1. Set up configuration for a MySQL/MariaDB database
 2. Set up a path for your playbooks (auto-created)
 3. Run database Migrations
 4. Set up initial semaphore user & password

 > DB Hostname (default 127.0.0.1:3306):
 > DB User (default root): semaphore
 > DB Password: password
 > DB Name (default semaphore): semaphore
 > Playbook path: /opt/semaphore
 > Web root URL (optional, example http://localhost:8010/):
 > Enable email alerts (y/n, default n):
 > Enable telegram alerts (y/n, default n):
 > Enable LDAP authentication (y/n, default n):

 Generated configuration:
 {
        "mysql": {
                "host": "127.0.0.1:3306",
                "user": "semaphore",
                "pass": "password",
                "name": "semaphore"
        },
        "port": "",
        "tmp_path": "/opt/semaphore",
        "cookie_hash": "jadZ3yUEK8TIP9lBcLCOEBDSUmLD1c0dzuScEkqeImw=",
        "cookie_encryption": "aLBHb1IuRXTX5xc8T+NkdJKswkYEI6WgAU7JX4p42bg=",
        "email_alert": false,
        "email_sender": "",
        "email_host": "",
        "email_port": "",
        "web_host": "",
        "ldap_enable": false,
        "ldap_binddn": "",
        "ldap_bindpassword": "",
        "ldap_server": "",
        "ldap_needtls": false,
        "ldap_searchdn": "",
        "ldap_searchfilter": "",
        "ldap_mappings": {
                "dn": "",
                "mail": "",
                "uid": "",
                "cn": ""
        },
        "telegram_alert": false,
        "telegram_chat": "",
        "telegram_token": ""
 }

 > Is this correct? (yes/no): yes
 Running: mkdir -p /opt/semaphore..
 Configuration written to /opt/semaphore/semaphore_config.json..
 Pinging db..

 Running DB Migrations..
Checking DB migrations
Creating migrations table
Executing migration v0.0.0 (at 2017-09-25 00:06:42.518437548 +0900 JST)...
 [11/11]
Executing migration v1.0.0 (at 2017-09-25 00:06:42.576455401 +0900 JST)...
 [7/7]
Executing migration v1.1.0 (at 2017-09-25 00:06:42.646278415 +0900 JST)...
 [1/1]
Executing migration v1.2.0 (at 2017-09-25 00:06:42.660816698 +0900 JST)...
 [1/1]
Executing migration v1.3.0 (at 2017-09-25 00:06:42.667189388 +0900 JST)...
 [3/3]
Executing migration v1.4.0 (at 2017-09-25 00:06:42.695911562 +0900 JST)...
 [2/2]
Executing migration v1.5.0 (at 2017-09-25 00:06:42.711948728 +0900 JST)...
 [1/1]
Executing migration v0.1.0 (at 2017-09-25 00:06:42.718341897 +0900 JST)...
 [6/6]
Executing migration v1.6.0 (at 2017-09-25 00:06:42.735815217 +0900 JST)...
 [4/4]
Executing migration v1.7.0 (at 2017-09-25 00:06:42.771718351 +0900 JST)...
 [1/1]
Executing migration v1.8.0 (at 2017-09-25 00:06:42.782333325 +0900 JST)...
 [2/2]
Executing migration v1.9.0 (at 2017-09-25 00:06:42.792189647 +0900 JST)...
 [2/2]
Executing migration v2.2.1 (at 2017-09-25 00:06:42.80456408 +0900 JST)...
 [2/2]
Executing migration v2.3.0 (at 2017-09-25 00:06:42.820041881 +0900 JST)...
 [3/3]
Executing migration v2.3.1 (at 2017-09-25 00:06:42.841636191 +0900 JST)...
 [1/1]
Executing migration v2.3.2 (at 2017-09-25 00:06:42.843945639 +0900 JST)...
 [1/1]
Executing migration v2.4.0 (at 2017-09-25 00:06:42.850874853 +0900 JST)...
 [1/1]
Migrations Finished


 > Username: semaphore
 > Email:
 > Your name: semaphore
 > Password: password

 You are all setup semaphore!
 Re-launch this program pointing to the configuration file

./semaphore -config /opt/semaphore/semaphore_config.json

 To run as daemon:

nohup ./semaphore -config /opt/semaphore/semaphore_config.json &

 You can login with  or semaphore.

semaphore を起動する

これで semaphore の設定は完了です。 CLI から、または systemd に登録して起動します。

CLI から起動する

フォアグラウンドで semaphore を起動するのであれば、以下のように実行します。

/usr/bin/semaphore -config /opt/semaphore/semaphore_config.json

デーモンとして、バックグラウンドとして semaphore を起動するのであれば、以下のように実行します。

nohup /usr/bin/semaphore -config /opt/semaphore/semaphore_config.json &

デフォルトで semaphore は 3000/TCP を Listen します。

# lsof -i:3000
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
semaphore 1670 root    6u  IPv6  22878      0t0  TCP *:hbci (LISTEN)

systemd に登録する

systemd に登録する場合は以下、2 つのファイルを新規作成します。

  1. /etc/default/semaphore
  2. /etc/systemd/system/semaphore.service

/etc/default/semaphore は以下の内容で新規作成します。

SEMAPHORE_CONFIG=/opt/semaphore/semaphore_config.json
SEMAPHORE_LOGS=/var/log/semaphore.log

/etc/systemd/system/semaphore.service は以下の内容で新規作成します。

[Unit]
Description=Ansible Semaphore
After=syslog.service
Requires=network.target

[Service]
Type=forking
EnvironmentFile=-/etc/default/semaphore
ExecStart=/bin/sh -c "/usr/bin/semaphore -config ${SEMAPHORE_CONFIG} >> ${SEMAPHORE_LOGS} 2>&1 &"
Restart=always
RestartSec=10s

[Install]
WantedBy=multi-user.target

これで systemd への登録は完了です。 起動&自動起動設定を行います。

systemctl enable semaphore
systemctl start semaphore

Tips

以下、Tips です。

SSH Fingerprint について

known_hostsSSH の Fingerprint が登録されていない状態で semaphore から Playbook を実行すると以下のようなエラーになりました。

UNREACHABLE! => {“changed”: false, “msg”: “Failed to connect to the host via ssh: Host key verification failed.\r\n”, “unreachable”: true}

これを回避するには以下、いずれかの回避策があります。

  1. semaphore がインストールされているホストから Playbook 実行先となるサーバに対して SSH ログインしておく(=know_hosts に Fingerprint を事前登録しておく)
  2. ~/.ssh/configStrictHostKeyChecking no を定義しておく

後者の回避策を取る場合、~/.ssh/config には以下のように定義します。

Host *
  StrictHostKeyChecking no

Playbook 実行時の SSH ログインユーザ

Plyabook 実行時、SSH ログインするユーザは semaphore の実行ユーザが用いられるようです(たぶん…)。 Task Templates から Playbook (Task) を実行する際、Debug Option を有効にすると詳細が分かると思います。 従って、Ansible を実行される側のサーバにも semaphore を実行しているユーザと同じ名前のユーザを作成しておく必要がある… のかも知れません( この辺りは、かなり自信がありません… )

パスワード認証等、対話的な操作は出来ない…?

パスワード認証等が出来ないか?を試してみたのですが、やり方が分かりませんでした…

テスト用 Playbook

今回は以下の Playbook を用意してテストしました。

---
- hosts: all
  tasks:
    - name: Install nmap
      yum: name=nmap