おはげようございます。
tl;dr
Rundeck を API で操作するシリーズ第一弾。いつまで続くか解らないけど、第一弾は API 経由でジョブ実行。
提供(参考)
この記事は API Reference | Version 13 の提供でお送りいたします。
メモ
所感
- ざっと見た感じ WebUI 上の操作が全部出来そう
- 各エンドポイントで XML 又は JSON でレスポンスが得られる(但し、XML のみのレスポンスとなるエンドポイントもある)
- JSON でレスポンスを得たい場合にはリクエストヘッダに
Content-Type: application/json
を指定すれば良さそう(試せてない)
認証
認証はトークン認証とパスワード認証がある。どちらを選ぶかはお好みで...と言いたいところだけど、パスワード認証を利用する場合には事前に認証 URL にアクセスして取得したセッション ID を Cookie に含める必要があるようなのでチョット面倒。
ということで、今回はトークン認証を選んだので WebUI 上からトークンを発行する。
トークンはリクエストヘッダの X-Rundeck-Auth-Token
のパラメータとして利用する。
ジョブの一覧
ジョブの一覧を取得する場合には /api/2/project/[プロジェクト名]/jobs
を利用する。
- リクエスト
curl -H 'X-Rundeck-Auth-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' "http://xxx.xxx.xx.xx:4440/api/2/project/hello-world/jobs"
- レスポンス
<result success='true' apiversion='14'> <jobs count='2'> <job id='7c0f25b9-7bb0-4818-a5f4-eac9cd9029c6' href='http://xxx.xxx.xx.xx:4440/api/14/job/7c0f25b9-7bb0-4818-a5f4-eac9cd9029c6' permalink='http://xxx.xxx.xx.xx:4440/project/hello-world/job/show/7c0f25b9-7bb0-4818-a5f4-eac9cd9029c6'> <name>hello-world</name> <group /> <project>hello-world</project> <description></description> </job> <job id='fdf1cca5-e729-491b-a1fa-3d8fef373d46' href='http://xxx.xxx.xx.xx:4440/api/14/job/fdf1cca5-e729-491b-a1fa-3d8fef373d46' permalink='http://xxx.xxx.xx.xx:4440/project/hello-world/job/show/fdf1cca5-e729-491b-a1fa-3d8fef373d46'> <name>hello-world</name> <group /> <project>hello-world</project> <description></description> </job> </jobs> </result>
ジョブの実行
- リクエスト(
POST
de リクエスト)
curl -X POST -H 'X-Rundeck-Auth-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' "http://xxx.xxx.xx.xx:4440/api/12/job/fdf1cca5-e729-491b-a1fa-3d8fef373d46/executions"
- リクエスト(
GET
de リクエスト)
curl -H 'X-Rundeck-Auth-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' "http://xxx.xxx.xx.xx:4440/api/1/job/fdf1cca5-e729-491b-a1fa-3d8fef373d46/run"
- レスポンス
<result success='true' apiversion='14'> <executions count='1'> <execution id='2681' href='http://xxx.xxx.xx.xx:4440/project/hello-world/execution/show/2681' permalink='' status='running' project='hello-world'> <user>admin</user> <date-started unixtime='1445985223004'>2015-10-27T22:33:43Z</date-started> <job id='fdf1cca5-e729-491b-a1fa-3d8fef373d46' averageDuration='758' href='http://xxx.xxx.xx.xx:4440/api/14/job/fdf1cca5-e729-491b-a1fa-3d8fef373d46' permalink='http://xxx.xxx.xx.xx:4440/project/hello-world/job/show/fdf1cca5-e729-491b-a1fa-3d8fef373d46'> <name>hello-world</name> <group></group> <project>hello-world</project> <description></description> </job> <description>cho "hello" >> hello-world</description> <argstring /> </execution> </executions> </result>
- 通知プラグインを有効にしているので以下のように...(メールで)
通知プラグインを有効にしているので以下のように...(fluentd にも)
2015-10-28 07:33:45 +0900 rundeck.notification.hello-world: {"execution_id":2681,"execution_href":"http://xxx.xxx.xx.xx:4440/project/hello-world/execution/follow/2681","execution_status":"RUNNING","execution_user":"admin","execution_dateStartedUnixtime":1445985223004,"execution_description":"","execution_argstring":null,"execution_project":"hello-world","execution_loglevel":"INFO","execution_failedNodeListString":null,"execution_failedNodeList":null,"execution_succeededNodeListString":null,"execution_succeededNodeList":null,"execution_nodestatus":null,"execution_dateEndedUnixtime":null,"execution_abortedby":null,"job_id":"fdf1cca5-e729-491b-a1fa-3d8fef373d46","job_href":"http://xxx.xxx.xx.xx:4440/project/hello-world/job/show/fdf1cca5-e729-491b-a1fa-3d8fef373d46","job_name":"hello-world","job_group":"","job_project":"hello-world","job_description":"","job_averageDuration":758} 2015-10-28 07:33:46 +0900 rundeck.notification.hello-world: {"execution_id":2681,"execution_href":"http://xxx.xxx.xx.xx:4440/project/hello-world/execution/follow/2681","execution_status":"FAILED","execution_user":"admin","execution_dateStartedUnixtime":1445985223004,"execution_description":"","execution_argstring":null,"execution_project":"hello-world","execution_loglevel":"INFO","execution_failedNodeListString":"localhost","execution_failedNodeList":["localhost"],"execution_succeededNodeListString":null,"execution_succeededNodeList":null,"execution_nodestatus":{"succeeded":0,"failed":1,"total":1},"execution_dateEndedUnixtime":1445985225786,"execution_abortedby":null,"job_id":"fdf1cca5-e729-491b-a1fa-3d8fef373d46","job_href":"http://xxx.xxx.xx.xx:4440/project/hello-world/job/show/fdf1cca5-e729-491b-a1fa-3d8fef373d46","job_name":"hello-world","job_group":"","job_project":"hello-world","job_description":"","job_averageDuration":758}
ジョブの実行結果一覧を取得
- リクエスト
curl -H 'X-Rundeck-Auth-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' "http://xxx.xxx.xx.xx:4440/api/1/job/fdf1cca5-e729-491b-a1fa-3d8fef373d46/executions"
- レスポンス
(略) <execution id='36' href='http://xxx.xxx.xx.xx:4440/project/hello-world/execution/show/36' permalink='' status='succeeded' project='hello-world'> <user>admin</user> <date-started unixtime='1445385240173'>2015-10-20T23:54:00Z</date-started> <date-ended unixtime='1445385240690'>2015-10-20T23:54:00Z</date-ended> <job id='fdf1cca5-e729-491b-a1fa-3d8fef373d46' averageDuration='758' href='http://xxx.xxx.xx.xx:4440/api/14/job/fdf1cca5-e729-491b-a1fa-3d8fef373d46' permalink='http://xxx.xxx.xx.xx:4440/project/hello-world/job/show/fdf1cca5-e729-491b-a1fa-3d8fef373d46'> <name>hello-world</name> <group></group> <project>hello-world</project> <description></description> </job> <description>echo "hello" >> hello-world</description> <argstring /> <successfulNodes> <node name='localhost' /> </successfulNodes> </execution> <execution id='35' href='http://xxx.xxx.xx.xx:4440/project/hello-world/execution/show/35' permalink='' status='succeeded' project='hello-world'> <user>admin</user> <date-started unixtime='1445385180255'>2015-10-20T23:53:00Z</date-started> <date-ended unixtime='1445385181237'>2015-10-20T23:53:01Z</date-ended> <job id='fdf1cca5-e729-491b-a1fa-3d8fef373d46' averageDuration='758' href='http://xxx.xxx.xx.xx:4440/api/14/job/fdf1cca5-e729-491b-a1fa-3d8fef373d46' permalink='http://xxx.xxx.xx.xx:4440/project/hello-world/job/show/fdf1cca5-e729-491b-a1fa-3d8fef373d46'> <name>hello-world</name> <group></group> <project>hello-world</project> <description></description> </job> <description>echo "hello" >> hello-world</description> <argstring /> <successfulNodes> <node name='localhost' /> </successfulNodes> </execution> </executions> </result>
最後に
XML でしかレスポンスを返さないエンドポイントと JSON でも返してくれるエンドポイントの違いが謎だけど...
以上、メモでした。