infra検証 blog

oracle成分多めです。

Oracle Clusterware用のREST APIを使ってみる

この記事は、 JPOUG Advent Calendar 2021 11日目の記事です。

10日目は Kenichi Mihara さんの記事『日本の電子政府はなぜイマイチなのか | サイクル&オラクル』でした。

はじめに

REST APIはなんとなく知っているが実際には使ったことはない状態でした。

21cのClusterwareで使えるようになったことで、次のLTSバージョンに向けて一度使ってみようと重い腰を上げてみました。

Clusterware管理およびデプロイメント・ガイドからOracle Clusterware用のREST APIをベースにやっていきます。

こちらの内容は2021/12時点で以下の環境で実行したものとなります。

環境

OS:Oracle Linux 8.4

Oracle Grid Infrastructure 21c(21.0.0.0.0)

忙しい人向けサマリ

  • REST APIにアクセスするユーザのパスワードは/u01/app/21.0.0/grid/bin/cdpc config で確認できる。
  • CDPのログはgridのalertログと同じディレクト

    • /u01/app/grid/diag/crs/db2101/crs/trace/crscdpd_*.trc
  • 外部からのアクセスは自セグメント(今回は/24)はデフォルトで許可されている。多分ホストのサブネットマスクで/24部分は変わりそう。

  • ファイルが出力されるジョブは、ジョブステータスがCompletedになってからダウンロードする。
  • REST APIのジョブはjobExpiryで削除される。
  • Gridに関係ないコマンドは実行できない。

初期設定関連

初期パスワードの確認

初めから横道に逸れます。引越しの荷造り中にマンガ読んでしまって進まない系のやつです。

マニュアルの始まりはadminユーザのパスワード変更から始まっており、初期パスワードをどうしても確認したくなりました。

gridのalert.log

MySQL?みたいにパスワードがログに出力されていないかなと思い、gridのalert.logをおもむろにgrep -i cdpをしてみます。

[grid@db2101 ~]$ cd $ORACLE_BASE/diag/crs/db2101/crs/trace/
[grid@db2101 trace]$ grep -i cdp alert.log
[grid@db2101 trace]$

はずれでした。

gridインストールログ

ならばということで、次を見ていきます。インストールログはインベントリ/u01/app/oraInventory/logs/の下になりますね。

[grid@db2101 ~]$ cd /u01/app/oraInventory/logs/GridSetupActions2021-09-24_00-51-40AM
[grid@db2101 GridSetupActions2021-09-24_00-51-40AM]$
[grid@db2101 GridSetupActions2021-09-24_00-51-40AM]$ grep -i cdp gridSetupActions2021-09-24_00-51-40AM.out
・・・(略)・・・
[pool-1-thread-1] [ 2021-09-24 01:05:37.141 JST ] [FDOwnershipPermissionsConstraintsParser.processLine:299]  Skipping - OS OR Context applicability flag is false for path [${CONFIGURED_CRS_HOME}/crs/install/oracdp.pm] with constraints [FIXABLE]

途中にも怪しいファイルはありましたが、一番下にそれっぽいPerlファイルがあるので見てみます。

[grid@db2101 ~]$ cd /u01/app/21.0.0/grid/crs/install
[grid@db2101 install]$ view oracdp.pm
・・・(略)・・・
    868   my $CDPC_BIN     = catfile ($CFG->ORA_CRS_HOME, "bin", "cdpc");
    869   my $CRSCDPD_BIN  = catfile ($CFG->ORA_CRS_HOME, "bin", "crscdpd");
    870
    871   # Fetch current passwords
    872   @runcmd = ("$CDPC_BIN", "config");
    873   $status = run_as_user2($crsusr, \@output, @runcmd);
    874   if (0 != $status)
    875   {
    876     print_trace_lines(@output);
    877     return FAILED;
    878   }
    879
    880   foreach my $line (@output)
    881   {
    882     if ($line =~ m/ admin:(.+) wallet/)
    883     {
    884       $apass = $1;
    885     }

842行目付近からmodifyCDPという関数があります。871行目でFetch current passwordsとあるため、前後の処理を見て何となく実行すべきコマンドがわかった気がします。

[grid@db2101 ~]$ cd /u01/app/21.0.0/grid/bin
[grid@db2101 bin]$ ./cdpc config
Resource 'ora.cdp' has 3 cred members
[0]  admin:<xxxxxxxxxx> wallet 4885 wpass FALSE url https://scan21:5700/grid/cdp/v1/cdp fqdn scan21 entity id ora.cdp cluster id 650c3bacf1645fa9ff5d80db17ca133a
[1]  readonly:<xxxxxxxxxx> wallet 4885 wpass FALSE url https://scan21:5700/grid/cdp/v1/cdp fqdn scan21 entity id ora.cdp cluster id 650c3bacf1645fa9ff5d80db17ca133a
[2]  events:<xxxxxxxxxx> wallet 4885 wpass FALSE url https://scan21:5700/grid/cdp/v1/cdp fqdn scan21 entity id ora.cdp cluster id 650c3bacf1645fa9ff5d80db17ca133a
[grid@db2101 bin]$

環境毎にパスワードは違うと思いますが、念のためマスクしました。上記の通りしっかりパスワードが見えました。

答え合わせということでマニュアルにある例J-1 すべてのホームのリストの取得を実行してみます。

[grid@db2101 ~]$  curl -k -X GET https://scan21.snet.com:5700/grid/cmd/v1/cmd/ \
> --user 'admin:<xxxxxxxxxx>' | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1078  100  1078    0     0   5417      0 --:--:-- --:--:-- --:--:--  5417
{
  "name": "cmd",
  "homes": [
    {
      "homeName": "OraGI21Home1",
      "path": "/u01/app/21.0.0/grid"
    },
    {
      "homeName": "OraDB21Home1",
      "path": "/u01/app/oracle/product/21.0.0/dbhome_1"
    },
・・・(略)・・・

結果はjsonで返ってくるため、見やすくするためjqコマンドへパイプしました。

パスワードにバッククォートが含まれていたため、シングルクォートで囲っています。

同じくreadonlyユーザも、実行可能でした。

eventsユーザはエラーにはなりませんがレスポンスが返ってきませんでした。パスワード変更自体出来ないため、特別なユーザなんだと思います。

パスワード変更

gridユーザでは権限がなく実行できないため、rootユーザで実行します。

[root@db2101 ~]$ /u01/app/21.0.0/grid/bin/srvctl stop cdp
[root@db2101 ~]$ echo 'myAdminPasswd' > /tmp/adminpasswd
[root@db2101 ~]# /u01/app/21.0.0/grid/bin/srvctl modify cdp -passfile_admin /tmp
/adminpasswd
[root@db2101 ~]# echo $?
0
[root@db2101 ~]# /u01/app/21.0.0/grid/bin/srvctl start cdp

再度gridユーザでパスワード確認/u01/app/21.0.0/grid/bin/cdpc configを実行するとadminユーザのパスワードが変わったことを確認できました。

CDPログの確認

grid alertログのディレクトリでgrep -i cdp *をしました。 cdpごとにファイルがあり、世代管理されているようです。アクセスされたAPIなど確認できました。

[root@db2101 ~]# cd /u01/app/grid/diag/crs/db2101/crs/trace
[root@db2101 trace]# ls
Display all 2515 possibilities? (y or n)
[root@db2101 trace]# ll crscdpd*
-rw-rw---- 1 grid oinstall  3994759 125 13:21 crscdpd_1.trc
-rw-rw---- 1 grid oinstall   531105 125 13:21 crscdpd_1.trm
-rw-rw---- 1 grid oinstall 26215016 1128 20:17 crscdpd_1_1.trc
-rw-rw---- 1 grid oinstall  3502971 1128 20:17 crscdpd_1_1.trm
-rw-rw---- 1 grid oinstall 26215042 124 15:47 crscdpd_1_2.trc
-rw-rw---- 1 grid oinstall  3583867 124 15:47 crscdpd_1_2.trm
-rw-rw---- 1 grid oinstall  3873257 125 13:21 crscdpd_2.trc
-rw-rw---- 1 grid oinstall   515200 125 13:21 crscdpd_2.trm
-rw-rw---- 1 grid oinstall 26215265 1128 20:44 crscdpd_2_1.trc
-rw-rw---- 1 grid oinstall  3492527 1128 20:44 crscdpd_2_1.trm
-rw-rw---- 1 grid oinstall 26214967 124 16:21 crscdpd_2_2.trc
-rw-rw---- 1 grid oinstall  3577549 124 16:21 crscdpd_2_2.trm
-rw-rw---- 1 grid oinstall   379406 124 15:21 crscdpd_3.trc
-rw-rw---- 1 grid oinstall    80512 124 15:21 crscdpd_3.trm

クラスタ外部からの接続許可について

まずは初期状態を確認します。

[grid@db2101 ~]$ srvctl config cdp
-------------------------------------------------------
CDP名                           ポート     許可されるIP
-------------------------------------------------------
ora.cdp1.cdp                       5700
ora.cdp2.cdp                       5700
ora.cdp3.cdp                       5700

接続許可 gridユーザではエラーとなるため、rootユーザで実行します。

[root@db2101 bin]# /u01/app/21.0.0/grid/bin/srvctl modify cdp -allow "172.16.2.19/32"
[root@db2101 bin]# /u01/app/21.0.0/grid/bin/srvctl config cdp
-------------------------------------------------------
CDP名                           ポート     許可されるIP
-------------------------------------------------------
ora.cdp1.cdp                       5700     172.16.2.19/32
ora.cdp2.cdp                       5700     172.16.2.19/32
ora.cdp3.cdp                       5700     172.16.2.19/32

設定時のログ

2021-12-05 14:13:49.081 :   CLSWS:140394522236672: clsws_cli_event: got allowips event 172.16.2.19/32
2021-12-05 14:13:49.081 :   CLSWS:140394520135424: clsws_cli_allow_thr: Subnet Mask IP 172.16.2.0/255.255.255.0 converted to CIDR 172.16.2.0/24
2021-12-05 14:13:49.081 :   CLSWS:140394520135424: clsws_cli_allow_thr: allowed ip from attr: '172.16.2.0/24'
2021-12-05 14:13:49.081 :   CLSWS:140394520135424: clsws_cli_allow_thr: allowed ip from attr: '172.16.2.19/32'
2021-12-05 14:13:53.238 :   CLSWS:140394515932928: clsws_cli_status_thr: loop counter 0 cur_len 0

ログを見ていると、広い172.16.2.0/24でも許可されていることが確認できます。172.16.2.19は今回のOracleRACと同じセグメント(172.16.2.0/24)になります。

マニュアルには以下のように書かれていますが、現状はクラスタと同セグ/24は許可リストに初めから入っているようです。

デフォルトでREST APIを安全にするために、クラスタ内のノードのIPアドレス以外からのすべてのリクエストが拒否されます。CDPデーモンはクラスタ内のノードを監視し、IPのいずれとも一致しないCLIエンドポイントへのリクエストをすべて拒否します。

試しに/u01/app/21.0.0/grid/bin/srvctl modify cdp -allow ""のように空で実行するとやはり、クラスタと同セグ/24は許可リストのようです。

2021-12-05 14:17:58.378 :   CLSWS:140394522236672: clsws_cli_event: got allowips event
2021-12-05 14:17:58.378 :   CLSWS:140394520135424: clsws_cli_allow_thr: Subnet Mask IP 172.16.2.0/255.255.255.0 converted to CIDR 172.16.2.0/24
2021-12-05 14:17:58.378 :   CLSWS:140394520135424: clsws_cli_allow_thr: allowed ip from attr: '172.16.2.0/24'

実は許可設定前に、アクセスできないねっていうログを取りたかったのですが、接続できてしまいログを読んだところこのような結末でした。

REST APIを使ってみる

前置きは長くなりましたが、マニュアルを見ながら進めていきます。

ジョブ実行

レスポンスもjsonなので、jqで見やすくしています。 これはマニュアルの例J-2 ジョブの作成(crsctl)およびステータスの監視になります。

[root@dev01 ~]# curl -k -X POST \
>     https://172.16.2.57:5700/grid/cmd/v1/cmd/exec \
>     '-H "accept: text/plain,text/javascript,application/json"' \
>     '-H "content-type: application/vnd.oracle.resource+json;type=singular"' \
>      --user admin:myAdminPasswd \
>     '-d  {"command" : ["crsctl", "stat", "res", "-t"], "runAsUser":"grid", "userPassword":"grid"}' | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   680  100   590  100    90    129     19  0:00:04  0:00:04 --:--:--   134
{
  "runAsUser": "grid",
  "jobId": "oPSnBD_T0hJk7pMo7vswEsry4LKM4zmFFdMBTMl0xQlAG5-jMr3UwAcU_tsZWlL4shtB8ibgEG9LtM9EXmD2uw",
  "command": [
    "crsctl",
    "stat",
    "res",
    "-t"
  ],
  "nodeName": "db2101",
  "jobExpiry": 3600,
  "status": "Scheduled",
  "links": [
    {
      "rel": "canonical",
      "href": "https://172.16.2.57:5700/grid/cmd/v1/cmd/jobs/oPSnBD_T0hJk7pMo7vswEsry4LKM4zmFFdMBTMl0xQlAG5-jMr3UwAcU_tsZWlL4shtB8ibgEG9LtM9EXmD2uw",
      "mediaType": "application/vnd.oracle.resource+json;type=singular"
    },
    {
      "rel": "parent",
      "href": "https://172.16.2.57:5700/grid/cmd/v1/cmd/jobs",
      "mediaType": "application/vnd.oracle.resource+json;type=collection"
    }
  ]
}

コマンドの実行結果が1行で出力されるので、どうするか考えたいですね。

何となくjobIdは数値で連番みたいな想像を勝手にしていたので、若干面を食らいました。

[root@dev01 ~]# curl -k -X GET https://172.16.2.57:5700/grid/cmd/v1/cmd/jobs/oPSnBD_T0hJk7pMo7vswEsry4LKM4zmFFdMBTMl0xQlAG5-jMr3UwAcU_tsZWlL4shtB8ibgEG9LtM9EXmD2uw --user admin:myAdminPasswd | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  5595  100  5595    0     0  20825      0 --:--:-- --:--:-- --:--:-- 20799
{
  "runAsUser": "grid",
  "jobId": "oPSnBD_T0hJk7pMo7vswEsry4LKM4zmFFdMBTMl0xQlAG5-jMr3UwAcU_tsZWlL4shtB8ibgEG9LtM9EXmD2uw",
  "command": [
    "crsctl",
    "stat",
    "res",
    "-t"
  ],
  "nodeName": "db2101",
  "output": "--------------------------------------------------------------------------------\nName           Target  State        Server                   State details       \n--------------------------------------------------------------------------------\nLocal Resources\n--------------------------------------------------------------------------------\nora.LISTENER.lsnr\n               ONLINE  ONLINE       db2101                   STABLE\n               ONLINE  ONLINE       db2102                   STABLE\nora.chad\n               ONLINE  ONLINE       db2101                   STABLE\n               ONLINE  ONLINE       db2102                   STABLE\nora.helper\n               OFFLINE OFFLINE      db2101                   IDLE,STABLE\n               OFFLINE OFFLINE      db2102                   IDLE,STABLE\nora.net1.network\n               ONLINE  ONLINE       db2101                   STABLE\n               ONLINE  ONLINE       db2102                   STABLE\nora.ons\n               ONLINE  ONLINE       db2101                   STABLE\n               ONLINE  ONLINE       db2102                   STABLE\n--------------------------------------------------------------------------------\nCluster Resources\n--------------------------------------------------------------------------------\nora.ASMNET1LSNR_ASM.lsnr(ora.asmgroup)\n      1        ONLINE  ONLINE       db2101                   STABLE\n      2        ONLINE  ONLINE       db2102                   STABLE\nora.ASMNET2LSNR_ASM.lsnr(ora.asmgroup)\n      1        ONLINE  ONLINE       db2101                   STABLE\n      2        ONLINE  ONLINE       db2102                   STABLE\nora.DATA.dg(ora.asmgroup)\n      1        ONLINE  ONLINE       db2101                   STABLE\n      2        ONLINE  ONLINE       db2102                   STABLE\nora.LISTENER_SCAN1.lsnr\n      1        ONLINE  ONLINE       db2101                   STABLE\nora.LISTENER_SCAN2.lsnr\n      1        ONLINE  ONLINE       db2101                   STABLE\nora.LISTENER_SCAN3.lsnr\n      1        ONLINE  ONLINE       db2102                   STABLE\nora.MGMT.dg(ora.asmgroup)\n      1        ONLINE  ONLINE       db2101                   STABLE\n      2        ONLINE  ONLINE       db2102                   STABLE\nora.MGMTLSNR\n      1        ONLINE  ONLINE       db2101                   169.254.8.36 10.10.1\n                                                             .1 10.10.2.1,STABLE\nora.OCR.dg(ora.asmgroup)\n      1        ONLINE  ONLINE       db2101                   STABLE\n      2        ONLINE  ONLINE       db2102                   STABLE\nora.asm(ora.asmgroup)\n      1        ONLINE  ONLINE       db2101                   Started,STABLE\n      2        ONLINE  ONLINE       db2102                   Started,STABLE\nora.asmnet1.asmnetwork(ora.asmgroup)\n      1        ONLINE  ONLINE       db2101                   STABLE\n      2        ONLINE  ONLINE       db2102                   STABLE\nora.asmnet2.asmnetwork(ora.asmgroup)\n      1        ONLINE  ONLINE       db2101                   STABLE\n      2        ONLINE  ONLINE       db2102                   STABLE\nora.cdp1.cdp\n      1        ONLINE  ONLINE       db2101                   STABLE\nora.cdp2.cdp\n      1        ONLINE  ONLINE       db2101                   STABLE\nora.cdp3.cdp\n      1        ONLINE  ONLINE       db2102                   STABLE\nora.cvu\n      1        ONLINE  ONLINE       db2101                   STABLE\nora.db2101.vip\n      1        ONLINE  ONLINE       db2101                   STABLE\nora.db2102.vip\n      1        ONLINE  ONLINE       db2102                   STABLE\nora.mgmtdb\n      1        ONLINE  ONLINE       db2101                   Open,STABLE\nora.orcl.db\n      1        ONLINE  ONLINE       db2101                   Open,HOME=/u01/app/o\n                                                             racle/product/21.0.0\n                                                             /dbhome_1,STABLE\n      2        ONLINE  ONLINE       db2102                   Open,HOME=/u01/app/o\n                                                             racle/product/21.0.0\n                                                             /dbhome_1,STABLE\nora.orcl.orclpdb1.pdb\n      1        ONLINE  ONLINE       db2101                   STABLE\n      2        ONLINE  ONLINE       db2102                   STABLE\nora.qosmserver\n      1        ONLINE  ONLINE       db2101                   STABLE\nora.rhpserver\n      1        OFFLINE OFFLINE                               STABLE\nora.scan1.vip\n      1        ONLINE  ONLINE       db2101                   STABLE\nora.scan2.vip\n      1        ONLINE  ONLINE       db2101                   STABLE\nora.scan3.vip\n      1        ONLINE  ONLINE       db2102                   STABLE\n--------------------------------------------------------------------------------\n",
  "processId": 829488,
  "processStatus": 0,
  "timeStart": "2021-12-05T08:03:46",
  "timeFinish": "2021-12-05T08:03:47",
  "jobExpiry": 3600,
  "status": "Completed",
  "links": [
    {
      "rel": "canonical",
      "href": "https://172.16.2.57:5700/grid/cmd/v1/cmd/jobs/oPSnBD_T0hJk7pMo7vswEsry4LKM4zmFFdMBTMl0xQlAG5-jMr3UwAcU_tsZWlL4shtB8ibgEG9LtM9EXmD2uw",
      "mediaType": "application/vnd.oracle.resource+json;type=singular"
    },
    {
      "rel": "parent",
      "href": "https://172.16.2.57:5700/grid/cmd/v1/cmd/jobs",
      "mediaType": "application/vnd.oracle.resource+json;type=collection"
    }
  ]
}

CVUジョブ出力ファイルの取得

cluvfy comp healthcheckコマンドは実行に時間がかかるため、ジョブステータスがCompletedになったのを確認してからダウンロードしましょう。

CDPログを1つだけ見るようにしたいためIP指定にしています。 またそれに伴い証明書の警告がでたため--no-check-certificateをつけています。

[root@dev01 ~]# wget --user admin --password myAdminPasswd https://172.16.2.57:5700/grid/cmd/v1/cmd/jobs/C_GzD1MMhg0h4U9DmKUElRXmcUsYVio6Mq3tPcTEG2sQn-nKWcj9rOACAuU7dlDbzagdhZrdt-bxts7ci79yIQ/outputFile --no-check-certificate
--2021-12-05 16:07:40--  https://172.16.2.57:5700/grid/cmd/v1/cmd/jobs/C_GzD1MMhg0h4U9DmKUElRXmcUsYVio6Mq3tPcTEG2sQn-nKWcj9rOACAuU7dlDbzagdhZrdt-bxts7ci79yIQ/outputFile
Connecting to 172.16.2.57:5700... connected.
WARNING: cannot verify 172.16.2.57's certificate, issued by ‘/O=Oracle_Clusterware/CN=650c3bacf1645fa9ff5d80db17ca133a_1632413658’:
  Self-signed certificate encountered.
    WARNING: certificate common name ‘scan21’ doesn't match requested host name ‘172.16.2.57’.
HTTP request sent, awaiting response... 401 Unauthorized
Reusing existing connection to 172.16.2.57:5700.
HTTP request sent, awaiting response... No data received.
Retrying.

--2021-12-05 16:07:41--  (try: 2)  https://172.16.2.57:5700/grid/cmd/v1/cmd/jobs/C_GzD1MMhg0h4U9DmKUElRXmcUsYVio6Mq3tPcTEG2sQn-nKWcj9rOACAuU7dlDbzagdhZrdt-bxts7ci79yIQ/outputFile
Connecting to 172.16.2.57:5700... connected.
WARNING: cannot verify 172.16.2.57's certificate, issued by ‘/O=Oracle_Clusterware/CN=650c3bacf1645fa9ff5d80db17ca133a_1632413658’:
  Self-signed certificate encountered.
    WARNING: certificate common name ‘scan21’ doesn't match requested host name ‘172.16.2.57’.
HTTP request sent, awaiting response... 200 OK
Length: 187724 (183K) [application/file]
Saving to: ‘outputFile’

100%[===============================================================>] 187,724     --.-K/s   in 0.004s

2021-12-05 16:07:41 (42.6 MB/s) - ‘outputFile’ saved [187724/187724]

また、ジョブのステータスチェックをした際に、jsonの中にoutputFileNameというキーがありました。

valueにファイル名があったため、find検索したところ/u01/app/grid/crsdata/db2101/clswscliに一時ファイルが保存されているようでした。

ジョブの削除と削除確認

ここはあまり、特筆する点がありません。

ジョブのステータスを確認するとjobExpiryという項目があり3600と設定があります。1時間でジョブが削除されているようでした。

例J-4 ステータスの監視、ジョブ出力の取得およびCVUジョブ出力ファイルの取得では、"jobExpiry":300としており、実際に実行すると300で設定されていました。

すべてのジョブステータスを表示する。

将来の自分のために、サンプルとして例J-5 すべてのジョブのステータスの監視の出力例を残します。

[root@dev01 ~]# curl -k -X GET https://172.16.2.57:5700/grid/cmd/v1/cmd/jobs/ --user 'admin:myAdminPasswd' | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1800  100  1800    0     0   1432      0  0:00:01  0:00:01 --:--:--  1433
{
  "items": [
    {
      "runAsUser": "grid",
      "jobId": "C_GzD1MMhg0h4U9DmKUElRXmcUsYVio6Mq3tPcTEG2sQn-nKWcj9rOACAuU7dlDbzagdhZrdt-bxts7ci79yIQ",
      "command": [
        "cluvfy",
        "comp",
        "healthcheck"
      ],
      "nodeName": "db2101",
      "output": "STATUS=OPERATION_FAILED\nREPORT=/grid/cmd/v1/cmd/jobs/C_GzD1MMhg0h4U9DmKUElRXmcUsYVio6Mq3tPcTEG2sQn-nKWcj9rOACAuU7dlDbzagdhZrdt-bxts7ci79yIQ/outputFile\n",
      "outputFile": [
        {
          "rel": "canonical",
          "href": "https://172.16.2.57:5700/grid/cmd/v1/cmd/jobs/jobs/C_GzD1MMhg0h4U9DmKUElRXmcUsYVio6Mq3tPcTEG2sQn-nKWcj9rOACAuU7dlDbzagdhZrdt-bxts7ci79yIQ",
          "mediaType": "application/file"
        },
        {
          "rel": "parent",
          "href": "https://172.16.2.57:5700/grid/cmd/v1/cmd/jobs/jobs/C_GzD1MMhg0h4U9DmKUElRXmcUsYVio6Mq3tPcTEG2sQn-nKWcj9rOACAuU7dlDbzagdhZrdt-bxts7ci79yIQ/outputFile",
          "mediaType": "application/vnd.oracle.resource+json;type=singular"
        }
      ],
      "outputFileName": "C_GzD1MMhg0h4U9DmKUElRXmcUsYVio6Mq3tPcTEG2sQn-nKWcj9rOACAuU7dlDbzagdhZrdt-bxts7ci79yIQ_outputfile.txt",
      "preferredFileName": "cvureport_2021-12-05_15-32-16.txt",
      "processId": 776738,
      "processStatus": 0,
      "timeStart": "2021-12-05T06:32:16",
      "timeFinish": "2021-12-05T06:36:27",
      "jobExpiry": 3600,
      "status": "Completed",
      "links": [
        {
          "rel": "canonical",
          "href": "https://172.16.2.57:5700/grid/cmd/v1/cmd/jobs/jobs/C_GzD1MMhg0h4U9DmKUElRXmcUsYVio6Mq3tPcTEG2sQn-nKWcj9rOACAuU7dlDbzagdhZrdt-bxts7ci79yIQ",
          "mediaType": "application/vnd.oracle.resource+json;type=singular"
        },
        {
          "rel": "parent",
          "href": "https://172.16.2.57:5700/grid/cmd/v1/cmd/jobs/jobs",
          "mediaType": "application/vnd.oracle.resource+json;type=collection"
        }
      ]
    },
    {
      "runAsUser": "grid",
      "jobId": "QRktJp4Q8648q8C8hbwnjUEqAY1VmYMiX-D8SsaznwPfYy8XOih2_sxgwxpnZpFytpH_IbZDi-1GAUf4KsWfbg",
      "command": [
        "srvctl",
        "config",
        "cdp"
      ],
      "nodeName": "db2101",
      "output": "-------------------------------------------------------\nCDP Name                           port     allowed ips\n-------------------------------------------------------\nora.cdp1.cdp                       5700     \nora.cdp2.cdp                       5700     \nora.cdp3.cdp                       5700     \n",
      "processId": 828657,
      "processStatus": 0,
      "timeStart": "2021-12-05T08:01:48",
      "timeFinish": "2021-12-05T08:01:49",
      "jobExpiry": 3600,
      "status": "Completed",
      "links": [
        {
          "rel": "canonical",
          "href": "https://172.16.2.57:5700/grid/cmd/v1/cmd/jobs/jobs/QRktJp4Q8648q8C8hbwnjUEqAY1VmYMiX-D8SsaznwPfYy8XOih2_sxgwxpnZpFytpH_IbZDi-1GAUf4KsWfbg",
          "mediaType": "application/vnd.oracle.resource+json;type=singular"
        },
        {
          "rel": "parent",
          "href": "https://172.16.2.57:5700/grid/cmd/v1/cmd/jobs/jobs",
          "mediaType": "application/vnd.oracle.resource+json;type=collection"
        }
      ]
    }
  ],
  "links": [
    {
      "rel": "canonical",
      "href": "https://172.16.2.57:5700/grid/cmd/v1/cmd/jobs",
      "mediaType": "application/vnd.oracle.resource+json;type=collection"
    },
    {
      "rel": "parent",
      "href": "https://172.16.2.57:5700/grid/cmd/v1/cmd",
      "mediaType": "application/vnd.oracle.resource+json;type=singular"
    }
  ]
}

自作コマンドのジョブを実行できるのか

ふと思い、ファイルを用意して実行してみました。

[root@db2101 ~]# ll /tmp/get_os_info.sh
-rwxr--r-- 1 root root 300 125 16:19 /tmp/get_os_info.sh
[root@db2101 ~]#
[root@db2101 ~]# cat /tmp/get_os_info.sh
#!/bin/bash

ip a | grep inet
df -hT

exit 0

おもむろに実行してみます。

[root@dev01 ~]# curl -k -X POST \
>     https://172.16.2.57:5700/grid/cmd/v1/cmd/exec  \
>     '-H "accept: text/plain,text/javascript,application/json"' \
>     '-H "content-type: application/vnd.oracle.resource+json;type=singular"' \
>      --user admin:myAdminPasswd \
>     '-d  {"command" : ["sh", "/tmp/get_os_info.sh"], "runAsUser":"root", "userPassword":"P@ssw0rd"}'
[root@dev01 ~]# 

レスポンスが返ってこないし、ジョブ一覧にも表示されない。

ログをみるとinvalid exec requestと言われ実行できないようです。

若干期待しましたが、ですよねという感じです。

2021-12-05 16:31:21.803 :   CLSWS:140394539046656: clswsd_wl_check_auth returns 1
2021-12-05 16:31:21.803 :   CLSWS:140394539046656: calling clsws_cli_exec for uri /grid/cmd/v1/cmd/exec qs <null> op POST
2021-12-05 16:31:21.803 :   CLSWS:140394539046656: clsws_cli_job_parse: Invalid CLI passed sh
2021-12-05 16:31:21.803 :   CLSWS:140394539046656: clsws_cli_exec: invalid exec request
2021-12-05 16:31:21.803 :   CLSWS:140394539046656: Result 400 BAD_REQ for uri /grid/cmd/v1/cmd/exec op POST
2021-12-05 16:31:21.804 :   CLSWS:140394528540416: Closing connection w/conndata 0x7fb008037380

まとめ

細かいところは押さえられていませんが、大枠について知ることができた感じがします。

実施前まで少し心配でしたが、思いのほか簡単に実行できました。

今後のために何かに使えるか考えてみようと思います。

今になってorachkなど実行できるか試してみたくなったので、追って実施しようと思います。