Marketplace
Akamai のクラウドコンピューティング・サービスが提供するマーケットプレイスでは、人気があり需要の高いソフトウェアをワンクリックアプリケーションとして提供しています。執筆時点で 100 以上のアプリケーションを選択でき、インストールに関するノウハウを取得しなくても容易にアプリケーションの構築ができます。
正式なドキュメントは下記をご覧ください。
マーケットプレイスからユーザーインタフェースを使ってアプリを簡単に構築することができますが、CLI, API, Terraform からも実行したいという要望があります。本記事は Linode CLI, Linode API を使う方法について記載します。
サンプルコマンドの生成
ポータル画面である Cloud Manager でインスタンスを作成するときに、 create Linode
を実行します。実はこのボタンの隣に Create Using Command Line
のボタンがあります。
このボタンを押すと自動で、Cloud Manager に入れた項目を引数としたコマンドラインのサンプルを生成してくれます。
本記事ではすでに公開されているマーケットプレイスを使って環境構築した Redis Sentinel のケースを API/CLI で実施できるかを検証します。
cURL
cURL のサンプルの入手
Create Using Command Line
を押すと次のポップアップ画面が表示されます。
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 を使ったサンプルコマンドが表示されます。
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 の確認
即座に、ポータル画面でも作成中であることを見ることができます。
今回のケースでは最終的に3ノードのクラスタが作成されますが、最初に一つのノードが作成されます。
残りの作業状況を確認する必要がある場合は、LISH を使うと便利です。LISH では Linode のコンソール画面を見れ、ログイン前でもコンソールに出力される作業中のログを直接みることができます。
最終的に、3つのノードが作成されていることが確認できます。
作業終了のタイミングを知るときも 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 に関しては別途記事を書く予定です。