LoginSignup
2
0

Marketplace アプリを Linode API/CLI で作成する (Akamai)

Last updated at Posted at 2023-07-28

Marketplace

Akamai のクラウドコンピューティング・サービスが提供するマーケットプレイスでは、人気があり需要の高いソフトウェアをワンクリックアプリケーションとして提供しています。執筆時点で 100 以上のアプリケーションを選択でき、インストールに関するノウハウを取得しなくても容易にアプリケーションの構築ができます。
Screenshot 0005-07-08 at 14.03.30.jpg

正式なドキュメントは下記をご覧ください。

マーケットプレイスからユーザーインタフェースを使ってアプリを簡単に構築することができますが、CLI, API, Terraform からも実行したいという要望があります。本記事は Linode CLI, Linode API を使う方法について記載します。

サンプルコマンドの生成

ポータル画面である Cloud Manager でインスタンスを作成するときに、 create Linode を実行します。実はこのボタンの隣に Create Using Command Line のボタンがあります。

Screenshot 0005-07-08 at 14.09.29.jpg

このボタンを押すと自動で、Cloud Manager に入れた項目を引数としたコマンドラインのサンプルを生成してくれます。

本記事ではすでに公開されているマーケットプレイスを使って環境構築した Redis Sentinel のケースを API/CLI で実施できるかを検証します。

cURL

cURL のサンプルの入手

Create Using Command Line を押すと次のポップアップ画面が表示されます。
sentinel-command-line-mask.jpg

cURL のサンプル

先程の画面から簡単にクリップボードにコピーできます。{ROOT_PASSWORD} などは本記事上では隠していますが、UI で入力した文字列が入っています。

curl -H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-X POST -d '{
    "image": "linode/ubuntu22.04",
    "region": "ap-northeast",
    "type": "g6-standard-1",
    "label": "redissentinel-api",
    "tags": [
        "redis-sentinel",
        "redis-api"
    ],
    "root_pass": "{ROOT_PASSWORD}",
    "authorized_users": [
        "{USER_NAME}"
    ],
    "booted": true,
    "backups_enabled": false,
    "private_ip": false,
    "stackscript_id": 1132204,
    "stackscript_data": {
        "sslheader": "Yes",
        "ca_common_name": "Redis CA",
        "common_name": "Redis Server",
        "clusterheader": "Yes",
        "add_ssh_keys": "yes",
        "cluster_size": "3",
        "token_password": "{TOKEN_PASSWORD}",
        "sudo_username": "{Your_User_Name",
        "country_name": "JP",
        "state_or_province_name": "Tokyo",
        "locality_name": "Chuo",
        "organization_name": "Akamai Technologies",
        "email_address": "{Your_Email_Address}"
    }
}' https://api.linode.com/v4/linode/instances

cURL コマンドの実行

表示されたコマンドは Linode API のエンドポイントに対して実施する curl コマンドとなります。実行すると次のような応答が得られます。

{"id": 47568496, "label": "redissentinel-api", "group": "", "status": "provisioning", "created": "2023-07-08T06:05:16", "updated": "2023-07-08T06:05:16", "type": "g6-standard-1", "ipv4": ["XX.XX.XX.XX"], "ipv6": "XX:XX:XX:XX:XX:XX:XX/128", "image": "linode/ubuntu22.04", "region": "ap-northeast", "specs": {"disk": 51200, "memory": 2048, "vcpus": 1, "gpus": 0, "transfer": 2000}, "alerts": {"cpu": 90, "network_in": 10, "network_out": 10, "transfer_quota": 80, "io": 10000}, "backups": {"enabled": false, "available": false, "schedule": {"day": null, "window": null}, "last_successful": null}, "hypervisor": "kvm", "watchdog_enabled": true, "tags": ["redis-api", "redis-sentinel"], "host_uuid": "bd870ed716cf494fcc0aa6998c2bb9467XXXXXXXX"}%

CLI

CLI のサンプルの入手

cURL の隣に Linode CLI のタブがあります。そちらを選択すると次のように Linode-CLI を使ったサンプルコマンドが表示されます。
sentinel-command-cli-mask.jpg

CLI のサンプル

linode-cli linodes create \
  --image 'linode/ubuntu22.04' \
  --region ap-northeast \
  --type g6-standard-1 \
  --label redissentinel-api \
  --tags redis-sentinel \
  --tags redis-api \
  --root_pass '{ROOT_PASSWORD}' \
  --authorized_users {USER_NAME} \
  --booted true \
  --backups_enabled false \
  --private_ip false \
  --stackscript_id 1132204 \
  --stackscript_data '{"sslheader": "Yes","ca_common_name":"Redis CA","common_name":"Redis Server","clusterheader":"Yes","add_ssh_keys":"yes","cluster_size":"3","token_password":"{TOKEN_PASSWORD}","sudo_username":"{Your_User_Name}","country_name":"JP","state_or_province_name":"Tokyo","locality_name":"Chuo","organization_name":"Akamai Technologies","email_address":"{Your_Email_Address}"}'

CLI の実行

環境変数 LINODE_CLI_TOKEN をセットしていないと以下のエラーが出ます。

Request failed: 401
         errors
┌───────┬───────────────┐
│ field │ reason        │
├───────┼───────────────┤
│       │ Invalid Token │
└───────┴───────────────┘

Cloud Portal で作成済のトークンを環境変数にセットします。

export LINODE_CLI_TOKEN='{PLEASE_ADD_YOUR_Linode_Token}'

実行するとすぐに以下の応答が得られます。

┌──────────┬───────────────────┬──────────────┬───────────────┬────────────────────┬──────────────┬───────────────┐
│ id       │ label             │ region       │ type          │ image              │ status       │ ipv4          │
├──────────┼───────────────────┼──────────────┼───────────────┼────────────────────┼──────────────┼───────────────┤
│ 47568113 │ redissentinel-api │ ap-northeast │ g6-standard-1 │ linode/ubuntu22.04 │ provisioning │ XX.XX.XX.XX │
└──────────┴───────────────────┴──────────────┴───────────────┴────────────────────┴──────────────┴───────────────┘

Cloud Portal の確認

即座に、ポータル画面でも作成中であることを見ることができます。

Screenshot 0005-07-08 at 15.05.35.jpg

今回のケースでは最終的に3ノードのクラスタが作成されますが、最初に一つのノードが作成されます。

Screenshot 0005-07-08 at 14.35.47.jpg

残りの作業状況を確認する必要がある場合は、LISH を使うと便利です。LISH では Linode のコンソール画面を見れ、ログイン前でもコンソールに出力される作業中のログを直接みることができます。

Screenshot 0005-07-08 at 14.38.10.jpg

最終的に、3つのノードが作成されていることが確認できます。

Screenshot 0005-07-08 at 14.39.07.jpg

作業終了のタイミングを知るときも LISH は便利です。

インストールの確認

Redis Server が動作しているかを確認します。ここは確認の例であり、マーケットプレイスでインストールするアプリケーションによって、確認方法はそれぞれ異なります。

root@redissentinel-api1:~# redis-cli --askpass --tls --cacert /etc/redis/tls/ca.crt
Please input password: ********************************************
127.0.0.1:6379> role
1) "master"
2) (integer) 224951
3) 1) 1) "XX.XX.XX.XX"
      2) "6379"
      3) "224951"
   2) 1) "XX.XX.XX.XX"
      2) "6379"
      3) "224951"
127.0.0.1:6379> ping
PONG

マーケットプレイスで使われる StackScript を調べる

StackScript は Akamai の提供するサービスの特徴的な機能です。仮想マシンのプロビジョニング時にシェルスクリプトを実行することができ、定型的な作業のルーチンタスクを自動化することができます。マーケットプレイスのアプリは StackScript を内部で使っています。StackScript には独自の ID があり、皆様自身も作成して一般に公開して、コミュニティに貢献することができます。

StackScript の ID は API/CLI のサンプルに含まれています。

"stackscript_id": 1132204,   
--stackscript_id 1132204

StackScript ID が 1132204 であることが分かります。

Linode API を利用する

先ほどの cURLの内容を確認してみます。

curl -H "Content-Type: application/json" \
-H "Authorization: Bearer {Linode_API_Token}" \
"https://cloud.linode.com/api/v4/linode/stackscripts/1132204" | jq
{
  "id": 1132204,
  "username": "linode",
  "user_gravatar_id": "9d4d301385af69ceb7ad658aad09c142",
  "label": "Redis Sentinel Cluster One-Click",
  "description": "Redis Sentinel One-Click Cluster",
  "ordinal": 88,
  "logo_url": "assets/redissentinelmarketplaceocc.svg",
  "images": [
    "linode/ubuntu22.04"
  ],
  "deployments_total": 97,
  "deployments_active": 18,
  "is_public": true,
  "mine": false,
  "created": "2023-02-27T20:05:44",
  "updated": "2023-07-08T06:05:20",
  "rev_note": "",
  "script": "#!/bin/bash\nset -e\ntrap \"cleanup $? $LINENO\" EXIT\n\n## Deployment Variables\n# <UDF name=\"token_password\" label=\"Your Linode API token\" />\n# <UDF name=\"sudo_username\" label=\"The limited sudo user to be created in the cluster\" />\n# <UDF name=\"sslheader\" label=\"SSL Information\" header=\"Yes\" default=\"Yes\" required=\"Yes\">\n# <UDF name=\"country_name\" label=\"Details for self-signed SSL certificates: Country or Region\" oneof=\"AD,AE,AF,AG,AI,AL,AM,AO,AQ,AR,AS,AT,AU,AW,AX,AZ,BA,BB,BD,BE,BF,BG,BH,BI,BJ,BL,BM,BN,BO,BQ,BR,BS,BT,BV,BW,BY,BZ,CA,CC,CD,CF,CG,CH,CI,CK,CL,CM,CN,CO,CR,CU,CV,CW,CX,CY,CZ,DE,DJ,DK,DM,DO,DZ,EC,EE,EG,EH,ER,ES,ET,FI,FJ,FK,FM,FO,FR,GA,GB,GD,GE,GF,GG,GH,GI,GL,GM,GN,GP,GQ,GR,GS,GT,GU,GW,GY,HK,HM,HN,HR,HT,HU,ID,IE,IL,IM,IN,IO,IQ,IR,IS,IT,JE,JM,JO,JP,KE,KG,KH,KI,KM,KN,KP,KR,KW,KY,KZ,LA,LB,LC,LI,LK,LR,LS,LT,LU,LV,LY,MA,MC,MD,ME,MF,MG,MH,MK,ML,MM,MN,MO,MP,MQ,MR,MS,MT,MU,MV,MW,MX,MY,MZ,NA,NC,NE,NF,NG,NI,NL,NO,NP,NR,NU,NZ,OM,PA,PE,PF,PG,PH,PK,PL,PM,PN,PR,PS,PT,PW,PY,QA,RE,RO,RS,RU,RW,SA,SB,SC,SD,SE,SG,SH,SI,SJ,SK,SL,SM,SN,SO,SR,SS,ST,SV,SX,SY,SZ,TC,TD,TF,TG,TH,TJ,TK,TL,TM,TN,TO,TR,TT,TV,TW,TZ,UA,UG,UM,US,UY,UZ,VA,VC,VE,VG,VI,VN,VU,WF,WS,YE,YT,ZA,ZM,ZW\" />\n# <UDF name=\"state_or_province_name\" label=\"State or Province\" example=\"Example: Pennsylvania\" />\n# <UDF name=\"locality_name\" label=\"Locality\" example=\"Example: Philadelphia\" />\n# <UDF name=\"organization_name\" label=\"Organization\" example=\"Example: Akamai Technologies\"  />\n# <UDF name=\"email_address\" label=\"Email Address\" example=\"Example: user@domain.tld\" />\n# <UDF name=\"ca_common_name\" label=\"CA Common Name\" default=\"Redis CA\" />\n# <UDF name=\"common_name\" label=\"Common Name\" default=\"Redis Server\"  />\n# <UDF name=\"clusterheader\" label=\"Cluster Settings\" default=\"Yes\" header=\"Yes\">\n# <UDF name=\"add_ssh_keys\" label=\"Add Account SSH Keys to All Nodes?\" oneof=\"yes,no\"  default=\"yes\" />\n# <UDF name=\"cluster_size\" label=\"Redis cluster size\" default=\"3\" oneof=\"3,5\" />\n\n# git repo\nexport GIT_PAT=\"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\"\nexport GIT_REPO=\"https://linode-solutions:${GIT_PAT}@github.com/linode-solutions/redis-occ-beta.git\"\n\n# enable logging\nexec > >(tee /dev/ttyS0 /var/log/stackscript.log) 2>&1\n# source script libraries\nsource <ssinclude StackScriptID=1>\nfunction cleanup {\n  if [ \"$?\" != \"0\" ] || [ \"$SUCCESS\" == \"true\" ]; then\n    #deactivate\n    cd ${HOME}\n    if [ -d \"/tmp/linode\" ]; then\n      rm -rf /tmp/linode\n    fi\n    if [ -d \"/usr/local/bin/run\" ]; then\n      rm /usr/local/bin/run\n    fi\n    stackscript_cleanup\n  fi\n}\nfunction add_privateip {\n  echo \"[info] Adding instance private IP\"\n  curl -H \"Content-Type: application/json\" \\\n      -H \"Authorization: Bearer ${TOKEN_PASSWORD}\" \\\n      -X POST -d '{\n        \"type\": \"ipv4\",\n        \"public\": false\n      }' \\\n      https://api.linode.com/v4/linode/instances/${LINODE_ID}/ips\n}\nfunction get_privateip {\n  curl -s -H \"Content-Type: application/json\" \\\n    -H \"Authorization: Bearer ${TOKEN_PASSWORD}\" \\\n   https://api.linode.com/v4/linode/instances/${LINODE_ID}/ips | \\\n   jq -r '.ipv4.private[].address'\n}\nfunction configure_privateip {\n  LINODE_IP=$(get_privateip)\n  if [ ! -z \"${LINODE_IP}\" ]; then\n          echo \"[info] Linode private IP present\"\n  else\n          echo \"[warn] No private IP found. Adding..\"\n          add_privateip\n          LINODE_IP=$(get_privateip)\n          ip addr add ${LINODE_IP}/17 dev eth0 label eth0:1\n  fi\n}\nfunction rename_provisioner {\n  INSTANCE_PREFIX=$(curl -sH \"Authorization: Bearer ${TOKEN_PASSWORD}\" \"https://api.linode.com/v4/linode/instances/${LINODE_ID}\" | jq -r .label)\n  export INSTANCE_PREFIX=\"${INSTANCE_PREFIX}\"\n  echo \"[info] renaming the provisioner\"\n  curl -s -H \"Content-Type: application/json\" \\\n      -H \"Authorization: Bearer ${TOKEN_PASSWORD}\" \\\n      -X PUT -d \"{\n        \\\"label\\\": \\\"${INSTANCE_PREFIX}1\\\"\n      }\" \\\n      https://api.linode.com/v4/linode/instances/${LINODE_ID}\n}\nfunction setup {\n  # install dependencies\n  apt-get update && apt-get upgrade -y\n  apt-get install -y jq git python3 python3-pip python3-dev build-essential firewalld\n  # add private IP address\n  rename_provisioner\n  configure_privateip  \n  # write authorized_keys file\n  if [ \"${ADD_SSH_KEYS}\" == \"yes\" ]; then\n    if [ ! -d ~/.ssh ]; then \n            mkdir ~/.ssh\n    else \n            echo \".ssh directory is already created\"\n    fi\n    curl -sH \"Content-Type: application/json\" -H \"Authorization: Bearer ${TOKEN_PASSWORD}\" https://api.linode.com/v4/profile/sshkeys | jq -r .data[].ssh_key > /root/.ssh/authorized_keys\n  fi\n  # clone repo and set up ansible environment\n  git clone ${GIT_REPO} /tmp/linode\n  cd /tmp/linode\n  pip3 install virtualenv\n  python3 -m virtualenv env\n  source env/bin/activate\n  pip install pip --upgrade\n  pip install -r requirements.txt\n  ansible-galaxy install -r collections.yml\n  # copy run script to path\n  cp scripts/run.sh /usr/local/bin/run\n  chmod +x /usr/local/bin/run\n}\n# main\nsetup\nrun ansible:build\nrun ansible:deploy && export SUCCESS=\"true\"",
  "user_defined_fields": [
    {
      "name": "token_password",
      "label": "Your Linode API token"
    },
    {
      "name": "sudo_username",
      "label": "The limited sudo user to be created in the cluster"
    },
    {
      "name": "sslheader",
      "label": "SSL Information",
      "header": "Yes",
      "default": "Yes",
      "required": "Yes"
    },
    {
      "name": "country_name",
      "label": "Details for self-signed SSL certificates: Country or Region",
      "oneof": "AD,AE,AF,AG,AI,AL,AM,AO,AQ,AR,AS,AT,AU,AW,AX,AZ,BA,BB,BD,BE,BF,BG,BH,BI,BJ,BL,BM,BN,BO,BQ,BR,BS,BT,BV,BW,BY,BZ,CA,CC,CD,CF,CG,CH,CI,CK,CL,CM,CN,CO,CR,CU,CV,CW,CX,CY,CZ,DE,DJ,DK,DM,DO,DZ,EC,EE,EG,EH,ER,ES,ET,FI,FJ,FK,FM,FO,FR,GA,GB,GD,GE,GF,GG,GH,GI,GL,GM,GN,GP,GQ,GR,GS,GT,GU,GW,GY,HK,HM,HN,HR,HT,HU,ID,IE,IL,IM,IN,IO,IQ,IR,IS,IT,JE,JM,JO,JP,KE,KG,KH,KI,KM,KN,KP,KR,KW,KY,KZ,LA,LB,LC,LI,LK,LR,LS,LT,LU,LV,LY,MA,MC,MD,ME,MF,MG,MH,MK,ML,MM,MN,MO,MP,MQ,MR,MS,MT,MU,MV,MW,MX,MY,MZ,NA,NC,NE,NF,NG,NI,NL,NO,NP,NR,NU,NZ,OM,PA,PE,PF,PG,PH,PK,PL,PM,PN,PR,PS,PT,PW,PY,QA,RE,RO,RS,RU,RW,SA,SB,SC,SD,SE,SG,SH,SI,SJ,SK,SL,SM,SN,SO,SR,SS,ST,SV,SX,SY,SZ,TC,TD,TF,TG,TH,TJ,TK,TL,TM,TN,TO,TR,TT,TV,TW,TZ,UA,UG,UM,US,UY,UZ,VA,VC,VE,VG,VI,VN,VU,WF,WS,YE,YT,ZA,ZM,ZW"
    },
    {
      "name": "state_or_province_name",
      "label": "State or Province",
      "example": "Example: Pennsylvania"
    },
    {
      "name": "locality_name",
      "label": "Locality",
      "example": "Example: Philadelphia"
    },
    {
      "name": "organization_name",
      "label": "Organization",
      "example": "Example: Akamai Technologies"
    },
    {
      "name": "email_address",
      "label": "Email Address",
      "example": "Example: user@domain.tld"
    },
    {
      "name": "ca_common_name",
      "label": "CA Common Name",
      "default": "Redis CA"
    },
    {
      "name": "common_name",
      "label": "Common Name",
      "default": "Redis Server"
    },
    {
      "name": "clusterheader",
      "label": "Cluster Settings",
      "default": "Yes",
      "header": "Yes"
    },
    {
      "name": "add_ssh_keys",
      "label": "Add Account SSH Keys to All Nodes?",
      "oneof": "yes,no",
      "default": "yes"
    },
    {
      "name": "cluster_size",
      "label": "Redis cluster size",
      "default": "3",
      "oneof": "3,5"
    }
  ]
}

StackScript の中身を確認してみると、Bashを使って、どのようなソフトウエアがインストールされるかも理解できます。例えば、設定後、接続ができず困っていたのですが、StackScript の中で firewalld をインストールしていることが分かったので、その設定を確認することで問題を回避することができました。

#!/bin/bash
set -e
trap \"cleanup $? $LINENO\" EXIT

## Deployment Variables
# <UDF name=\"token_password\" label=\"Your Linode API token\" />
# <UDF name=\"sudo_username\" label=\"The limited sudo user to be created in the cluster\" />
# <UDF name=\"sslheader\" label=\"SSL Information\" header=\"Yes\" default=\"Yes\" required=\"Yes\">
# <UDF name=\"country_name\" label=\"Details for self-signed SSL certificates: Country or Region\" oneof=\"AD,AE,AF,AG,AI,AL,AM,AO,AQ,AR,AS,AT,AU,AW,AX,AZ,BA,BB,BD,BE,BF,BG,BH,BI,BJ,BL,BM,BN,BO,BQ,BR,BS,BT,BV,BW,BY,BZ,CA,CC,CD,CF,CG,CH,CI,CK,CL,CM,CN,CO,CR,CU,CV,CW,CX,CY,CZ,DE,DJ,DK,DM,DO,DZ,EC,EE,EG,EH,ER,ES,ET,FI,FJ,FK,FM,FO,FR,GA,GB,GD,GE,GF,GG,GH,GI,GL,GM,GN,GP,GQ,GR,GS,GT,GU,GW,GY,HK,HM,HN,HR,HT,HU,ID,IE,IL,IM,IN,IO,IQ,IR,IS,IT,JE,JM,JO,JP,KE,KG,KH,KI,KM,KN,KP,KR,KW,KY,KZ,LA,LB,LC,LI,LK,LR,LS,LT,LU,LV,LY,MA,MC,MD,ME,MF,MG,MH,MK,ML,MM,MN,MO,MP,MQ,MR,MS,MT,MU,MV,MW,MX,MY,MZ,NA,NC,NE,NF,NG,NI,NL,NO,NP,NR,NU,NZ,OM,PA,PE,PF,PG,PH,PK,PL,PM,PN,PR,PS,PT,PW,PY,QA,RE,RO,RS,RU,RW,SA,SB,SC,SD,SE,SG,SH,SI,SJ,SK,SL,SM,SN,SO,SR,SS,ST,SV,SX,SY,SZ,TC,TD,TF,TG,TH,TJ,TK,TL,TM,TN,TO,TR,TT,TV,TW,TZ,UA,UG,UM,US,UY,UZ,VA,VC,VE,VG,VI,VN,VU,WF,WS,YE,YT,ZA,ZM,ZW\" />
# <UDF name=\"state_or_province_name\" label=\"State or Province\" example=\"Example: Pennsylvania\" />
# <UDF name=\"locality_name\" label=\"Locality\" example=\"Example: Philadelphia\" />
# <UDF name=\"organization_name\" label=\"Organization\" example=\"Example: Akamai Technologies\"  />
# <UDF name=\"email_address\" label=\"Email Address\" example=\"Example: user@domain.tld\" />
# <UDF name=\"ca_common_name\" label=\"CA Common Name\" default=\"Redis CA\" />
# <UDF name=\"common_name\" label=\"Common Name\" default=\"Redis Server\"  />
# <UDF name=\"clusterheader\" label=\"Cluster Settings\" default=\"Yes\" header=\"Yes\">
# <UDF name=\"add_ssh_keys\" label=\"Add Account SSH Keys to All Nodes?\" oneof=\"yes,no\"  default=\"yes\" />
# <UDF name=\"cluster_size\" label=\"Redis cluster size\" default=\"3\" oneof=\"3,5\" />

# git repo
export GIT_PAT=\"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\"
export GIT_REPO=\"https://linode-solutions:${GIT_PAT}@github.com/linode-solutions/redis-occ-beta.git\"

# enable logging
exec > >(tee /dev/ttyS0 /var/log/stackscript.log) 2>&1
# source script libraries
source <ssinclude StackScriptID=1>
function cleanup {
  if [ \"$?\" != \"0\" ] || [ \"$SUCCESS\" == \"true\" ]; then
    #deactivate
    cd ${HOME}
    if [ -d \"/tmp/linode\" ]; then
      rm -rf /tmp/linode
    fi
    if [ -d \"/usr/local/bin/run\" ]; then
      rm /usr/local/bin/run
    fi
    stackscript_cleanup
  fi
}
function add_privateip {
  echo \"[info] Adding instance private IP\"
  curl -H \"Content-Type: application/json\" \\
      -H \"Authorization: Bearer ${TOKEN_PASSWORD}\" \\
      -X POST -d '{
        \"type\": \"ipv4\",
        \"public\": false
      }' \\
      https://api.linode.com/v4/linode/instances/${LINODE_ID}/ips
}
function get_privateip {
  curl -s -H \"Content-Type: application/json\" \\
    -H \"Authorization: Bearer ${TOKEN_PASSWORD}\" \\
   https://api.linode.com/v4/linode/instances/${LINODE_ID}/ips | \\
   jq -r '.ipv4.private[].address'
}
function configure_privateip {
  LINODE_IP=$(get_privateip)
  if [ ! -z \"${LINODE_IP}\" ]; then
          echo \"[info] Linode private IP present\"
  else
          echo \"[warn] No private IP found. Adding..\"
          add_privateip
          LINODE_IP=$(get_privateip)
          ip addr add ${LINODE_IP}/17 dev eth0 label eth0:1
  fi
}
function rename_provisioner {
  INSTANCE_PREFIX=$(curl -sH \"Authorization: Bearer ${TOKEN_PASSWORD}\" \"https://api.linode.com/v4/linode/instances/${LINODE_ID}\" | jq -r .label)
  export INSTANCE_PREFIX=\"${INSTANCE_PREFIX}\"
  echo \"[info] renaming the provisioner\"
  curl -s -H \"Content-Type: application/json\" \\
      -H \"Authorization: Bearer ${TOKEN_PASSWORD}\" \\
      -X PUT -d \"{
        \\\"label\\\": \\\"${INSTANCE_PREFIX}1\\\"
      }\" \\
      https://api.linode.com/v4/linode/instances/${LINODE_ID}
}
function setup {
  # install dependencies
  apt-get update && apt-get upgrade -y
  apt-get install -y jq git python3 python3-pip python3-dev build-essential firewalld
  # add private IP address
  rename_provisioner
  configure_privateip
  # write authorized_keys file
  if [ \"${ADD_SSH_KEYS}\" == \"yes\" ]; then
    if [ ! -d ~/.ssh ]; then
            mkdir ~/.ssh
    else
            echo \".ssh directory is already created\"
    fi
    curl -sH \"Content-Type: application/json\" -H \"Authorization: Bearer ${TOKEN_PASSWORD}\" https://api.linode.com/v4/profile/sshkeys | jq -r .data[].ssh_key > /root/.ssh/authorized_keys
  fi
  # clone repo and set up ansible environment
  git clone ${GIT_REPO} /tmp/linode
  cd /tmp/linode
  pip3 install virtualenv
  python3 -m virtualenv env
  source env/bin/activate
  pip install pip --upgrade
  pip install -r requirements.txt
  ansible-galaxy install -r collections.yml
  # copy run script to path
  cp scripts/run.sh /usr/local/bin/run
  chmod +x /usr/local/bin/run
}
# main
setup
run ansible:build
run ansible:deploy && export SUCCESS=\"true\"

まとめ

Linode インスタンス作成時のオプションでもあるマーケットプレイスは、Cloud ManagerのGUIからだけでなく、API, CLI からでも利用できます。Terraform からのインストールも簡単にできますが、クラスタ環境を作成する StackScript では、新たに作成されたノードの管理が課題になります。Terraform に関しては別途記事を書く予定です。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0