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
|
対話型セットアップの実行例は以下の通りです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114 | # 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 つのファイルを新規作成します。
/etc/default/semaphore
/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
は以下の内容で新規作成します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | [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_hosts
に SSH の Fingerprint が登録されていない状態で semaphore から Playbook を実行すると以下のようなエラーになりました。
UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Host key verification failed.\r\n", "unreachable": true}
これを回避するには以下、いずれかの回避策があります。
- semaphore がインストールされているホストから Playbook 実行先となるサーバに対して SSH ログインしておく(=
know_hosts
に Fingerprint を事前登録しておく)
~/.ssh/config
に StrictHostKeyChecking 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
|