はじめに
GCLB配下のGCEにRUNDECKをインストールしましたが、GCLB配下に置いたときにhttpにリダイレクトされるようになって地味にハマった。。。
- 今回作成した環境は全てGCP(GCE)のCentOS7で作成しています。
- ロードバランサはGCLBを使用してます
- RUNDECKのバージョンは3.0.8の場合で記載してます。
RUNDECKってそもそも何?
- OSSのジョブ管理ツール。
- WebのGUIでもAPIでも使える。
- 定期実行やワークフローによる制御も可能。
- コマンドやshellをRUNDECKから実行することが出来る。
- Ansibleと同じで、sshで接続するだけなので、エージェントのインストールが不要。
- Apache-2.0ライセンスのため、商用利用可。
- Githubで2500以上のスターがついている。(スターの数は信頼の数w)
- Community版と有料版(Enterprise)がある
- Pluginが豊富で、Slack通知のプラグインや、Kubernetesプラグイン、vaultプラグイン、Ansibleプラグインなど、様々なプラグインがある。
- Javaで出来ている
- デフォルトはH2Databaseにデータを保存しているが、冗長構成をとるためにMySQL、SQLServer,Oracle,Postgresとかにすることも可能
- アカウント・権限(ACL)の管理も可能
期待出来ること
- CronJobピタゴラスイッチが無くなる
- Job内でスクリプトやコマンドを直列、並列、シーケンシャルで実施するか等のワークフローを定義できる。
- どこで何のCronが動いてるか分からない問題が無くなる
- 一元管理出来るので、呼び元がよく分からないCronとかが無くなり、見通しが非常に良くなる。
- いつの間にかにバックアップ止まってるやん・・・が無くなる
- Jobのスタート時、完了時、エラー発生時などそれぞれ任意のタイミングでメールやSlackに通知することが出来る。
インストール
以下のドキュメントを参照。
https://rundeck.org/docs/administration/install/centosredhat.html
Rundeck本体のインストール
$ sudo yum install -y java
$ sudo rpm -Uvh http://repo.rundeck.org/latest.rpm
$ sudo yum install -y rundeck
$ sudo systemctl start rundeckd
以下の設定を入れないと、ログイン後にlocalhostにリダイレクトされる洗礼をうける。
$ sudo vi /etc/rundeck/rundeck-config.properties
#grails.serverURL=http://localhost:4440
grails.serverURL=http://YOUR_IP:4440
$ sudo systemctl restart rundeckd
GCLB配下におくための設定
今どき平文で通信とか無いと思うので、https対応を行う。
今回はGCPのGCLBを使用して作成。
以下の設定を入れないと、ログイン後にhttpにリダイレクトされる洗礼をうける。
詳細は、https://rundeck.org/docs/administration/security/configuring-ssl.html を参照。
$ vi /etc/rundeck/rundeck-config.properties
server.useForwardHeaders=true #←これを追加する
$ sudo systemctl restart rundeckd
Slack通知プラグインの導入
https://api.slack.com/apps にてAppを作っておく必要がある
$ curl -O https://github.com/rundeck-plugins/slack-incoming-webhook-plugin/releases/download/v1.2.2/slack-incoming-webhook-plugin-1.2.2.jar
$ cp ./slack-incoming-webhook-plugin-1.2.2.jar /var/lib/rundeck/libext/
ここで非常に重要なのが、Fork元に記載されている↓をやること。
プロジェクト作成後にこれをやらなかったら、Slackの項目が出てこなかった。
そもそもList Pluginsに出てこなかったので、読み込みすらされてなさそうだった。
WebHook URL: Slack incoming-webhook URL. Must be set at the project (or global rundeck level) by editing the project properties file, either by going to YOUR PROJECT > Project Settings > Edit Configuration > Edit Configuration File and adding the webhook URL as show below:
RUNDECKのログイン
デフォルトは admin/admin
後述するが、/etc/rundeck/realm.properties
にアカウントの設定が記載されている
PROJECTの作成
左ペインのPROJECTSから + New Project
Project Nameだけ入力して、あとはデフォルト。
デフォルトで使用されるsshキーは /var/lib/rundeck/.ssh/id_rsa
にあるキーが使用される
NODES追加
プロジェクトを作っただけだと、以下の様にlocalhostしかない。
そのため、リモートのNodeを操作したい場合はNodeを追加する必要がある。
このNode追加がなぜかGUIじゃ出来ない。
意味が分からない。
rundeckの設定ファイルをゴニョゴニョしないといけない。
project.propertiesの設定
詳しくは以下に載っている
https://rundeck.org/docs/administration/configuration/configuration-file-reference.html#project.properties
vi /var/rundeck/projects/test-project/etc/project.properties
# 以下を追加
resources.source.1.type=file
resources.source.1.config.file=/var/rundeck/projects/test-project/etc/resources.xml # ← `test-project`は適宜変更
resources.source.1.config.generateFileAutomatically=true
resources.source.1.config.includeServerNode=true
resources.xmlの設定
上記で定義したresource.xmlファイルを新規で作成する
https://rundeck.org/docs/man5/resource-xml.html
vi /var/rundeck/projects/test-project/etc/resources.xml
<?xml version="1.0" encoding="UTF-8"?>
<project>
<node name="rundeck-test" type="Node"
description="test"
hostname="130.211.XXX.XXX"
username="rundeck" tags="test,nginx"
/>
<!-- 複数ある場合は上記のnodeを追加していく -->
</project>
再起動する必要なく、動的に以下が追加されている
ユーザー追加
このユーザー追加もなぜかGUIじゃ出来ない。
意味が分からない。
Node追加同様、rundeckの設定ファイルをゴニョゴニョしないといけない。
https://rundeck.org/docs/administration/configuration/configuration-file-reference.html#realm.properties
https://rundeck.org/docs/administration/security/authenticating-users.html#propertyfileloginmodule
特定のプロジェクトをいじれるユーザーを作成する
今回は test-project
の全権限があるユーザーを作成する
vi /etc/rundeck/realm.properties
testadmin:testadmin,user # ←これを追加
ACLを設定する
https://rundeck.org/docs/man5/aclpolicy.html
contextには以下の2つがある。
- project :ポリシーが適用されるプロジェクトの名前を宣言。その値は文字列であり、正規表現にすることができる。この正規表現には、プロジェクト名が一致する必要がある。
- application : アプリケーションセクションを宣言。サポートされる唯一の値はrundeck。
vi /etc/rundeck/testadmin.aclpolicy
description: Project settings for testadmin
context:
project: 'test-project'
for:
resource:
- allow: '*'
adhoc:
- allow: '*'
job:
- allow: '*'
node:
- allow: '*'
by:
username: testadmin
---
description: Application level access for testadmin
context:
application: 'rundeck'
for:
resource:
- equals:
kind: project
deny: [create] # deny create of projects
- equals:
kind: system
deny: [read,enable_executions,disable_executions,admin] #deny read of system info, enable/disable all executions
- equals:
kind: system_acl
deny: [read,create,update,delete,admin] # deny modifying system ACL files
- equals:
kind: user
deny: [admin] # deny modify user profiles
project:
- match:
name: 'test-project'
allow: [read] # test-projectだけが見られるようにする
by:
username: testadmin
jobの作成
jobの名前などをつける
Descriptionはmarkdownで書ける。
workflowを作成する
Nodeを選択する
Remoteに実行するので、 Dispatch to Nodes
を選択。
Node Filterで Show all nodes
で出すと、先程登録したNodeが表示されるので、それを選択する。
Notificationを設定する
よしなにSlackの通知を設定する
以下の単位で通知の On/Offが切り替えられる。
- On Success
- On Failure
- On Start
- Average Duration Exceeded
- On Retryable Failure
Scheduleを設定する
以下の2タイプから選択可能
- Simple
- Cron
Timezoneとかの指定も親切なUI
Simple
Cron
Timeoutを設定する
タスク登録完了
いざ実施
登録したタスクを Run Job Now
で実施する
FireWallRule、メタデータ(GCPのsshキーを登録するところ)追加するの忘れてた・・・
ちなみに、rundeckのsshキーは以下に登録されている。
# ls -lhA /var/lib/rundeck/.ssh/
total 12K
-rw-------. 1 rundeck rundeck 407 Nov 27 00:03 authorized_keys
-rw-------. 1 rundeck rundeck 1.7K Nov 25 12:46 id_rsa
-rw-r--r--. 1 rundeck rundeck 390 Nov 26 00:07 id_rsa.pub