RundeckのJobをGitで管理できると聞いて
2017-05-29

RundeckのジョブがGitで管理できるようになったということで使ってみました。

実際やってみたらわりとだるかったので手順をまとめておこうと思います。 Rundeck自体の使い方は こちら

使うRundeckのバージョンは 2.8.2-1 です。 バージョンによってバグがあったりなかったりするかもしれないので注意してください。

また、人によってはいらない手順もあるはずなので各自読み飛ばしてください。

Rundeck側の設定1 rundeck-setting1 rundeck-setting1

この記事は DockerでRundeckを導入する記事 の延長です。

環境は同じものを使用しているので、同じものを使いたい人は参照してください。

Rundeckにログインしてプロジェクトがすでにあるという状態から始めます。 私は「prod」と「dev」という仮想プロジェクトを作ってあります。

さて、ここからいきなりシェルの作業です。以下のようにして起動中のRundeckコンテナにログインします。

$ docker exec -it rundeck /bin/bash
root@a9cf3fd26321:/#

続いてSSHの鍵を作ります。

root@a9cf3fd26321:/# mkdir ~/.ssh/
root@a9cf3fd26321:/# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/github
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/github.
Your public key has been saved in /root/.ssh/github.pub.
The key fingerprint is:
d7:c8:a0:a6:cc:b9:a9:33:0a:b5:df:8c:4e:1c:c2:da root@a9cf3fd26321
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|        .        |
| .     . o o     |
|  + . o S + .    |
| + * =   .       |
|o E B            |
|. oo *           |
|...=* o          |
+-----------------+

今回はgithubという名前で作りました。これで秘密鍵と公開鍵のペアが作られますね。 めんどくさいですが、SSH設定もしておきましょう。

root@a9cf3fd26321:~# cat << EOL > ~/.ssh/config
> Host github.com
>     HostName github.com
>     User git
>     IdentityFile /root/.ssh/github
> EOL

ここで一旦Rundeckの作業を抜けてGitHubの設定に移ります。

GitHub側の設定 github-setting github-setting

Githubにログインしている前提で話します。 大きく分けてやることは2つあります。

SSH鍵の設定 github-setting-ssh-key github-setting-ssh-key

先程作った鍵をGitHubに登録します。 SSH keys に移動して先程作った公開鍵を登録します。

root@a9cf3fd26321:~/.ssh# cat ~/.ssh/github.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/5Cj//kv3y02fj+f3ShGTk9d/gScvbq+/56HaPN/12jFUhOOayGU0qfCXcYpwP6AxtasmzDl2CNrKG5gum37IzBH7yyf5jxmxjYKtCkitwijjF3VgsB7fi+56HaCyVc1PlaItJNoKmZQYD2xXH33Jg0sZRxsYmc40DSdbBEvJtYRJxffhpUmDIPZXwjrzq8db/ohFvSIUEGTZ6glGsaRJSa4cjyi78O93jifYja26I4N062aoYViXQwo4eIOI6zGxYyofqWy2pwCNuAZV/ES24J+MSvDmfr332ulN6wNB1vQ4VpbU+YD05wqDJb3FQFTsi0zmRPEWY6NDHZgtQ8bx root@a9cf3fd26321

公開鍵は .pub拡張子 がついている方です。間違えないように注意してください。

github-sshkeys

リポジトリを作る github-setting-create-repo github-setting-create-repo

GitHubにリポジトリを作ります。これがないとPUSHできませんからね。

特に特別な設定は不要です。今回は「rundeck-jobs」にしました。

github-create-repo

初期コミットをします。適当にREADMEを作ります。

repo-initial-commit

これでGitHub上での作業は終わりです。

Rundeck側の設定2 rundeck-setting2 rundeck-setting2

ここからは再度Rundeckの設定に戻ります。

KeyStorageの登録 rundeck-setting2-keystorage rundeck-setting2-keystorage

GitHubの認証をするために、Rundeck側にも鍵設定をしなければいけません。

GitHubに登録した鍵とは違い、こちらでは秘密鍵を登録します。こんな感じで .pub拡張子ついてない ほうの鍵を覗き、コピペします。

root@a9cf3fd26321:/# cat ~/.ssh/github
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAv+Qo//5L98tNn4/n90oRk5PXf4EnL26vv+eh2jzf9doxVITj
mshlNKnwl3GKcD+gMbWrJsw5dgjayhuYLpt+yMwR+8sn+Y8ZsY2CrQpIrcIo4xd1
YLAe34vueh2gslXNT5WiLSTaCpmUGA9sVx99yYNLGUcbGJnONA0nWwRLybWEScX3
4aVJgyD2V8I686vHW/6IRb0iFBBk2eoJRrGkSUmuHI8ou/Dvd44n2I2tuiODdOtm
qGFYl0MKOHiDiOsxsWMqH6lstqcAjbgGVfxEtuCfjErw5n6999rpTesDQdb0OFaW
1PmA9OcKgyW9xUBU7ItM5kTxFmOjQx2YLUPG8QIDAQABAoIBADGG3vorlUnwhClh
yBowWNcBOoajPAznAZ+DVmfwfFGFLmRFJEWn4U81aW59FKEiGuOZowIRhecsI+Q0
ORQWeCO1YBLf/YJQ5+3Gu2qUE+wdB9aNEHOTIXTLNhL4oKhGswYOddw2/bvspaeM
G4dlDl87bt+oVZsE347ZskWwlysJJnNEWwdK7g4I5Cw+xLpME0eOcBDtnlnQSzJP
GuDkhHMZ7qhA6NS76oJ8nv3OAs/sXgCAmm+agwE4lkrhtZdnEajeSLCIJ64tEdhI
CIepXCspGTjjYdfHHiJ/bOx7deCeGMF+7DUFHGDb0NV77ZPYNtwXzVT5RJhGr6FU
60N2f50CgYEA9yhZHJEgQYoeBzt68UOTi8CT+Q4S74MLXeKg0bxgcIplBP+l6+sP
391K3KcseeO1eLwy3i/8cNLG3c528AmumiCl375WNo3DlRBWaIlDyovVx+betBjM
dQRgYLgBXSa+XoDcSXKoVns8rtGQQygkP3ecV/ym4nW6hB6hVBk0vusCgYEAxsGk
VdVmskQ+8GzTPKf0jVbFPGVcU4m67bZmXPfLTVQosZ2fE8bNq4MXCID8sznFHJzN
vMmALwJ3jLkRmK+7layttW3jl2iy/TrKl5WC+rZxMPCd8XoIlUuZLKzZzC7csSWG
iRNLh6TH3CaXoItQj0Ep1q1ff2bP9UudaqaA8pMCgYEAn++LIrJC5kZjQhjaaM9q
5g97cboKxNTPATULDk3RNmJIFqD8FJsqzZmcvQatAD87CmL2o9L3j2bF63iUfKY3
R2ODEzNPBMRd4NMOp1zT8njkoRQj3vUBMWPgnhXURBwzKmJGqny4tCXRUesoaFzM
gAl9sW476+V1CdPsX8hj2nsCgYA2fseBJUbIIAAlyaDNY7uguSbRHXWIDh5rqPQ+
D071v9p8gJwqPvsLSKEbGsqulWtfIfsjBRiZSxLeSavyclR7gGIMebnKPNG+rsz3
bO4Bsd4tLfwQRoZt8NFpt2bsHfkytPhDQ0AVS+/kg8xVH32SGarQCq9Bbj4cooPh
xw9Z8wKBgQDT1B+zEDdVKFSwd7hZI+WN9lZ+PQPviK0UCWk0UUFxDx9/H1gDeYTp
7CQstuG6l+9uhPndbxsmTMuAMYxC4mWpI4hGWr9NCFgOPus2CxhijnfCu2d8zVNT
vtzu+07JUDTmzYQd8s8WCYAd96x4SbwmyHKZBWJV/TRHAmKxDHWMsw==
-----END RSA PRIVATE KEY-----

Warning

※本来であれば、秘密鍵は絶対に見せちゃいけません。当方GitHubの対応公開鍵からは既に削除済みなので上記は利用できません。

Rundeckの設定画面からKeyStorageに移動し、

key-storage1

以下のように鍵を登録します。

key-storage2

あとで気づきましたが Storage path は多分空でいいです..

KeyStorage は全プロジェクトで共通なので一度設定すればOKです。

ユーザプロフィールの設定 rundeck-setting2-user-profile rundeck-setting2-user-profile

右上の設定画面からユーザプロフィールに移動してプロフィールを更新します。

user_profile

これがGitの コミッター情報 になるため、入力しないとエラーになります。

Error

SCM Export could not be performed Required user info field was not set: committerName × Please update Your User Profile and enter the missing values.

SCM設定 rundeck-setting2-scm rundeck-setting2-scm

さて、いよいよGitの設定に移ります。

scm-top

SCMの設定ページから Git Export, Git Import をそれぞれ開き Git Repository セクションを以下のように設定します。

設定項目は多分同じです。重要な項目を説明してきます。書いてないところはデフォルト値でいいっす。

Base Directory rundeck-setting2-scm-base-dir rundeck-setting2-scm-base-dir

ローカルのリポジトリを配置するディレクトリパスです。 おそらく複数のプロジェクトのローカルリポジトリを一箇所に集約させたいと考えている方もいるかと思いますが、残念ながらできません。重複したディレクトリパスは弾かれるようになっています。

Error

The base directory is already in use by another project: prod

なのでここはデフォルトのままでいいです。勝手に各プロジェクトディレクトリ配下の「scm」というディレクトリに置かれます。

Git URL rundeck-setting2-scm-git-url rundeck-setting2-scm-git-url

これはリポジトリのURIです。当たり前ですが自分のリポジトリを指定してください。

GitHub を使っている場合は 以下のように調べられます。

ssh-uri

Branch rundeck-setting2-branch rundeck-setting2-branch

複数のプロジェクトを一つのGitHubリポジトリに登録させたいと考えている方はここの入力は必須です。

異なるローカルリポジトリが同じブランチ(例えばmaster)を見て同期をとることは不可能だからです。

今回は「prod」と「dev」のようにブランチを分けることにします。画像はprodのGit設定なのでブランチは「prod」となっています。

SSH Strict Host Key Checking rundeck-setting2-scm-ssh-strict-hostkey-checking rundeck-setting2-scm-ssh-strict-hostkey-checking

「yes」にしてると

Error

Failed cloning the repository from git@github.com:righ/rundeck_jobs.git: git@github.com:righ/rundeck_jobs.git: reject HostKey: github.com

と言われるので外す。原因は調べてないです(`・ω・´)

SSH Key Storage Path rundeck-setting2-scm-ssh-key-storage-path rundeck-setting2-scm-ssh-key-storage-path

SSHの認証で使う鍵を指定します。KeyStorageで登録した鍵を覚えていますか?あれを指定します。

git-settings

全て終わったら「SetUp」を入力すると設定は完了です。Gitの除外設定画面が後に出てくるかもしれませんが、わからない人は無視して進めればいいです。

有効にしたいときは「Enable」ボタンを押します。

ちなみに以下のように言われた人は鍵の設定が間違っています。

Error

Failed fetch from the repository: git@github.com:righ/rundeck_jobs.git:Auth fail

さて、これで終わりだと思いましたか?残念、まだです。続いてコンソールからリポジトリをいじります。

パスをデフォルトにした人は「/var/rundeck/projects/${プロジェクト名}/scm」にローカルリポジトリがあります。

じゃあ prod プロジェクトの設定をするために移動します。

$ cd /var/rundeck/projects/prod/scm

Rundeck設定3 rundeck-setting3 rundeck-setting3

やることは3つです。

初期コミットの取込 rundeck-setting3-pull-first-commit rundeck-setting3-pull-first-commit

一番最初にREADMEをいじってファーストコミットしましたね。あれを取り込まないと親が辿れなくてPUSHできません。

以下のようにします。

root@a9cf3fd26321:/var/rundeck/projects/prod/scm# git pull origin master
From github.com:righ/rundeck_jobs
 * branch            master     -> FETCH_HEAD

SSHの設定が間違っていなければ問題なくできるはず。

これをしないと、PUSH時に以下のようなエラーが出ます。

Error

Some updates failed: [RemoteRefUpdate[remoteName=refs/heads/master, REJECTED_NONFASTFORWARD, (null)...a3086ff168457adfa5cacfab7ae8eac85a18e451, srcRef=refs/heads/master, message=null]]

ブランチの作成 rundeck-setting3-checkout-branch rundeck-setting3-checkout-branch

さっき、 SCMのブランチ設定 で「prod」を指定しましたね。

なので勝手にprodブランチが作られてくれると思っちゃうんですが、残念ながらカレントブランチに作られます。 大抵は master のはずです。

これでは困るのでブランチを作ってチェックアウトします。

root@a9cf3fd26321:/var/rundeck/projects/prod/scm# git checkout -b prod
Switched to a new branch 'prod'

権限の変更 rundeck-setting3-chown rundeck-setting3-chown

ここは人によっていらなかったりすると思いますが、今までの操作をroot権限で行ってきた私と同じような人は、作業が必要です。 chownコマンドで所有者を変えます。

root@a9cf3fd26321:/var/rundeck/projects/prod/scm# chown -R rundeck:rundeck .

これをしないとコミットしたときに以下のように言われるはず。

Error

/var/rundeck/projects/prod/scm/.git/logs/refs/heads/prod (Permission denied)

お疲れ様です。これで設定は終わったはずなので使ってみましょう。

SCM機能を使ってみる use-rundeck-scm use-rundeck-scm

コミット & PUSH use-rundeck-scm-commit-push use-rundeck-scm-commit-push

適当にジョブを作ってアクション的なプルダウンを開くと、 Commit Changes to Git があるのでクリックします。

commit-message-prod

コミット対象のファイルにチェックを入れ、コミットメッセージを入力して、Commitを押します。

Push Remotely? にチェックが入っているとコミットした瞬間にPUSHされます。

ここでPUSHしなくても Job Actions のプルダウンからPUSHできるので安心してください。 Tagの設定なども行えますがわからない人は無視していいです。

push_to_remote

PUSHに成功するとこんな感じ。

push_successfully

同じようにdevにもジョブを作ってPUSH。GitHubにちゃんとブランチも作られてました。

github_branches

コミットをもとにロールバックする use-rundeck-scm-rollback use-rundeck-scm-rollback

今回の本丸です。これができなければ上記をやってきた意味がありませんね。 たとえば、説明文を「aaaa」に変えてしまったとします。

job-diff

(差分[Diff Changes]から閲覧できます)

この状態から戻すには「Import RemoteChanges」です。

detail_aaaa remote_import

から戻すべきファイルを選択して、「Import」

これで元に戻りました。

remote_import_successful

たとえ、ジョブを削除してしまった場合でも、差分は出るので同じように元に戻せます。

delete_changes

以上です。お疲れ様でした。