【Talend】MetaServletAPIでTACにジョブをコマンドベースで登録するシェル

※2019/05/30 更新

ETLツール Talendを用いてジョブ実行基盤を運用しているが、 WebのGUIを用いたジョブ登録がめちゃくちゃリスキー。

Nexusを用いれば解放されるらしいが、もろもろの制約で導入できずにいる。

幸いにも、Talend v7.1.1 の時点ではMetaServletAPIがまともに改善していたため、 こちらを使ってコマンドラインベースのリリースシェルを作成した。

新規追加

/opt/TalendTools-7.1.1/tac/apache-tomcat/webapps/org.talend.administrator/WEB-INF/classes/MetaServletCaller.sh -url http://localhost:8080/org.talend.administrator -json '{
  "actionName": "associatePreGeneratedJob",
  "active": true,
  "authPass": "password",
  "authUser": "user@company.com",
  "contextName": "Default",
  "executionServerName": "sever1",
  "filePath": "/tmp/SAMPLE_JOB.zip",
  "importType": "File",
  "logLevel": "Info",
  "onUnknownStateJob": "WAIT",
  "pauseOnError": false,
  "taskName": "SAMPLE_JOB",
  "taskType": "Normal",
  "description": "サンプルジョブ"
}'

更新シェル

コマンドラインツール jq が必要です。

#!/bin/sh

JOBNAME=$1
ZIPFILE=$2
CONTEXT=$3

if [ "$JOBNAME" = "" -o "$ZIPFILE" = "" ]; then
  echo [USAGE]
  echo $0 \<JOBNAME\> \<ZIPFILE\>
  exit 1
fi


if [ "$CONTEXT" = "" ]; then
  CONTEXT = {}
fi

METASERVLETAPI=/opt/TalendTools-7.1.1/tac/apache-tomcat/webapps/org.talend.administrator/WEB-INF/classes/MetaServletCaller.sh
TACURL=http://localhost:8080/org.talend.administrator
TACUSER=user@company.com
TACPASS=password

# find

JSON=`${METASERVLETAPI} -url ${TACURL} -json "{
  \"actionName\": "getTaskIdByName",
  \"authPass\": \"${TACPASS}\",
  \"authUser\": \"${TACUSER}\",
  \"taskName\": \"${JOBNAME}\"
}"`
TASK_ID=`echo $JSON | jq -r '.taskId'`

if [ "$TASK_ID" = "null" ]; then
  echo ジョブ $JOBNAME はTACに登録されていません。
  exit 2
fi

JSON=`${METASERVLETAPI} -url ${TACURL} -json "{
  \"actionName\": "listTasks",
  \"authPass\": \"${TACPASS}\",
  \"authUser\": \"${TACUSER}\"
}"`

JSON=`echo $JSON| jq ".result[] | select(.id == \"${TASK_ID}\")"`

printf "\n"
echo "[TAC登録情報]"
echo "  taskId      : "`echo $JSON | jq .id`
echo "  project     : "`echo $JSON | jq .projectName`
echo "  label       : "`echo $JSON | jq .label`
echo "  server      : "`echo $JSON | jq .virtualServerLabel`
echo "  description : "`echo $JSON | jq .description`
printf "\n"
echo " 更新ファイル: [${ZIPFILE}]"
echo " コンテキスト: ${CONTEXT}"
printf "\n"

printf "\n"
read -p "【確認】このジョブを対象のzipファイルで更新しますか?[y/N]" yn

if [ "$yn" != "y" ]; then
  exit 3
fi

JSON=`${METASERVLETAPI} -url ${TACURL} -json "{
  \"actionName\": \"updateTask\",
  \"authPass\": \"${TACPASS}\",
  \"authUser\": \"${TACUSER}\",
  \"taskId\": ${TASK_ID},
  \"filePath\": \"${ZIPFILE}\",
  \"context\":${CONTEXT}
}"`

echo result: ${JSON}

利用例

$ ./updatejob.sh SAMPLE_JOB /tmp/SAMPLE_JOB_0.1.zip '{"PROP1" : "val"}'

[TAC登録情報]
  taskId      : "31"
  project     : "PROJECT"
  label       : "SAMPLE_JOB "
  server      : "server1"
  description : null

 更新ファイル: [/tmp/SAMPLE_JOB_0.1.zip]
 コンテキスト: {"PROP1" : "val"}
【確認】このジョブを対象のzipファイルで更新しますか?[y/N]y
result: {"executionTime":{"millis":3417,"seconds":3},"returnCode":0}