ようへいの日々精進XP

よかろうもん

(超メモ)Rundeck を API で操作する(API 経由でジョブを実行する)

おはげようございます。

tl;dr

Rundeck を API で操作するシリーズ第一弾。いつまで続くか解らないけど、第一弾は API 経由でジョブ実行。


提供(参考)

この記事は API Reference | Version 13 の提供でお送りいたします。


メモ

所感

  • ざっと見た感じ WebUI 上の操作が全部出来そう
  • 各エンドポイントで XML 又は JSON でレスポンスが得られる(但し、XML のみのレスポンスとなるエンドポイントもある)
  • JSON でレスポンスを得たい場合にはリクエストヘッダに Content-Type: application/json を指定すれば良さそう(試せてない)

認証

認証はトークン認証パスワード認証がある。どちらを選ぶかはお好みで...と言いたいところだけど、パスワード認証を利用する場合には事前に認証 URL にアクセスして取得したセッション ID を Cookie に含める必要があるようなのでチョット面倒。

ということで、今回はトークン認証を選んだので WebUI 上からトークンを発行する。

f:id:inokara:20151028074346p:plain

トークンはリクエストヘッダの 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" &gt;&gt; hello-world</description>
      <argstring />
    </execution>
  </executions>
</result>
  • 通知プラグインを有効にしているので以下のように...(メールで)

f:id:inokara:20151028075119p:plain

通知プラグインを有効にしているので以下のように...(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" &gt;&gt; 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" &gt;&gt; hello-world</description>
      <argstring />
      <successfulNodes>
        <node name='localhost' />
      </successfulNodes>
    </execution>
  </executions>
</result>

最後に

XML でしかレスポンスを返さないエンドポイントと JSON でも返してくれるエンドポイントの違いが謎だけど...

以上、メモでした。