2021年06月

08

【てくさぽBLOG】WebSphere Hybrid Editionを導入してみた Vol.1 -OpenShift導入編(手順詳細)-

1.本記事について

本記事は「WebSphere Hybrid Editionを導入してみた Vol.1(OpenShift導入編)」のコマンドの詳細を掲載したものです。
本編をご覧頂きながら、詳しいコマンドや実行結果を本記事でご確認ください。

2. 事前準備

2-1. 作業用Linux環境準備

(1)作業用ディレクトリ作成

(2)Azure CLIインストール
インストール→パスを確認→バージョン確認を実行します。

$ curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
$ which az
/usr/bin/az
$ az version
{
 ”azure-cli”: “2.18.0”,
 ”azure-cli-core”: “2.18.0”,
 ”azure-cli-telemetry”: “1.0.6”,
 ”extensions”: {}
}

(3)jqパッケージインストール
yumコマンドでjqパッケージをインストールします。

$ yum -y install epel-release
$ yum -y install jq
$ $ which jq
/usr/bin/jq

(4)cloudctlインストール
ダウンロード→解凍→パスが通った場所に配置します。

$ curl -L https://github.com/IBM/cloud-pak-cli/releases/latest/download/cloudctl-linux-amd64.tar.gz -o cloudctl-linux-amd64.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 160 100 160 0 0 446 0 –:–:– –:–:– –:–:– 446
100 635 100 635 0 0 992 0 –:–:– –:–:– –:–:– 992
100 12.4M 100 12.4M 0 0 4699k 0 0:00:02 0:00:02 –:–:– 7554k$ tar xvf ./cloudctl-linux-amd64.tar.gz
cloudctl-linux-amd64$ sudo mv ./cloudctl-linux-amd64 /usr/local/bin/cloudctl
$ which cloudctl
/usr/local/bin/cloudctl

(5)ocコマンドのインストール

$ tar xvf ./oc-4.5.31-linux.tar.gz
README.md
oc
kubectl$ sudo mv ./oc /usr/local/bin/oc$ which oc
/usr/local/bin/oc

2-2. ファイルの準備

(1)OCP4.5インストールファイルのダウンロード
/home/user01/os45フォルダにダウンロードし、インストールファイルを解凍します。

$ tar xvf openshift-install-linux-4.5.31.tar.gz
README.md
openshift-install

(2)Pull Secretファイル

2-3. パブリックDNSゾーン設定

(1)リソースグループを作成
(2)App Serviceドメインを作成

2-4. サービスプリンシパルの作成

(1)Azureへのログイン(az login)

$ az login
The default web browser has been opened at https://login.microsoftonline.com/common/oauth2/authorize. Please continue the login in the web browser. If no web browser is available or if the web browser fails to open, use device code flow with `az login –use-device-code`.

WebブラウザでのAzure認証画面でログインします。

(2)アクティブなアカウントの詳細を表示して「tenantId」「id」を確認

$ az account list –refresh
[
 {
  “cloudName”: “AzureCloud”,
  “homeTenantId”: “<tenantId>”,
  “id”: “<ID>”,
  “isDefault”: true,
  “managedByTenants”: [],
  “name”: “<サブスクリプション名>”,
  “state”: “Enabled”,
  “tenantId”: “<tenantId>”,
  “user”: {
  “name”: “admin@xxx.onmicrosoft.com”,
“type”: “user”
}
 }
]

(3)アカウントのサービスプリンシパルを作成し「appId」「password」を確認

$ az ad sp create-for-rbac –role Contributor –name ocp_sp

Changing “ocp_sp” to a valid URI of “http://ocp_sp”, which is the required format used for service principal names Creating ‘Contributor’ role assignment under scope ‘/subscriptions/<id>’ Retrying role assignment creation: 1/36
The output includes credentials that you must protect. Be sure that you do not include these credentials in your code or check the credentials into your source control. For more information, see https://aka.ms/azadsp-cli
{
“appId”: “<appId>”,
“displayName”: “ocp_sp”,
“name”: “http://ocp_sp”,
“password”: “<password>”,
“tenant”: “<tenantID>”
}

(4)サービスプリンシパルに追加パーミッションを付与

(4-1)User Access Administrator ロールを割り当て

メモしておいた<appId>をパラメータに利用します。

$ az role assignment create –role “User Access Administrator” –assignee-object-id $(az ad sp list –filter “appId eq ‘<appId>’ ” | jq ‘.[0].objectId’ -r)

{
“canDelegate”: null,
“condition”: null,
“conditionVersion”: null,
“description”: null,
“id”: “/subscriptions/<id>/providers/Microsoft.Authorization/roleAssignments/c02d16cf-c875-4228-99a7-ecfc77d23ff2”,
“name”: “c02d16cf-c875-4228-99a7-ecfc77d23ff2”,
“principalId”: “f56550e6-c2f3-47d1-9e82-be0be7674f9f”,
“principalType”: “ServicePrincipal”,
“roleDefinitionId”: “/subscriptions/<id>/providers/Microsoft.Authorization/roleDefinitions/18d7d88d-d35e-4fb5-a5c3-7773c20a72d9”,
“scope”: “/subscriptions/<id>”,
“type”: “Microsoft.Authorization/roleAssignments”
}

(4-2)Azure Active Directory Graph パーミッションを割り当て

$ az ad app permission add –id <appId> –api 00000002-0000-0000-c000-000000000000 –api-permissions 824c81eb-e3f8-4ee6-8f6d-de7f50d565b7=Role

Invoking “az ad app permission grant –id <appId>–api 00000002-0000-0000-c000-000000000000” is needed to make the change effective

(5)パーミッション要求を承認

$ az ad app permission grant –id <appId> –api 00000002-0000-0000-c000-000000000000

{
“clientId”: “f56550e6-c2f3-47d1-9e82-be0be7674f9f”,
“consentType”: “AllPrincipals”,
“expiryTime”: “2022-02-24T05:15:17.649474”,
“objectId”: “5lBl9fPC0Ueegr4L52dPnzVAb4VRJ4FHiVNygLqyh7c”,
“odata.metadata”: “https://graph.windows.net/<tenantId>/$metadata#oauth2PermissionGrants/@Element”,
“odatatype”: null,
“principalId”: null,
“resourceId”: “856f4035-2751-4781-8953-7280bab287b7”,
“scope”: “user_impersonation”,
“startTime”: “2021-02-24T05:15:17.649474”
}

3.OpenShift 導入

3-1. SSH秘密鍵の作成

(1)作業用Linuxマシン上でssh-keygenコマンドを実行しSSHキーを作成

$ ssh-keygen -t rsa -b 4096 -N ” -f ~/.ssh/id_rsa2
Generating public/private rsa key pair.
Your identification has been saved in /home/user01/.ssh/id_rsa2.
Your public key has been saved in /home/user01/.ssh/id_rsa2.pub.
The key fingerprint is:
SHA256:kKB23rSxmb6ZjQA9eMaLYoXWxsounLQ160TxrOpf2VY user01@A2470
The key’s randomart image is:
+—[RSA 4096]—-+
| . |
| . . . |
| o.. = |
| .+*+o B |
| oo*Bo* SE |
|o.=B.+o . |
|++=o=o.o |
|+=o….* |
|o+oo = . |
+—-[SHA256]—–+

(2)ssh-agent プロセスをバックグラウンドタスクとして開始

$ eval “$(ssh-agent -s)”
Agent pid 3306

(3)SSH プライベートキーを ssh-agent に追加

$ ssh-add ~/.ssh/id_rsa2
Identity added: /home/user01/.ssh/id_rsa2 (/home/user01/.ssh/id_rsa2)

3-2. インストールファイルの作成

(1)install-config.yaml ファイル生成

$ cd /home/user01/os45
$ ./openshift-install create install-config –dir=/home/user01/os45
? SSH Public Key /home/user01/.ssh/id_rsa2.pub ← プロンプトで入力
? Platform azure ← プロンプトで入力
? azure subscription id <id> ← プロンプトで入力
? azure tenant id <tenantId> ← プロンプトで入力
? azure service principal client id <appId> ← プロンプトで入力
? azure service principal client secret [? for help] ******<password>******* ← プロンプトで入力
INFO Saving user credentials to “/home/user01/.azure/osServicePrincipal.json”
INFO Credentials loaded from file “/home/user01/.azure/osServicePrincipal.json”
? Region japaneast ← プロンプトで入力
? Base Domain ← プロンプトで入力
? Cluster Name nicpwhecluster ← プロンプトで入力
? Pull Secret [? for help] ← 事前にダウンロードしたPull Secretを貼り付け ********************************************************************************************

※特に完了のメッセージは表示されません

(2)ARM テンプレートの一般的な変数のエクスポート

$ export CLUSTER_NAME=nicpwhecluster
$ export AZURE_REGION=japaneast
$ export SSH_KEY=””ssh-rsa AAAAB3Nza<以下、省略>””
$ export BASE_DOMAIN=
$ export BASE_DOMAIN_RESOURCE_GROUP=ocp-cluster
$ export KUBECONFIG=/home/user01/os45/auth/kubeconfig

(3)クラスターの Kubernetes マニフェストを生成

$ ./openshift-install create manifests –dir=/home/user01/os45/
“INFO Credentials loaded from file “”/home/user01/.azure/osServicePrincipal.json””
INFO Consuming Install Config from target directory”

(4)コントロールプレーン、ワーカーノードを定義する Kubernetes マニフェストファイルを削除

$ rm -f /home/user01/os45/openshift/99_openshift-cluster-api_master-machines-*.yaml
$ rm -f /home/user01/os45/openshift/99_openshift-cluster-api_worker-machineset-*.yaml

※これらのファイルを削除することで、クラスターが自動的に生成するのを防ぎます。

(5)Kubernetes マニフェストファイルを変更
/home/user01/os45/manifests/cluster-scheduler-02-config.yml を変更し、Pod がコントロールプレーンにスケジュールされないようにします。
manifests/cluster-scheduler-02-config.yml ファイルをエディタで開き、”mastersSchedulable”パラメーターの値を False に設定し、保存、終了します。

(6)変数のエクスポート

$ export INFRA_ID=nicpwhecluster-h8lq5
$ export RESOURCE_GROUP=nicpwhecluster-h8lq5-rg

(7)Ignition 設定ファイルを取得

$ ./openshift-install create ignition-configs –dir=/home/user01/os45/

INFO Consuming OpenShift Install (Manifests) from target directory
INFO Consuming Openshift Manifests from target directory
INFO Consuming Common Manifests from target directory
INFO Consuming Master Machines from target directory
INFO Consuming Worker Machines from target directory

(8)ファイルの確認
os45に生成された”bootstrap.ign”ファイル、”master.ign”ファイル、”metadata.json”ファイル、”worker.ign”ファイルがあることを確認します。

$ ls -al /home/user01/os45
total 91924
drwxrwxr-x 1 user01 user01 4096 Feb 24 15:10 .
drwxr-xr-x 1 user01 user01 4096 Feb 24 15:09 ..
-rw-rw-r– 1 user01 user01 77773 Feb 24 15:10 .openshift_install.log
-rw-r—– 1 user01 user01 1274855 Feb 24 15:10 .openshift_install_state.json
drwxr-x— 1 user01 user01 4096 Feb 24 15:10 auth
-rw-r—– 1 user01 user01 302438 Feb 24 15:10 bootstrap.ign
drwxrwxr-x 1 user01 user01 4096 Feb 24 09:52 conf
-rw-r—– 1 user01 user01 4346 Feb 24 14:47 install-config.yaml.org
-rw-r—– 1 user01 user01 1847 Feb 24 15:10 master.ign
-rw-r—– 1 user01 user01 147 Feb 24 15:10 metadata.json
-rw-r–r– 1 user01 user01 92429691 Feb 12 16:46 openshift-install-linux-4.5.31.tar.gz
-rw-r–r– 1 user01 user01 2779 Feb 12 15:37 pull-secret.txt
-rw-r–r– 1 user01 user01 50 Feb 12 15:37 pull-secret.txt:Zone.Identifier
-rw-r—– 1 user01 user01 1847 Feb 24 15:10 worker.ign

同様に/home/user01/os45/auth内に”kubeadmin-password”と”kubeconfig”があることを確認

user01@A2470:~$ ls -al /home/user01/os45/auth/
total 12
drwxr-x— 1 user01 user01 4096 Feb 24 15:10 .
drwxrwxr-x 1 user01 user01 4096 Feb 24 15:10 ..
-rw-r—– 1 user01 user01 23 Feb 24 15:10 kubeadmin-password
-rw-r—– 1 user01 user01 8992 Feb 24 15:10 kubeconfig

3-3. Azure リソースグループおよびアイデンティティーの作成

(1)リソースグループを作成

$ az group create –name ${RESOURCE_GROUP} –location ${AZURE_REGION}

{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg”,
“location”: “japaneast”,
“managedBy”: null,
“name”: “nicpwhecluster-h8lq5-rg”,
“properties”: {
“provisioningState”: “Succeeded”
},
“tags”: null,
“type”: “Microsoft.Resources/resourceGroups”
}

(2)リソースグループの Azure アイデンティティーを作成

$ az identity create -g ${RESOURCE_GROUP} -n ${INFRA_ID}-identity

{
“clientId”: “487b4852-018d-4289-94f7-24db4bef3811”,
“clientSecretUrl”: “https://control-japaneast.identity.azure.net/subscriptions/<id>/resourcegroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/nicpwhecluster-h8lq5-identity/credentials?tid=<tenantId>&oid=f0273f5e-4c1b-4cf4-b3ac-14ad28344d17&aid=487b4852-018d-4289-94f7-24db4bef3811”,
“id”: “/subscriptions/<id>/resourcegroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/nicpwhecluster-h8lq5-identity”,
“location”: “japaneast”,
“name”: “nicpwhecluster-h8lq5-identity”,
“principalId”: “f0273f5e-4c1b-4cf4-b3ac-14ad28344d17”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“tags”: {},
“tenantId”: “<tenantID>”,
“type”: “Microsoft.ManagedIdentity/userAssignedIdentities”
}

(3)Contributor ロールを Azure アイデンティティーに付与

(3-1)ロール割当に必要な変数をエクスポート

$ export PRINCIPAL_ID=`az identity show -g ${RESOURCE_GROUP} -n ${INFRA_ID}-identity –query principalId –out tsv`
$ export RESOURCE_GROUP_ID=`az group show -g ${RESOURCE_GROUP} –query id –out tsv`

(3-2)Contributor ロールをアイデンティティーに割り当て

$ az role assignment create –assignee “${PRINCIPAL_ID}” –role ‘Contributor’ –scope “${RESOURCE_GROUP_ID}”

{
“canDelegate”: null,
“condition”: null,
“conditionVersion”: null,
“description”: null,
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Authorization/roleAssignments/0b0302ab-9ca5-4b85-a2f3-a0f7c7cded77”,
“name”: “0b0302ab-9ca5-4b85-a2f3-a0f7c7cded77”,
“principalId”: “f0273f5e-4c1b-4cf4-b3ac-14ad28344d17”,
“principalType”: “ServicePrincipal”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“roleDefinitionId”: “/subscriptions/<id>/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c”,
“scope”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg”,
“type”: “Microsoft.Authorization/roleAssignments”
}

3-4. RHCOS クラスターイメージおよびブートストラップ Ignition 設定ファイルのアップロード

(1)Azureストレージアカウントの作成

$ az storage account create -g ${RESOURCE_GROUP} –location ${AZURE_REGION} –name ${CLUSTER_NAME}sa –kind Storage –sku Standard_LRS

Resource provider ‘Microsoft.Storage’ used by this operation is not registered. We are registering for you.
Registration succeeded.
{- Finished ..
“accessTier”: null,
“allowBlobPublicAccess”: null,
“azureFilesIdentityBasedAuthentication”: null,
“blobRestoreStatus”: null,
“creationTime”: “2021-02-24T06:16:35.567172+00:00”,
“customDomain”: null,
“enableHttpsTrafficOnly”: true,
“encryption”: {
“keySource”: “Microsoft.Storage”,
“keyVaultProperties”: null,
“requireInfrastructureEncryption”: null,
“services”: {
“blob”: {
“enabled”: true,
“keyType”: “Account”,
“lastEnabledTime”: “2021-02-24T06:16:35.629673+00:00”
},
“file”: {
“enabled”: true,
“keyType”: “Account”,
“lastEnabledTime”: “2021-02-24T06:16:35.629673+00:00”
},
“queue”: null,
“table”: null
}
},
“failoverInProgress”: null,
“geoReplicationStats”: null,
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Storage/storageAccounts/nicpwheclustersa”,
“identity”: null,
“isHnsEnabled”: null,
“isHnsEnabled”: null,
“kind”: “Storage”,
“largeFileSharesState”: null,
“lastGeoFailoverTime”: null,
“location”: “japaneast”,
“minimumTlsVersion”: null,
“name”: “nicpwheclustersa”,
“networkRuleSet”: {
“bypass”: “AzureServices”,
“defaultAction”: “Allow”,
“ipRules”: [],
“virtualNetworkRules”: []
},
“primaryEndpoints”: {
“blob”: “https://nicpwheclustersa.blob.core.windows.net/”,
“dfs”: null,
“file”: “https://nicpwheclustersa.file.core.windows.net/”,
“internetEndpoints”: null,
“microsoftEndpoints”: null,
“queue”: “https://nicpwheclustersa.queue.core.windows.net/”,
“table”: “https://nicpwheclustersa.table.core.windows.net/”,
“web”: null
},
“primaryLocation”: “japaneast”,
“privateEndpointConnections”: [],
“provisioningState”: “Succeeded”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“routingPreference”: null,
“secondaryEndpoints”: null,
“secondaryLocation”: null,
“sku”: {
“name”: “Standard_LRS”,
“tier”: “Standard”
},
“statusOfPrimary”: “available”,
“statusOfSecondary”: null,
“tags”: {},
“type”: “Microsoft.Storage/storageAccounts”
}

(2)ストレージアカウントキーを環境変数としてエクスポート

$ export ACCOUNT_KEY=`az storage account keys list -g ${RESOURCE_GROUP} –account-name ${CLUSTER_NAME}sa –query “[0].value” -o tsv`

(3)VHD の URL を環境変数にエクスポート
今回はOCP4.5で構築するのでrelease-4.5ディレクトリを指定します。

$ export VHD_URL=`curl -s https://raw.githubusercontent.com/openshift/installer/release-4.5/data/data/rhcos.json | jq -r .azure.url`

(4)選択した VHD を blob にコピー

$ az storage container create –name vhd –account-name ${CLUSTER_NAME}sa –account-key ${ACCOUNT_KEY}

{
“created”: true
}

コピーがスタートしたら、コマンドを実行してステータスを確認します。「Success」なったら完了です。

$ az storage blob copy start –account-name ${CLUSTER_NAME}sa –account-key ${ACCOUNT_KEY} –destination-blob “rhcos.vhd” –destination-container vhd –source-uri “${VHD_URL}”
{
“completionTime”: null,
“id”: “afe1cb0f-9194-40b4-9a6c-d8f25c7b69bd”,
“progress”: null,
“source”: null,
“status”: “pending”,
“statusDescription”: null
}(状況確認コマンド)
$ az storage blob show –container-name vhd –name “rhcos.vhd” –account-name ${CLUSTER_NAME}sa –account-key ${ACCOUNT_KEY} -o tsv –query properties.copy.status
success

(5)blob ストレージコンテナーを作成します。

$ az storage container create –name files –account-name ${CLUSTER_NAME}sa –account-key ${ACCOUNT_KEY} –public-access blob

{
“created”: true
}

続いて、生成されたbootstrap.ignファイルをアップロードします。

$ az storage blob upload –account-name ${CLUSTER_NAME}sa –account-key ${ACCOUNT_KEY} -c “files” -f “/home/user01/os45/bootstrap.ign” -n “bootstrap.ign”

{
“etag”: “00000002-0000-0000-8f3c-b41b770ad701”,
“id”: “/subscriptions/<id>/resourceGroups/ocp-cluster/providers/Microsoft.Network/dnszones/nicpwhecluster.”,
“location”: “global”,
“maxNumberOfRecordSets”: 10000,
“name”: “nicpwhecluster.”,
“nameServers”: [
“ns1-05.azure-dns.com.”,
“ns2-05.azure-dns.net.”,
“ns3-05.azure-dns.org.”,
“ns4-05.azure-dns.info.”
],
“numberOfRecordSets”: 2,
“registrationVirtualNetworks”: null,
“resolutionVirtualNetworks”: null,
“resourceGroup”: “ocp-cluster”,
“tags”: {},
“type”: “Microsoft.Network/dnszones”,
“zoneType”: “Public”
}

3-5. DNSゾーンの作成

(1)プライベートDNSゾーンを作成

$ az network dns zone create -g ${BASE_DOMAIN_RESOURCE_GROUP} -n \${CLUSTER_NAME}.${BASE_DOMAIN}

 {-Finished ..
“etag”: “02474d3c-85a2-4a48-8650-e837ea7df63b”,
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/privateDnsZones/nicpwhecluster.”,
“location”: “global”,
“maxNumberOfRecordSets”: 25000,
“maxNumberOfVirtualNetworkLinks”: 1000,
“maxNumberOfVirtualNetworkLinksWithRegistration”: 100,
“name”: “nicpwhecluster.”,
“numberOfRecordSets”: 1,
“numberOfVirtualNetworkLinks”: 0,
“numberOfVirtualNetworkLinksWithRegistration”: 0,
“provisioningState”: “Succeeded”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“tags”: null,
“type”: “Microsoft.Network/privateDnsZones”
}

3-6. Azure での VNet の作成

(1)デプロイメントを作成
マニュアルページにある「VNet の ARM テンプレート」の内容をコピーして/home/user01/os45ディレクトリに01_vnet.jsonというファイルを作成し、コマンドを実行

$ az deployment group create -g ${RESOURCE_GROUP} –template-file “/home/user01/os45/01_vnet.json” –parameters baseName=”${INFRA_ID}”

{- Finished ..
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Resources/deployments/01_vnet”,
“location”: null,
“name”: “01_vnet”,
“properties”: {
“correlationId”: “0a44ba18-b094-41b1-9be5-16ae14c50593”,
“debugSetting”: null,
“dependencies”: [
{
“dependsOn”: [
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/networkSecurityGroups/nicpwhecluster-h8lq5-nsg”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster-h8lq5-nsg”,
“resourceType”: “Microsoft.Network/networkSecurityGroups”
}
],
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/virtualNetworks/nicpwhecluster-h8lq5-vnet”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster-h8lq5-vnet”,
“resourceType”: “Microsoft.Network/virtualNetworks”
}
],
“duration”: “PT9.5604786S”,
“error”: null,
“mode”: “Incremental”,
“onErrorDeployment”: null,
“outputResources”: [
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/networkSecurityGroups/nicpwhecluster-h8lq5-nsg”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/virtualNetworks/nicpwhecluster-h8lq5-vnet”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
}
],
“outputs”: null,
“parameters”: {
“baseName”: {
“type”: “String”,
“value”: “nicpwhecluster-h8lq5”
}
},
“parametersLink”: null,
“providers”: [
{
“id”: null,
“namespace”: “Microsoft.Network”,
“registrationPolicy”: null,
“registrationState”: null,
“resourceTypes”: [
{
“aliases”: null,
“apiProfiles”: null,
“apiVersions”: null,
“capabilities”: null,
“defaultApiVersion”: null,
“locationMappings”: null,
“locations”: [
“japaneast”
],
“properties”: null,
“resourceType”: “virtualNetworks”
},
{
“aliases”: null,
“apiProfiles”: null,
“apiVersions”: null,
“capabilities”: null,
“defaultApiVersion”: null,
“locationMappings”: null,
“locations”: [
“japaneast”
],
“properties”: null,
“resourceType”: “networkSecurityGroups”
}
]
}
],
“provisioningState”: “Succeeded”,
“templateHash”: “16546001156426103307”,
“templateLink”: null,
“timestamp”: “2021-02-24T06:39:35.707206+00:00”,
“validatedResources”: null
},
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“tags”: null,
“type”: “Microsoft.Resources/deployments”
}

(2)VNet テンプレートをプライベート DNS ゾーンにリンク

$ az network private-dns link vnet create -g ${RESOURCE_GROUP} -z ${CLUSTER_NAME}.${BASE_DOMAIN} -n ${INFRA_ID}-network-link -v “${INFRA_ID}-vnet” -e false

{- Finished ..
“etag”: “\”7e02aec1-0000-0100-0000-6035f4fb0000\””,
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/privateDnsZones/nicpwhecluster./virtualNetworkLinks/nicpwhecluster-h8lq5-network-link”,
“location”: “global”,
“name”: “nicpwhecluster-h8lq5-network-link”,
“provisioningState”: “Succeeded”,
“registrationEnabled”: false,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“tags”: null,
“type”: “Microsoft.Network/privateDnsZones/virtualNetworkLinks”,
“virtualNetwork”: {
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/virtualNetworks/nicpwhecluster-h8lq5-vnet”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
},
“virtualNetworkLinkState”: “Completed”
}

3-7. RHCOS クラスターイメージのデプロイ

(1)RHCOS VHD blob URL を変数としてエクスポート

$ export VHD_BLOB_URL=`az storage blob url –account-name ${CLUSTER_NAME}sa –account-key ${ACCOUNT_KEY} -c vhd -n “rhcos.vhd” -o tsv`

(2)クラスターイメージのデプロイ
マニュアルページにある「イメージストレージの ARM テンプレート」の内容をコピーして/home/user01/os45ディレクトリに02_storage.jsonというファイルを作成し、コマンドを実行します。

$ az deployment group create -g ${RESOURCE_GROUP} –template-file “/home/user01/os45/02_storage.json” –parameters vhdBlobURL=”${VHD_BLOB_URL}” –parameters baseName=”${INFRA_ID}”

– Finished ..
{- Finished ..
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Resources/deployments/02_storage”,
“location”: null,
“name”: “02_storage”,
“properties”: {
“correlationId”: “0d04f61c-907e-4ccb-b364-a5c50c0e9ae7”,
“debugSetting”: null,
“dependencies”: [],
“duration”: “PT13.9015046S”,
“error”: null,
“mode”: “Incremental”,
“onErrorDeployment”: null,
“outputResources”: [
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Compute/images/nicpwhecluster-h8lq5-image”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
}
],
“outputs”: null,
“parameters”: {
“baseName”: {
“type”: “String”,
“value”: “nicpwhecluster-h8lq5”
},
“vhdBlobURL”: {
“type”: “String”,
“value”: “https://nicpwheclustersa.blob.core.windows.net/vhd/rhcos.vhd”
}
},
“parametersLink”: null,
“providers”: [
{
“id”: null,
“namespace”: “Microsoft.Compute”,
“registrationPolicy”: null,
“registrationState”: null,
“resourceTypes”: [
{
“aliases”: null,
“apiProfiles”: null,
“apiVersions”: null,
“capabilities”: null,
“defaultApiVersion”: null,
“locationMappings”: null,
“locations”: [
“japaneast”
],
“properties”: null,
“resourceType”: “images”
}
]
}
],
“provisioningState”: “Succeeded”,
“templateHash”: “723175588916620424”,
“templateLink”: null,
“timestamp”: “2021-02-24T06:45:00.292869+00:00”,
“validatedResources”: null
},
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“tags”: null,
“type”: “Microsoft.Resources/deployments”
}

3-8.ネットワークおよび負荷分散コンポーネントの作成

(1)ネットワークオブジェクトおよびロードバランサーのデプロイ
マニュアルページにある「ネットワークおよびロードバランサーの ARM テンプレート」の内容をコピーして/home/user01/os45ディレクトリに03_infra.jsonというファイルを作成し、コマンドを実行します。

$ az deployment group create -g ${RESOURCE_GROUP} –template-file “/home/user01/os45/03_infra.json” –parameters privateDNSZoneName=”${CLUSTER_NAME}.${BASE_DOMAIN}” –parameters baseName=”${INFRA_ID}”

{- Finished ..
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Resources/deployments/03_infra”,
“location”: null,
“name”: “03_infra”,
“properties”: {
“correlationId”: “32467378-c2a4-4e99-b950-9b3ba06ba768”,
“debugSetting”: null,
“dependencies”: [
{
“dependsOn”: [
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/publicIPAddresses/nicpwhecluster-h8lq5-master-pip”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster-h8lq5-master-pip”,
“resourceType”: “Microsoft.Network/publicIPAddresses”
}
],
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/loadBalancers/nicpwhecluster-h8lq5-public-lb”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster-h8lq5-public-lb”,
“resourceType”: “Microsoft.Network/loadBalancers”
},
{
“dependsOn”: [
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/loadBalancers/nicpwhecluster-h8lq5-internal-lb”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster-h8lq5-internal-lb”,
“resourceType”: “Microsoft.Network/loadBalancers”
}
],
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/privateDnsZones/nicpwhecluster./A/api”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster./api”,
“resourceType”: “Microsoft.Network/privateDnsZones/A”
},
{
“dependsOn”: [
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/loadBalancers/nicpwhecluster-h8lq5-internal-lb”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster-h8lq5-internal-lb”,
“resourceType”: “Microsoft.Network/loadBalancers”
}
],
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/privateDnsZones/nicpwhecluster./A/api-int”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster./api-int”,
“resourceType”: “Microsoft.Network/privateDnsZones/A”
}
],
“duration”: “PT7.2301651S”,
“error”: null,
“mode”: “Incremental”,
“onErrorDeployment”: null,
“outputResources”: [
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/loadBalancers/nicpwhecluster-h8lq5-internal-lb”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/loadBalancers/nicpwhecluster-h8lq5-public-lb”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/privateDnsZones/nicpwhecluster./A/api”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/privateDnsZones/nicpwhecluster./A/api-int”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/publicIPAddresses/nicpwhecluster-h8lq5-master-pip”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
}
],
“outputs”: null,
“parameters”: {
“baseName”: {
“type”: “String”,
“value”: “nicpwhecluster-h8lq5”
},
“privateDNSZoneName”: {
“type”: “String”,
“value”: “nicpwhecluster.”
}
},
“parametersLink”: null,
“providers”: [
{
“id”: null,
“namespace”: “Microsoft.Network”,
“registrationPolicy”: null,
“registrationState”: null,
“resourceTypes”: [
{
“aliases”: null,
“apiProfiles”: null,
“apiVersions”: null,
“capabilities”: null,
“defaultApiVersion”: null,
“locationMappings”: null,
“locations”: [
“japaneast”
],
“properties”: null,
“resourceType”: “publicIPAddresses”
},
{
“aliases”: null,
“apiProfiles”: null,
“apiVersions”: null,
“capabilities”: null,
“defaultApiVersion”: null,
“locationMappings”: null,
“locations”: [
“japaneast”
],
“properties”: null,
“resourceType”: “loadBalancers”
},
{
“aliases”: null,
“apiProfiles”: null,
“apiVersions”: null,
“capabilities”: null,
“defaultApiVersion”: null,
“locationMappings”: null,
“locations”: [
“japaneast”
],
“properties”: null,
“resourceType”: “privateDnsZones/A”
}
]
}
],
“provisioningState”: “Succeeded”,
“templateHash”: “8527193543920854248”,
“templateLink”: null,
“timestamp”: “2021-02-24T07:02:29.639760+00:00”,
“validatedResources”: null
},
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“tags”: null,
“type”: “Microsoft.Resources/deployments”
}

(2)変数のエクスポートとクラスターを既存のパブリックゾーンに追加
まず変数をエクスポートします。

$ export PUBLIC_IP=`az network public-ip list -g ${RESOURCE_GROUP} –query “[?name==’${INFRA_ID}-master-pip’] | [0].ipAddress” -o tsv`

クラスターを既存のパブリックゾーンに追加します。

$ az network dns record-set a add-record -g ${BASE_DOMAIN_RESOURCE_GROUP} -z ${BASE_DOMAIN} -n api.${CLUSTER_NAME} -a ${PUBLIC_IP} –ttl 60

{
“arecords”: [
{
“ipv4Address”: “20.78.25.157”
}
],
“etag”: “e1b034dc-580a-460e-8579-d7789e6aa43c”,
“fqdn”: “api.nicpwhecluster..”,
“id”: “/subscriptions/<id>/resourceGroups/ocp-cluster/providers/Microsoft.Network/dnszones//A/api.nicpwhecluster”,
“metadata”: null,
“name”: “api.nicpwhecluster”,
“provisioningState”: “Succeeded”,
“resourceGroup”: “ocp-cluster”,
“targetResource”: {
“id”: null
},
“ttl”: 60,
“type”: “Microsoft.Network/dnszones/A”
}

3-9.ノードの作成

(1)ブートストラップマシンの作成
まず変数をエクスポートします。

$ export BOOTSTRAP_URL=`az storage blob url –account-name ${CLUSTER_NAME}sa –account-key ${ACCOUNT_KEY} -c “files” -n “bootstrap.ign” -o tsv`

$ export BOOTSTRAP_IGNITION=`jq -rcnM –arg v “2.2.0” –arg url ${BOOTSTRAP_URL} ‘{ignition:{version:$v,config:{replace:{source:$url}}}}’ | base64 -w0`

マニュアルページにある「ブートストラップマシンの ARM テンプレート」の内容をコピーして/home/user01/os45ディレクトリに04_bootstrap.jsonというファイルを作成し、コマンドを実行します。

$ az deployment group create -g ${RESOURCE_GROUP} –template-file “/home/user01/os45/04_bootstrap.json” –parameters bootstrapIgnition=”${BOOTSTRAP_IGNITION}” –parameters sshKeyData=”${SSH_KEY}” –parameters baseName=”${INFRA_ID}”

{- Finished ..
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Resources/deployments/04_bootstrap”,
“location”: null,
“name”: “04_bootstrap”,
“properties”: {
“correlationId”: “6bfb12f9-fade-4ab0-99e2-a6acc50a0e67”,
“debugSetting”: null,
“dependencies”: [
{
“dependsOn”: [
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/publicIPAddresses/nicpwhecluster-h8lq5-bootstrap-ssh-pip”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster-h8lq5-bootstrap-ssh-pip”,
“resourceType”: “Microsoft.Network/publicIPAddresses”
}
],
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/networkInterfaces/nicpwhecluster-h8lq5-bootstrap-nic”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster-h8lq5-bootstrap-nic”,
“resourceType”: “Microsoft.Network/networkInterfaces”
},
{
“dependsOn”: [
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/networkInterfaces/nicpwhecluster-h8lq5-bootstrap-nic”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster-h8lq5-bootstrap-nic”,
“resourceType”: “Microsoft.Network/networkInterfaces”
}
],
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Compute/virtualMachines/nicpwhecluster-h8lq5-bootstrap”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster-h8lq5-bootstrap”,
“resourceType”: “Microsoft.Compute/virtualMachines”
},
{
“dependsOn”: [
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Compute/virtualMachines/nicpwhecluster-h8lq5-bootstrap”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster-h8lq5-bootstrap”,
“resourceType”: “Microsoft.Compute/virtualMachines”
}
],
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/networkSecurityGroups/nicpwhecluster-h8lq5-nsg/securityRules/bootstrap_ssh_in”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster-h8lq5-nsg/bootstrap_ssh_in”,
“resourceType”: “Microsoft.Network/networkSecurityGroups/securityRules”
}
],
“duration”: “PT2M34.7216702S”,
“error”: null,
“mode”: “Incremental”,
“onErrorDeployment”: null,
“outputResources”: [
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Compute/virtualMachines/nicpwhecluster-h8lq5-bootstrap”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/networkInterfaces/nicpwhecluster-h8lq5-bootstrap-nic”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/networkSecurityGroups/nicpwhecluster-h8lq5-nsg/securityRules/bootstrap_ssh_in”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/publicIPAddresses/nicpwhecluster-h8lq5-bootstrap-ssh-pip”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
}
],
“outputs”: null,
“parameters”: {
“baseName”: {
“type”: “String”,
“value”: “nicpwhecluster-h8lq5”
},
“bootstrapIgnition”: {
“type”: “String”,
“value”: “eyJpZ25pdGlvbiI6eyJ2ZXJzaW9uIjoiMi4yLjAiLCJjb25maWciOnsicmVwbGFjZSI6eyJzb3VyY2UiOiJodHRwczovL25pY3B3aGVjbHVzdGVyc2EuYmxvYi5jb3JlLndpbmRvd3MubmV0L2ZpbGVzL2Jvb3RzdHJhcC5pZ24ifX19fQo=”
},
“bootstrapVMSize”: {
“type”: “String”,
“value”: “Standard_D4s_v3”
},
“sshKeyData”: {
“type”: “SecureString”
}
},
“parametersLink”: null,
“providers”: [
{
“id”: null,
“namespace”: “Microsoft.Network”,
“registrationPolicy”: null,
“registrationState”: null,
“resourceTypes”: [
{
“aliases”: null,
“apiProfiles”: null,
“apiVersions”: null,
“capabilities”: null,
“defaultApiVersion”: null,
“locationMappings”: null,
“locations”: [
“japaneast”
],
“properties”: null,
“resourceType”: “publicIPAddresses”
},
{
“aliases”: null,
“apiProfiles”: null,
“apiVersions”: null,
“capabilities”: null,
“defaultApiVersion”: null,
“locationMappings”: null,
“locations”: [
“japaneast”
],
“properties”: null,
“resourceType”: “networkInterfaces”
},
{
“aliases”: null,
“apiProfiles”: null,
“apiVersions”: null,
“capabilities”: null,
“defaultApiVersion”: null,
“locationMappings”: null,
“locations”: [
“japaneast”
],
“properties”: null,
“resourceType”: “networkSecurityGroups/securityRules”
}
]
},
{
“id”: null,
“namespace”: “Microsoft.Compute”,
“registrationPolicy”: null,
“registrationState”: null,
“resourceTypes”: [
{
“aliases”: null,
“apiProfiles”: null,
“apiVersions”: null,
“capabilities”: null,
“defaultApiVersion”: null,
“locationMappings”: null,
“locations”: [
“japaneast”
],
“properties”: null,
“resourceType”: “virtualMachines”
}
]
}
],
“provisioningState”: “Succeeded”,
“templateHash”: “61131872004139608”,
“templateLink”: null,
“timestamp”: “2021-02-24T07:15:18.354401+00:00”,
“validatedResources”: null
},
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“tags”: null,
“type”: “Microsoft.Resources/deployments”
}

(2)コントロールプレーンの作成
マニュアルページにある「コントロールプレーンマシンの ARM テンプレート」の内容をコピーして/home/user01/os45ディレクトリに05_masters.jsonというファイルを作成し、コマンドを実行します。

$ az deployment group create -g ${RESOURCE_GROUP} –template-file “/home/user01/os45/05_masters.json” –parameters masterIgnition=”${MASTER_IGNITION}” –parameters sshKeyData=”${SSH_KEY}” –parameters privateDNSZoneName=”${CLUSTER_NAME}.${BASE_DOMAIN}” –parameters baseName=”${INFRA_ID}”

{- Finished ..
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Resources/deployments/05_masters”,
“location”: null,
“name”: “05_masters”,
“properties”: {
“correlationId”: “8d3c2bed-113b-4889-8aa7-b0bfba69ea74”,
“debugSetting”: null,
“dependencies”: [
{
“dependsOn”: [
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/networkInterfaces/nicpwhecluster-h8lq5-master-0-nic”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster-h8lq5-master-0-nic”,
“resourceType”: “Microsoft.Network/networkInterfaces”
}
],
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/privateDnsZones/nicpwhecluster./A/etcd-0”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster./etcd-0”,
“resourceType”: “Microsoft.Network/privateDnsZones/A”
},
{
“dependsOn”: [
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/networkInterfaces/nicpwhecluster-h8lq5-master-1-nic”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster-h8lq5-master-1-nic”,
“resourceType”: “Microsoft.Network/networkInterfaces”
}
],
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/privateDnsZones/nicpwhecluster./A/etcd-1”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster./etcd-1”,
“resourceType”: “Microsoft.Network/privateDnsZones/A”
},
{
“dependsOn”: [
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/networkInterfaces/nicpwhecluster-h8lq5-master-2-nic”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster-h8lq5-master-2-nic”,
“resourceType”: “Microsoft.Network/networkInterfaces”
}
],
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/privateDnsZones/nicpwhecluster./A/etcd-2”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster./etcd-2”,
“resourceType”: “Microsoft.Network/privateDnsZones/A”
},
{
“dependsOn”: [
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/networkInterfaces/nicpwhecluster-h8lq5-master-0-nic”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster-h8lq5-master-0-nic”,
“resourceType”: “Microsoft.Network/networkInterfaces”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/privateDnsZones/nicpwhecluster./A/etcd-0”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster./etcd-0”,
“resourceType”: “Microsoft.Network/privateDnsZones/A”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/privateDnsZones/nicpwhecluster./SRV/_etcd-server-ssl._tcp”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster./_etcd-server-ssl._tcp”,
“resourceType”: “Microsoft.Network/privateDnsZones/SRV”
}
],
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Compute/virtualMachines/nicpwhecluster-h8lq5-master-0”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster-h8lq5-master-0”,
“resourceType”: “Microsoft.Compute/virtualMachines”
},
{
“dependsOn”: [
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/networkInterfaces/nicpwhecluster-h8lq5-master-1-nic”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster-h8lq5-master-1-nic”,
“resourceType”: “Microsoft.Network/networkInterfaces”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/privateDnsZones/nicpwhecluster./A/etcd-1”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster./etcd-1”,
“resourceType”: “Microsoft.Network/privateDnsZones/A”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/privateDnsZones/nicpwhecluster./SRV/_etcd-server-ssl._tcp”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster./_etcd-server-ssl._tcp”,
“resourceType”: “Microsoft.Network/privateDnsZones/SRV”
}
],
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Compute/virtualMachines/nicpwhecluster-h8lq5-master-1”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster-h8lq5-master-1”,
“resourceType”: “Microsoft.Compute/virtualMachines”
},
{
“dependsOn”: [
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/networkInterfaces/nicpwhecluster-h8lq5-master-2-nic”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster-h8lq5-master-2-nic”,
“resourceType”: “Microsoft.Network/networkInterfaces”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/privateDnsZones/nicpwhecluster./A/etcd-2”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster./etcd-2”,
“resourceType”: “Microsoft.Network/privateDnsZones/A”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/privateDnsZones/nicpwhecluster./SRV/_etcd-server-ssl._tcp”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster./_etcd-server-ssl._tcp”,
“resourceType”: “Microsoft.Network/privateDnsZones/SRV”
}
],
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Compute/virtualMachines/nicpwhecluster-h8lq5-master-2”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“resourceName”: “nicpwhecluster-h8lq5-master-2”,
“resourceType”: “Microsoft.Compute/virtualMachines”
}
],
“duration”: “PT2M25.3829982S”,
“error”: null,
“mode”: “Incremental”,
“onErrorDeployment”: null,
“outputResources”: [
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Compute/virtualMachines/nicpwhecluster-h8lq5-master-0”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Compute/virtualMachines/nicpwhecluster-h8lq5-master-1”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Compute/virtualMachines/nicpwhecluster-h8lq5-master-2”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/networkInterfaces/nicpwhecluster-h8lq5-master-0-nic”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/networkInterfaces/nicpwhecluster-h8lq5-master-1-nic”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/networkInterfaces/nicpwhecluster-h8lq5-master-2-nic”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/privateDnsZones/nicpwhecluster./A/etcd-0”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/privateDnsZones/nicpwhecluster./A/etcd-1”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/privateDnsZones/nicpwhecluster./A/etcd-2”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/privateDnsZones/nicpwhecluster./SRV/_etcd-server-ssl._tcp”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
}
],
“outputs”: null,
“parameters”: {
“baseName”: {
“type”: “String”,
“value”: “nicpwhecluster-h8lq5”
},
“diskSizeGB”: {
“type”: “Int”,
“value”: 1024
},
“masterIgnition”: {
“type”: “String”,
“value”: “eyJpZ25pdGlvbiI6eyJjb25maWciOnsiYXBwZW5kIjpbeyJzb3VyY2UiOiJodHRwczovL2FwaS1p\nbnQubmljcHdoZWNsdXN0ZXIuYXp1cmUtY2xvdWRwYWstbmljcHRlc3QuY29tOjIyNjIzL2NvbmZp\nZy9tYXN0ZXIiLCJ2ZXJpZmljYXRpb24iOnt9fV19LCJzZWN1cml0eSI6eyJ0bHMiOnsiY2VydGlm\naWNhdGVBdXRob3JpdGllcyI6W3sic291cmNlIjoiZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9dXRm\nLTg7YmFzZTY0LExTMHRMUzFDUlVkSlRpQkRSVkpVU1VaSlEwRlVSUzB0TFMwdENrMUpTVVJGUkVO\nRFFXWnBaMEYzU1VKQlowbEpVek0xZEVoNmRtUnVWMFYzUkZGWlNrdHZXa2xvZG1OT1FWRkZURUpS\nUVhkS2FrVlRUVUpCUjBFeFZVVUtRM2hOU21JelFteGliazV2WVZkYU1FMVNRWGRFWjFsRVZsRlJS\nRVYzWkhsaU1qa3dURmRPYUUxQ05GaEVWRWw0VFVSSmVVNUVRVEpOUkVFd1RteHZXQXBFVkUxNFRV\nUkplVTFxUVRKTlJFRXdUbXh2ZDBwcVJWTk5Ra0ZIUVRGVlJVTjRUVXBpTTBKc1ltNU9iMkZYV2pC\nTlVrRjNSR2RaUkZaUlVVUkZkMlI1Q21JeU9UQk1WMDVvVFVsSlFrbHFRVTVDWjJ0eGFHdHBSemwz\nTUVKQlVVVkdRVUZQUTBGUk9FRk5TVWxDUTJkTFEwRlJSVUV5VW14VlJuVjBVbUZtVHpRS2FVcFBh\nVTR4YVZvMWNYWmFkMjQ1TUdaNGQwZzVRelF5T0M5MWFHVXZkV2hXVTJOdVVURnVjV3Q0UVd0c2JW\naHlNbmhVVmxsMWJXUmFOREptTmtJeE5nb3dkM0F3TjNWbFYxbHBTMlZPT1VkclprUjVPRlpZUTJS\nTU5raHNkRGxVWVVrd01UQkpUakJUVUVWWldFeDFORmxsSzJoRVRpdHJkR3RoV0V0a1QycG5DbWRO\nTHpOQmMwRlFSM1p5UjNoMlVUa3ZURloxZW5odVkwNUhWVUppTUZnNU1tVnFURWRMVGtoalZITlNU\nSFZtWVdSSFJFOVBibXhYZDJWWkwySmFOa1lLZUZCQ05FVjVhVVJHUVhsbmEwUkVSVFJyT0RkeVNY\naDVZVkpZTkhRMVkwOXpSWFpJZFdOSE5tUXdSekl3U2xRMWMzcHZhV0pwTUN0NVJGcE1kRk51ZFFw\nYWIyWkJTaXREZVRoVloxSndZWE5sYUZjeFpteHNWRklyZURSUVVDODFTbFUxYURWV00ySnlSM0pJ\nVjBwTVFqUnVhemszWm10aVFVTTJiMlZzUkdOWENqbFNlamQwVTFKT1RWRkpSRUZSUVVKdk1FbDNV\nVVJCVDBKblRsWklVVGhDUVdZNFJVSkJUVU5CY1ZGM1JIZFpSRlpTTUZSQlVVZ3ZRa0ZWZDBGM1JV\nSUtMM3BCWkVKblRsWklVVFJGUm1kUlZUTktkRWMzZGtKb1RrWlllREptYzNWbFdHNTNVV0ZoTjNW\nRVdYZEVVVmxLUzI5YVNXaDJZMDVCVVVWTVFsRkJSQXBuWjBWQ1FVbHhNa2xNU1c4NGNVbFpOMXA0\nZERoc04yOUthVzQzY0U1SFZrZ3ZRMDF4Umlzd01GTlpVemQ2VGxBck1GZzBRMU5RUWtrd1dtWllW\nM1Z3Q2s1U1kwVkpTVGxqVW5vME1tczBOVlZTVm1saU5XeFdVR1prY1RSa2NEZG1aSGRKVVdGc04y\nTnNPSEJVVUhJMVpXcG9SbEJGVmpSeFpGY3pWSGRFVkhjS00yOTZZWGc1UmtVM1p5dGxZbEp6Vmtk\nSVlWRlVUVzVDZVRKQmFrVkJZbGxGTkRSWlp6UkJjbWRoWlZGaVNUZGhhMkp6WjNSNlpqQnlUSGg1\nU1RWR1RncHNiMmR5ZUcxV1dFdFJNVkUwYzI1NmVWWndSa05tUW05WFpraFdVMmhUUm1rM2JHUm9S\nV3RsU0ZaQ1ExaHNPVzlYUTI5UUszQmtUalp0UjFsb1dGTlZDbFZVYUd4RVpXcEZNV2x0ZVhGTmVI\nTnhTblJJYjJsdFoxTnJkWE5SVkVWVk1ETXdZVWRrUWtOVWNITXpaM0JPTWtKQmNqVm5SMVpDY0hk\nalJtOHZjazRLT1hKbE1FSk5URTFCU21SSFdGSlVSekJLWmtJNE1XNVVWUzlSUFFvdExTMHRMVVZP\nUkNCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2c9PSIsInZlcmlmaWNhdGlvbiI6e319XX19LCJ0aW1l\nb3V0cyI6e30sInZlcnNpb24iOiIyLjIuMCJ9LCJuZXR3b3JrZCI6e30sInBhc3N3ZCI6e30sInN0\nb3JhZ2UiOnt9LCJzeXN0ZW1kIjp7fX0=”
},
“masterVMSize”: {
“type”: “String”,
“value”: “Standard_D8s_v3”
},
“numberOfMasters”: {
“type”: “Int”,
“value”: 3
},
“privateDNSZoneName”: {
“type”: “String”,
“value”: “nicpwhecluster.”
},
“sshKeyData”: {
“type”: “SecureString”
}
},
“parametersLink”: null,
“providers”: [
{
“id”: null,
“namespace”: “Microsoft.Network”,
“registrationPolicy”: null,
“registrationState”: null,
“resourceTypes”: [
{
“aliases”: null,
“apiProfiles”: null,
“apiVersions”: null,
“capabilities”: null,
“defaultApiVersion”: null,
“locationMappings”: null,
“locations”: [
“japaneast”
],
“properties”: null,
“resourceType”: “privateDnsZones/SRV”
},
{
“aliases”: null,
“apiProfiles”: null,
“apiVersions”: null,
“capabilities”: null,
“defaultApiVersion”: null,
“locationMappings”: null,
“locations”: [
“japaneast”
],
“properties”: null,
“resourceType”: “networkInterfaces”
},
{
“aliases”: null,
“apiProfiles”: null,
“apiVersions”: null,
“capabilities”: null,
“defaultApiVersion”: null,
“locationMappings”: null,
“locations”: [
“japaneast”
],
“properties”: null,
“resourceType”: “privateDnsZones/A”
}
]
},
{
“id”: null,
“namespace”: “Microsoft.Compute”,
“registrationPolicy”: null,
“registrationState”: null,
“resourceTypes”: [
{
“aliases”: null,
“apiProfiles”: null,
“apiVersions”: null,
“capabilities”: null,
“defaultApiVersion”: null,
“locationMappings”: null,
“locations”: [
“japaneast”
],
“properties”: null,
“resourceType”: “virtualMachines”
}
]
}
],
“provisioningState”: “Succeeded”,
“templateHash”: “6843960507431905901”,
“templateLink”: null,
“timestamp”: “2021-02-24T08:02:39.379059+00:00”,
“validatedResources”: null
},
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“tags”: null,
“type”: “Microsoft.Resources/deployments”
}

(3)ワーカーマシンの作成
まず変数をエクスポートします。

$ export WORKER_IGNITION=`cat /home/user01/os45/worker.ign | base64`

マニュアルページにある「ワーカーマシンの ARM テンプレート」の内容をコピーして/home/user01/os45ディレクトリに06_workers.jsonというファイルを作成し、コマンドを実行します。

$ az deployment group create -g ${RESOURCE_GROUP} –template-file “/home/user01/os45/06_workers.json” –parameters workerIgnition=”${WORKER_IGNITION}” –parameters sshKeyData=”${SSH_KEY}” –parameters baseName=”${INFRA_ID}”

{- Finished ..
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Resources/deployments/06_workers”,
“location”: null,
“name”: “06_workers”,
“properties”: {
“correlationId”: “f5b06e10-75d0-4768-8546-637a838d11f4”,
“debugSetting”: null,
“dependencies”: [],
“duration”: “PT1M45.2779547S”,
“error”: null,
“mode”: “Incremental”,
“onErrorDeployment”: null,
“outputResources”: [
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Compute/virtualMachines/nicpwhecluster-h8lq5-worker-japaneast-1”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Compute/virtualMachines/nicpwhecluster-h8lq5-worker-japaneast-2”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Compute/virtualMachines/nicpwhecluster-h8lq5-worker-japaneast-3”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/networkInterfaces/nicpwhecluster-h8lq5-worker-japaneast-1-nic”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/networkInterfaces/nicpwhecluster-h8lq5-worker-japaneast-2-nic”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
},
{
“id”: “/subscriptions/<id>/resourceGroups/nicpwhecluster-h8lq5-rg/providers/Microsoft.Network/networkInterfaces/nicpwhecluster-h8lq5-worker-japaneast-3-nic”,
“resourceGroup”: “nicpwhecluster-h8lq5-rg”
}
],
“outputs”: null,
“parameters”: {
“baseName”: {
“type”: “String”,
“value”: “nicpwhecluster-h8lq5”
},
“nodeVMSize”: {
“type”: “String”,
“value”: “Standard_D4s_v3”
},
“numberOfNodes”: {
“type”: “Int”,
“value”: 3
},
“sshKeyData”: {
“type”: “SecureString”
},
“workerIgnition”: {
“type”: “String”,
“value”: “eyJpZ25pdGlvbiI6eyJjb25maWciOnsiYXBwZW5kIjpbeyJzb3VyY2UiOiJodHRwczovL2FwaS1p\nbnQubmljcHdoZWNsdXN0ZXIuYXp1cmUtY2xvdWRwYWstbmljcHRlc3QuY29tOjIyNjIzL2NvbmZp\nZy93b3JrZXIiLCJ2ZXJpZmljYXRpb24iOnt9fV19LCJzZWN1cml0eSI6eyJ0bHMiOnsiY2VydGlm\naWNhdGVBdXRob3JpdGllcyI6W3sic291cmNlIjoiZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9dXRm\nLTg7YmFzZTY0LExTMHRMUzFDUlVkSlRpQkRSVkpVU1VaSlEwRlVSUzB0TFMwdENrMUpTVVJGUkVO\nRFFXWnBaMEYzU1VKQlowbEpVek0xZEVoNmRtUnVWMFYzUkZGWlNrdHZXa2xvZG1OT1FWRkZURUpS\nUVhkS2FrVlRUVUpCUjBFeFZVVUtRM2hOU21JelFteGliazV2WVZkYU1FMVNRWGRFWjFsRVZsRlJS\nRVYzWkhsaU1qa3dURmRPYUUxQ05GaEVWRWw0VFVSSmVVNUVRVEpOUkVFd1RteHZXQXBFVkUxNFRV\nUkplVTFxUVRKTlJFRXdUbXh2ZDBwcVJWTk5Ra0ZIUVRGVlJVTjRUVXBpTTBKc1ltNU9iMkZYV2pC\nTlVrRjNSR2RaUkZaUlVVUkZkMlI1Q21JeU9UQk1WMDVvVFVsSlFrbHFRVTVDWjJ0eGFHdHBSemwz\nTUVKQlVVVkdRVUZQUTBGUk9FRk5TVWxDUTJkTFEwRlJSVUV5VW14VlJuVjBVbUZtVHpRS2FVcFBh\nVTR4YVZvMWNYWmFkMjQ1TUdaNGQwZzVRelF5T0M5MWFHVXZkV2hXVTJOdVVURnVjV3Q0UVd0c2JW\naHlNbmhVVmxsMWJXUmFOREptTmtJeE5nb3dkM0F3TjNWbFYxbHBTMlZPT1VkclprUjVPRlpZUTJS\nTU5raHNkRGxVWVVrd01UQkpUakJUVUVWWldFeDFORmxsSzJoRVRpdHJkR3RoV0V0a1QycG5DbWRO\nTHpOQmMwRlFSM1p5UjNoMlVUa3ZURloxZW5odVkwNUhWVUppTUZnNU1tVnFURWRMVGtoalZITlNU\nSFZtWVdSSFJFOVBibXhYZDJWWkwySmFOa1lLZUZCQ05FVjVhVVJHUVhsbmEwUkVSVFJyT0RkeVNY\naDVZVkpZTkhRMVkwOXpSWFpJZFdOSE5tUXdSekl3U2xRMWMzcHZhV0pwTUN0NVJGcE1kRk51ZFFw\nYWIyWkJTaXREZVRoVloxSndZWE5sYUZjeFpteHNWRklyZURSUVVDODFTbFUxYURWV00ySnlSM0pJ\nVjBwTVFqUnVhemszWm10aVFVTTJiMlZzUkdOWENqbFNlamQwVTFKT1RWRkpSRUZSUVVKdk1FbDNV\nVVJCVDBKblRsWklVVGhDUVdZNFJVSkJUVU5CY1ZGM1JIZFpSRlpTTUZSQlVVZ3ZRa0ZWZDBGM1JV\nSUtMM3BCWkVKblRsWklVVFJGUm1kUlZUTktkRWMzZGtKb1RrWlllREptYzNWbFdHNTNVV0ZoTjNW\nRVdYZEVVVmxLUzI5YVNXaDJZMDVCVVVWTVFsRkJSQXBuWjBWQ1FVbHhNa2xNU1c4NGNVbFpOMXA0\nZERoc04yOUthVzQzY0U1SFZrZ3ZRMDF4Umlzd01GTlpVemQ2VGxBck1GZzBRMU5RUWtrd1dtWllW\nM1Z3Q2s1U1kwVkpTVGxqVW5vME1tczBOVlZTVm1saU5XeFdVR1prY1RSa2NEZG1aSGRKVVdGc04y\nTnNPSEJVVUhJMVpXcG9SbEJGVmpSeFpGY3pWSGRFVkhjS00yOTZZWGc1UmtVM1p5dGxZbEp6Vmtk\nSVlWRlVUVzVDZVRKQmFrVkJZbGxGTkRSWlp6UkJjbWRoWlZGaVNUZGhhMkp6WjNSNlpqQnlUSGg1\nU1RWR1RncHNiMmR5ZUcxV1dFdFJNVkUwYzI1NmVWWndSa05tUW05WFpraFdVMmhUUm1rM2JHUm9S\nV3RsU0ZaQ1ExaHNPVzlYUTI5UUszQmtUalp0UjFsb1dGTlZDbFZVYUd4RVpXcEZNV2x0ZVhGTmVI\nTnhTblJJYjJsdFoxTnJkWE5SVkVWVk1ETXdZVWRrUWtOVWNITXpaM0JPTWtKQmNqVm5SMVpDY0hk\nalJtOHZjazRLT1hKbE1FSk5URTFCU21SSFdGSlVSekJLWmtJNE1XNVVWUzlSUFFvdExTMHRMVVZP\nUkNCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2c9PSIsInZlcmlmaWNhdGlvbiI6e319XX19LCJ0aW1l\nb3V0cyI6e30sInZlcnNpb24iOiIyLjIuMCJ9LCJuZXR3b3JrZCI6e30sInBhc3N3ZCI6e30sInN0\nb3JhZ2UiOnt9LCJzeXN0ZW1kIjp7fX0=”
}
},
“parametersLink”: null,
“providers”: [
{
“id”: null,
“namespace”: “Microsoft.Resources”,
“registrationPolicy”: null,
“registrationState”: null,
“resourceTypes”: [
{
“aliases”: null,
“apiProfiles”: null,
“apiVersions”: null,
“capabilities”: null,
“defaultApiVersion”: null,
“locationMappings”: null,
“locations”: [
null
],
“properties”: null,
“resourceType”: “deployments”
}
]
}
],
“provisioningState”: “Succeeded”,
“templateHash”: “18038938870077969594”,
“templateLink”: null,
“timestamp”: “2021-02-24T08:19:00.447842+00:00”,
“validatedResources”: null
},
“resourceGroup”: “nicpwhecluster-h8lq5-rg”,
“tags”: null,
“type”: “Microsoft.Resources/deployments”
}

(4)クラスターへのログイン
ocコマンドにてクラスタにログインします。

$ export KUBECONFIG=/home/user01/os45/auth/kubeconfig
$ oc whoami
system:admin

(5)マシンの証明書署名要求の承認
まずマスターに認識されるすべてのノードを一覧表示します。まだワーカーマシンが表示されていません。

$ oc get nodes
NAME STATUS ROLES AGE VERSION
nicpwhecluster-h8lq5-master-0 Ready master 21m v1.18.3+e574db2
nicpwhecluster-h8lq5-master-1 Ready master 21m v1.18.3+e574db2
nicpwhecluster-h8lq5-master-2 Ready master 21m v1.18.3+e574db2

保留中の証明書署名要求 (CSR) でいくつか「Pending」になっていることを確認します。

$ oc get csr
NAME AGE SIGNERNAME REQUESTOR CONDITION
csr-4ltzq 21m kubernetes.io/kube-apiserver-client-kubelet system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Approved,Issued
csr-5ff59 22m kubernetes.io/kube-apiserver-client-kubelet system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Approved,Issued
csr-8cxlk 22m kubernetes.io/kube-apiserver-client-kubelet system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Approved,Issued
csr-d79hz 21m kubernetes.io/kubelet-serving system:node:nicpwhecluster-h8lq5-master-2 Approved,Issued
csr-ghhrm 22m kubernetes.io/kubelet-serving system:node:nicpwhecluster-h8lq5-master-1 Approved,Issued
csr-jtts9 7m15s kubernetes.io/kube-apiserver-client-kubelet system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Pending
csr-m68ns 7m kubernetes.io/kube-apiserver-client-kubelet system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Pending
csr-vgtp6 7m2s kubernetes.io/kube-apiserver-client-kubelet system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Pending
csr-wwptz 21m kubernetes.io/kubelet-serving system:node:nicpwhecluster-h8lq5-master-0 Approved,Issued$ oc get csr -o go-template='{{range .items}}{{if not .status}}{{.metadata.name}}{{“\n”}}{{end}}{{end}}’ | xargs oc adm certificate approvecertificatesigningrequest.certificates.k8s.io/csr-jtts9 approved
certificatesigningrequest.certificates.k8s.io/csr-m68ns approved
certificatesigningrequest.certificates.k8s.io/csr-vgtp6 approved

再度マスターに認識されるすべてのノードを一覧表示し、ワーカーマシンがReadyになっていることを確認します。

$ oc get nodes
NAME STATUS ROLES AGE VERSION
nicpwhecluster-h8lq5-master-0 Ready master 24m v1.18.3+e574db2
nicpwhecluster-h8lq5-master-1 Ready master 25m v1.18.3+e574db2
nicpwhecluster-h8lq5-master-2 Ready master 24m v1.18.3+e574db2
nicpwhecluster-h8lq5-worker-japaneast-1 Ready worker 2m2s v1.18.3+e574db2
nicpwhecluster-h8lq5-worker-japaneast-2 Ready worker 2m6s v1.18.3+e574db2
nicpwhecluster-h8lq5-worker-japaneast-3 Ready worker 2m v1.18.3+e574db2

(6)ブートストラップリソースを削除
これですべてのノードが作成されて利用可能となりましたので、ブートストラップノードと関連するリソースを削除します。

$ ./openshift-install wait-for bootstrap-complete –dir=/home/user01/os45/ –log-level info

INFO Waiting up to 20m0s for the Kubernetes API at https://api.nicpwhecluster.:6443…
INFO API v1.18.3+e574db2 up
INFO Waiting up to 40m0s for bootstrapping to complete…
INFO It is now safe to remove the bootstrap resources
INFO Time elapsed: 0s

$ az network nsg rule delete -g ${RESOURCE_GROUP} –nsg-name ${INFRA_ID}-nsg –name bootstrap_ssh_in
$ az vm stop -g ${RESOURCE_GROUP} –name ${INFRA_ID}-bootstrap

About to power off the specified VM…
It will continue to be billed. To deallocate a VM, run: az vm deallocate.

$ az vm deallocate -g ${RESOURCE_GROUP} –name ${INFRA_ID}-bootstrap
$ az vm delete -g ${RESOURCE_GROUP} –name ${INFRA_ID}-bootstrap –yes
$ az disk delete -g ${RESOURCE_GROUP} –name ${INFRA_ID}-bootstrap_OSDisk –no-wait –yes
$ az network nic delete -g ${RESOURCE_GROUP} –name ${INFRA_ID}-bootstrap-nic –no-wait
$ az storage blob delete –account-key ${ACCOUNT_KEY} –account-name ${CLUSTER_NAME}sa –container-name files –name bootstrap.ign
$ az network public-ip delete -g ${RESOURCE_GROUP} –name ${INFRA_ID}-bootstrap-ssh-pip

(7)クラスターのインストールを完了する

$ ./openshift-install –dir=/home/user01/os45/ wait-for install-complete

INFO Waiting up to 30m0s for the cluster at https://api.nicpwhecluster.:6443 to initialize…
INFO Waiting up to 10m0s for the openshift-console route to be created…
INFO Install complete!
INFO To access the cluster as the system:admin user when using ‘oc’, run ‘export KUBECONFIG=/home/user01/os45/auth/kubeconfig’
INFO Access the OpenShift web-console here: https://console-openshift-console.apps.nicpwhecluster.
INFO Login to the console with user: “kubeadmin”, and password: “<パスワード>”
INFO Time elapsed: 1s

(8)ログイン

$ oc login -u kubeadmin -p  <パスワード>https://api.nicpwhecluster.:6443
The server uses a certificate signed by an unknown authority.
You can bypass the certificate check, but any data you send to the server could be intercepted by others.
Use insecure connections? (y/n): yLogin successful.You have access to 58 projects, the list has been suppressed. You can list all projects with ‘oc projects’Using project “default”.

 

 

その他の記事

2026年02月26日

【参加レポート】「watsonx Tech Challenge 2025」に参加してきた

公開日:2026-02-26 こんにちは、てくさぽブログメンバーの高村です。 2026年2月12日・13日に、愛徳会主催(日本IBM共催)のイベント「watsonx Tech Challenge 2025」がIBM箱崎にて開催され、昨年に引き続き弊社は6名で参加しました。 本記事では、イベントの様子をレポートいたします。 目次 イベントの概要 イベント当日までの準備 イベント当日 さいごに お問い合わせ イベントの概要 このイベントは、IBM watsonx を活用してビジネスを具現化できる技術者を育成することを目的としたハッカソン/アイディアソンです。 今年は「地域課題の解決(人口減少・少子高齢化・労働力不足)」「環境問題対策」「わくわく社会の実現」「顧客が直面する課題」の4つをテーマに、watsonxのAIエージェントでどう解決できるかをチームで検討し、ソリューションを発表します。 私たちのチームは、IBMのAIエージェント製品であるwatsonx Orchestrateを活用した解決策を検討し、モックを作成し発表しました。 イベント当日までの準備 昨年はテーマやペルソナの絞り込みに時間を要した反省から、今年はスケジュールを組んで早期決定を目指していました。しかし議論を重ねるにつれ、「課題が小さすぎないか」「このソリューションでは売れないのではないか」「この業界には刺さらないのではないか」と意見が白熱。紆余曲折の末、イベント前々日にテーマ・ペルソナ・解決策の方向性を確定し、食品製造業における食品ロス削減と業務効率化を主題に据えることで合意しました。 なかなか方向性が定まらないことに焦りもありましたが、課題設定に際して国内の食品ロスの現状や事業側の事情を資料で下調べしたことで、普段は意識しない問題まで理解が深まり、良い学びとなりました。また各メンバーが調査結果を持ち寄って意見交換を重ね、整合性のあるロジックで方向性を定められたと思います。 イベント当日 1日目 始めに発表順の抽選があり、今年はIBM様の次で2番手となりました。続いて各チームの部屋が割り振られ、発表準備へ。私たちは、食品製造業における食品ロス削減と業務効率化をテーマに、watsonx Orchestrateを活用し、AIによる需要予測に基づいて在庫を最適化し、生産数の決定から生産管理システムとの連携、発注までを一気通貫で実行するAIエージェントを提案することにしました。 2日目 発表は午後からとなり、午前中は各チームとも準備に集中します。私たちは新たな挑戦としてスキット(寸劇)形式での発表を選択し、発表シナリオと台本の作成、モック制作に分かれて作業しました。モック制作では IBM Bob を活用し、チャットでソリューション概要を伝え、Bobにエージェントの定義ファイルを生成してもらいました。watsonx Orchestrate環境に定義ファイルをインポートし、ソリューションの動きが分かるモックを約1時間半で形にでき、IBM Bobの生産性の高さに驚かされました。

2026年02月26日

【てくさぽBLOG】IBM Bobで市民開発に挑戦

更新日:2026-02-26 公開日:2026-01-22 [2026年2月26日追記]IBM Bob の提供開始日(GA)が発表されました。 2026年3月24日 また、Early Access 版の新規受付は終了となりました。 *  *  *  *  *  * こんにちは。てくさぽBLOGメンバー村上です。 2026年も、気づけばもう1月が駆け抜けていきそうですね。 さて今回は「IBM Bob」検証シリーズPart2をお届けします(Part1 はこちら)。 前回はBobの主要機能のひとつである「Explain機能(コード解析)」をご紹介しました。 今回はコード生成を行う機能「Generate機能」に注目し、アプリケーションの開発に挑戦した内容をお届けします。 目次 はじめに IBM Bob のGenerate機能で市民開発を試してみた Generate機能の他社製品との比較 さいごに お問い合わせ はじめに 現在、私たちのチームではIBM BobのPreview版(Early Access版)を利用し、Generate機能によってBobがどんなコード生成ができるのか、どこまでの領域をカバーできるのか、そして実際の業務がどれほど効率化されるのか、その実力と効果を検証しています。 これまでに実施したGenerate機能の検証例 ・IBM Bobでwatsonx Orchestrate(wxO)のAIエージェントを作成 ・Bobで生成したマークダウン形式のファイルをExcelへ出力するツールの作成 ・チーム内で利用している勤怠確認用のスプレッドシートを操作性の高い「出退勤管理アプリ」にする開発 今回はこの中から、他社製品との比較が行いやすく、IBM Bob ならではの特徴をより分かりやすく伝えられると考えた「出退勤管理アプリ」に焦点を当ててご紹介します。 IBM Bob がどこまで意図通りの開発ができるか、また、他製品と比較した内容も合わせてお届けします。 IBM Bob のGenerate機能で市民開発を試してみた 「出退勤管理アプリ」作成の過程や成果としてご紹介する内容は下記です。 プロンプトの強化:曖昧な指示を具体的に補完 チャットモードを利用した対話型開発 完成した成果物の紹介 プロンプトの強化による成果物の比較 1. プロンプトの強化:曖昧な指示を具体的に補完 まず、「出退勤管理アプリ」の完成イメージをBobに伝えます。 Bobのチャット画面に、下記のように要件を箇条書きで記載し、要件を書き終わったら「プロンプト強化機能(Enhance Prompt)」ボタンを押下しプロンプトを強化しました(プロンプトの強化についてはPart1のブログでも記載しています)。 上記のプロンプトが下記のプロンプトに強化されました。 チーム向け勤怠管理Webアプリケーションを以下の仕様で開発してください。   【基本機能】 メンバー全員が互いの勤怠状況を閲覧可能なチーム勤怠管理システムを構築します。 各メンバーは個人アカウントでログインし、自分の勤怠データのみ編集権限を持ち、他メンバーのデータは閲覧のみ可能とします。 【画面構成】 1. 当日勤怠一覧画面:本日の全メンバーの勤怠状況を一画面で一覧表示し、各メンバーの勤務場所、勤怠種別、勤務開始・終了時刻、備考を即座に把握できるダッシュボード形式とします 2. 個人別勤怠カレンダー画面:メンバーごとに過去の勤怠実績と未来の勤怠予定を時系列で確認・管理できるページを用意し、日付範囲を指定して表示できるようにします 【勤怠データ入力機能】 実績入力:毎日の勤務開始時と勤務終了時に手動で時刻を入力する機能を実装します。入力フォームはシンプルで素早く操作できるUIとします 予定入力:複数日分の勤怠予定を一括登録できる機能を実装し、登録後もいつでも個別または一括で変更・削除が可能とします 【勤務場所の選択肢】 - テレワーク - 聖路加オフィス - 外出 - その他 各勤怠記録に対してドロップダウンまたはラジオボタンで選択できるようにします 【勤怠種別の選択肢】 - 休(終日休暇) - AM休(午前休) - PM休(午後休) - 時間休 - FLEX(フレックス勤務) 勤務場所と同様に選択式で入力できるようにします 【備考欄】 各勤怠記録に自由記述可能な備考欄を設け、特記事項や補足情報を入力できるようにします 【認証・権限管理】 初期メンバー5名分のアカウントを作成し、各メンバーは個人名でログインします。 パスワード設定機能を実装し、初回ログイン時または設定画面から任意のパスワードに変更可能とします。編集権限は自分の勤怠データに限定し、他メンバーのデータは読み取り専用とします 【技術要件】 レスポンシブデザインでPCとモバイル端末の両方で快適に操作できるようにし、 データの永続化にはデータベースを使用してください。モダンなWebフレームワークを使用し、保守性と拡張性の高いコード構造で実装してください 「プロンプト強化機能」を利用することで、説明が不足している部分をBobが具体的に補完し、精度の高いプロンプトへとブラッシュアップしてくれます。 これにより、要件の意図を正しく反映させるための具体的な指示が整いました。 補足ですが、私は拡張機能として「Japanese Language Pack for Visual Studio Code」を導入し、IDEを日本語化して利用しています。 (拡張機能の適用方法はPart1のブログにしています) 2. チャットモードを利用した対話型開発 次に、IBM Bob のチャットモードを試してみました。今回利用したのは「Planモード」です。 Planモードを選択した理由は、まずBobが計画立案をしてくれ、その計画を人間側が理解・承認してから開発を進められると思ったためです。 Planモードを利用して先ほど強化したプロンプトをチャット画面から流すと、Bobが下記のように指示が漏れている部分を確認してくれました。 技術スタックの確認: このWebアプリケーションの技術スタックについて、どのような構成を希望されますか? 詳細な設定確認: 初期メンバー5名の名前を教えてください。ログイン時に使用するユーザー名として設定します。 このように、Bobが具体的な選択肢やデータの入力を促してくれるため、抜け漏れのない状態で計画を立て、実装へと進めることができます。 全ての要件が明確になると、Todoリストが作成されました。 このTodoリストを承認した後は、Bobがリストを上から順番に自動で進めてくれます。 プログラムを作成する工程まで行くと「Codeモードに切り替えます」と宣言があり、チャットモードがPlanモードからCodeモードに自動で切り替わり、実装フェーズへ移行しました。 この流れは非常にスムーズで、Bob の優秀さに感心しました。 ちなみに、私のPCにはNode.jsがインストールされていなかったのですが ・Node.jsのダウンロード、インストール方法 ・コマンド実行がうまくいかなかったときのトラブル対応 は、全てBobが教えてくれました。 教えてもらう相手が人間だと、ある程度調べてから聞かないと迷惑だよなぁ・・と思ってしまうような疑問でも、Bobになら遠慮せず聞くことができるので、スピードを落とさずに作業を進めることができました。 3. 完成した成果物の紹介 こうしたプロセスを経て完成した「出退勤管理アプリ」がこちらです。 市民開発への挑戦を決めた当初は、「どのような指示を出せばいいのか」と少し身構えていました。しかし、実際には細かな指示に悩む必要はなく、Bobがプロンプト強化機能やチャットモードを通じて、使い勝手の良いアプリケーションを自律的に構築してくれました。 完成した「出退勤管理アプリ」には、ユーザー別のログイン機能だけでなく、パスワード変更やチームメンバーが各自のPCからアクセスできる外部接続の仕様まで標準的に実装されており、その完成度の高さには正直驚かされました。 4. プロンプトの強化による成果物の比較 「1.プロンプトの強化」にて、プロンプトを強化してからアプリケーションを作成する方法を記載しましたが、試しに、プロンプトは強化せずに「出退勤管理アプリ」を作成してみました。 成果物にどのような違いが現れたかをご紹介します。 プロンプト強化前 指示が曖昧だった機能は実装されなかった プロンプト強化後 イメージしていた機能が全て実装された プロンプトを強化し指示の解像度を上げることが、そのままアプリケーションの完成度に直結することを実感した検証となりました。 Generate機能の他社製品との比較 さて、今回の検証では「他社製品ではどのような結果になるか」も合わせて検証しました。 正確に比較するため、他社製品もBobと全く同じプロンプトを用いて検証を行っています。 両者の操作感やアウトプットを細かい観点で比較し、Bobの特徴としてお伝えしたい部分を下記の表にまとめました。 比較項目 IBM Bob 他社製品 ドキュメント生成 基盤~運用に関するドキュメントを作成 ・基本設計書 ・詳細設計書(実装計画書) ・使い方ガイド(README) ・開発設計書 ・導入手順書(SETUP GUIDE) ・障害対応手順書(作業中のトラブル対応) 開発視点のドキュメントを作成 ・要件定義書 ・基本設計書 ・詳細設計書(実装計画書)   アーキテクチャのレベル 本番運用に耐えうる可用性・信頼性を考慮した構成 (フロントエンド・バックエンドの分離) すぐに動く構成 (フロントエンド・バックエンドを分離しない構成) デプロイの容易性 〇 ・プロンプト強化により不足情報が補完 ・選択肢(推奨案)が提示され対話を通じてステップバイステップで進められる △ ・プロンプト補完の機能は見当たらない ・選択肢が提示されることはなかった 今回の比較検証を通して、IBM Bobの自律型エージェントとしての高い実力を実感しました。 実運用に耐えうる構成を自動で選択してくれる点はとても心強いです。また、基盤から運用までを網羅する圧倒的なドキュメント生成力や、対話を通じて迷わず進められるデプロイ支援により、開発のハードルが下がるだけでなく、実装の透明性も高いレベルで担保されています。 作った後もチームや組織で説明・維持ができる、という安心感こそが、IBM Bobが組織利用を見据えたエンタープライズ向けの製品であると言える大きな理由なのだと感じました。 さいごに Part2となる今回のブログは、IBM Bobの「Generate機能」を使った市民開発をご紹介しました。 実際にBobと一緒にアプリケーションを作ってみて、やっぱりBobは頼りになる相棒でした。 (最近、Bobを実在する人のように「Bobさん」と呼んでしまうことがあります) 私は開発業務に深く携わった経験はほとんどありませんが、今回の検証を通じて、自分の手で形にできるワクワク感を肌で感じることができました。 これからも、この頼もしい相棒と一緒に業務の新しい形を探り、その可能性をパートナーの皆さまにもお届けしていきたいと思います。 お問い合わせ エヌアイシー・パートナーズ株式会社 技術企画本部 E-Mail:nicp_support@NIandC.co.jp .highlighter { background: linear-gradient(transparent 50%, #ffff52 90% 90%, transparent 90%); } .anchor{ display: block; margin-top:-20px; padding-top:40px; } .btn_A{ height:26px; } .btn_A a{ display:block; width:100%; height:100%; text-decoration: none; background:#eb6100; text-align:center; border:1px solid #FFFFFF; color:#FFFFFF; font-size:16px; border-radius:50px; -webkit-border-radius:50px; -moz-border-radius:50px; box-shadow:0px 0px 0px 4px #eb6100; transition: all 0.5s ease; } .btn_A a:hover{ background:#f56500; color:#999999; margin-left:0px; margin-top:0px; box-shadow:0px 0px 0px 4px #f56500; } .bigger { font-size: larger; }

2026年02月26日

【てくさぽBLOG】IBM BobでRPG解析!複雑なロジックを一瞬で整理し、実務の即戦力に

更新日:2026-02-26 公開日:2025-12-24 [2026年2月26日追記]IBM Bob の提供開始日(GA)が発表されました。 2026年3月24日 また、Early Access 版の新規受付は終了となりました。 *  *  *  *  *  * こんにちは。てくさぽBLOGメンバー村上です。 今年の10月にIBM Tech Xchange 2025 Orlandoにて電撃発表された話題のIBM Bob はご存じですか? 今回は、IBM Bob をTech Preview版で検証している状況をタイムリーにお伝えいたします! 目次 IBM Bobってどんな製品? Explain機能を試してみた Explain機能の他社製品との比較 さいごに お問い合わせ IBM Bob ってどんな製品? IBM Bob は、2025年10月の IBM TechXchange 2025 Orlando で発表された AIエージェント型のIDE(統合開発環境)です。 単なるAIアシスタント開発を超え、ソフトウェア開発ライフサイクル全体を自律的に動かし、生産性と品質を大幅に向上させることができる製品です。 IBM Bobが得意なこと ソフトウェア開発とモダナイゼーションを変革 • 複数のモード (プラン、コード、質問、アドバンスド) を装備 • アプリケーション設計、コード説明、コード生成、テスト生成、ドキュメント作成 • 開発者の作業に応じて最適なLLMを選択 幅広い言語に対応 • RPG, COBOL, CL, SQL, DDS • Java, Python, JavaScript, TypeScript, Node.js, bash など IBM Bobを利用するメリット 「システムの理解」にかかるコストを戦略的投資へ転換 ・開発スピードが劇的に向上 ・エンジニアの業務時間の多くを占める「既存コードの解析」という非生産的な時間を、AIによって極小化 ・解析に費やしていた膨大な工数を、新しいビジネスモデルの構築や機能拡張へ再配置 プロジェクト内の知識共有(可視化) ・プロジェクトメンバー全員が常に「今、正しく動いている仕様」を共有できる ・新メンバーへの引継ぎが容易で立ち上がりが早くなる AIによる標準化でガバナンスの聞いた開発体制を実現 ・品質のばらつきを抑えエンタープライズレベルのガバナンスを維持し構築を支援   定型的な解析はBobに委ね、エンジニアはより高次元な創造性に知力を注ぐ。 そんな、互いの強みを活かし合える知的な相棒になってくれそうです! Explain機能を試してみた 検証の背景 今回、IBM i(AS400) で利用する言語、RPGにフォーカスして検証を行いました。 現在、多くの企業で課題となっているのが、IBM i(AS400)上で長年稼働し続けているRPGプログラムの保守・継承です。 IBM i はその堅牢性ゆえに、10年以上前に書かれたコードが一度も改修されずに現役で動き続けているケースも珍しくありません。 しかし、その代償として「詳細設計書が消失している」「担当SEが高齢化し仕様がブラックボックス化してしまいそう」という深刻な問題が浮上しています。 後継者不足も重なり、このままではシステムの維持そのものが危ぶまれる未来がすぐそこまで来ています。 そこで期待されるのが、AIの力による「リバースエンジニアリング」です。人力では途方もない時間と労力がかかる既存コードからの仕様解読をAIが肩代わりし、さらに「現役エンジニアがそのまま実務に使えるレベルの、精度の高い設計書」を書き出すことができれば、属人化の解消へ向けた大きな一歩となります。 IBM Bobには、主に以下の4つの強力な機能が備わっています。  - Explain(説明):プログラムを解析、説明  - Transform(変換):プログラミング言語のバージョンアップ、モダナイズ  - Refactor(リファクタリング):コードの構造を最適化、保守性の向上  - Generate(生成):プログラム・アプリケーションの作成 今回の検証は、上記の背景より「Explain(説明)」機能に主眼を置いています。 IBM Bobが複雑なRPGの構造をどこまで正しく理解し、実務に耐えうる高精度な詳細設計書を再現できるのかを検証しました。   検証内容 検証では、ローカルPCに保管した既存のRPGプログラムを対象に、IBM Bob がどこまで実務に即したアウトプットを出せるかを試しました。 【検証のステップ】 事前準備: RPGのプログラムが保管されているローカルフォルダを参照先として指定 基本操作: Bobのチャット画面にて、解析対象のRPGプログラムを指定し「プログラム詳細設計書」を作成するように日本語(自然言語)で指示 環境拡張: Bob内のメニュー「Extensions」から「Mermaid Chart」のPluginを導入。出力された構成図(Mermaid形式)をより視覚的に確認できる環境を準備。 【検証の結果】 検証を通じて驚かされたのは、Bobの解読の速さと正確さです。 RPG特有の複雑な指標や深いネスト構造であっても、ロジックの骨組みが明瞭に描き出されており、要点が紐解かれるような丁寧さと平易さを兼ね備えたアウトプットとして提示されました。そして、文章による解説に加え、Mermaid図によって視覚的に補完されたフローは非常に分かりやすく、文字だけでは追い切れない処理の全体像を一目で把握することが可能となりました。 Bobで作成したプログラム詳細設計書は、これまで他社のAIツールを試しては『実務で使うにはまだ早い』と限界を感じてきた熟練の技術者さえも、思わず目を見張るほどの解析精度でした。 そして、Bobのチャット画面で指示を出す際の「Enhance Prompt(プロンプト強化)」ボタンは非常に便利でした。 「Enhance Prompt」ボタンは、指示内容をAIが解釈し、より精度の高い回答を引き出すために最適なプロンプトへと補ってくれます。 これにより、AIへの指示出しに慣れていない技術者でも、簡単に質の高い設計書を作成することができそうです。 今後の検証 現在、プログラム設計書作成の次のステップとして、作成したプログラム詳細設計書を利用してコード生成(Generate)やコード改修(Refactor)を行う検証を実施しています。 これにより、コードに直接手を入れなくても、詳細設計書の一部分を人間の言葉で直すだけでコード側に修正が及ぶようにできると考えております。 また、人間が気付かない関連している他のプログラムコードの修正箇所も気付いてくれるかもしれません。 また、Bobのチャット画面で、回答の精度を最大化するために、チャットモード(※)を切り替えた検証も行っており、Bobと対話しながら特定箇所を修正・作成することも試行しています。 ※「チャットモード」のおススメ利用シーン(Bob自身に聞いてみました)  - Code: コード作成・修正時  - Plan: 設計・計画立案時  - Ask: 質問・説明が欲しい時  - Advanced: 複雑なコード実装時 Explain機能の他社製品との比較 さて、チーム内では他社製品も交えた横並びの比較検証を進めています。 同じ指示(プロンプト)を出し、コード解説の深さや図解の分かりやすさをプログラム詳細設計書(Explain機能)作成の観点で比較しましたのでご紹介します。 項目 IBM Bob A社製品 B社製品 解析制度と網羅性 ◎ 高度な構造解析と高精度な図解 〇 基本情報の列挙と標準的な図解 〇基本値の抽出がメイン 可読性・理解しやすさ ◎ 豊富な図解量と手順レベルの解説 〇 簡潔な説明(Bobに比べ情報不足) △ パラメータの羅列に近い 柔軟性・拡張性 ◎ 任意フォルダ参照・MCP連携に対応 〇 MCP連携対応 〇 MCP連携対応 総合判定 ◎ 〇 〇 ※入力するプロンプトの内容によって得られる結果が異なる場合があります 今後、Generate機能やTransform機能でも比較検証を続けてみたいと思います。 さいごに 私自身、Bobに出会ってその賢さに驚かされましたが、今では複雑なコードを健気に読み解いてくれるBobが、どこか可愛らしい相棒のようにも感じています。 今回の検証を通じて、あまりに古すぎて誰も手を付けたがらなかったRPGプログラムも、決して攻略不可能なものではないと確信しました。 Bobという頼れる相棒がいれば、眠っていた過去の遺産は必ず未来の資産へと変えられます。 皆様もぜひ、この新しい開発の形を体感してみてください。 Tech Preview版 申し込みURL: https://ibm.biz/Try-Bob 末筆ながら、本年も「てくさぽBLOG」を見てくださりありがとうございました。 新しい年が、皆様にとってさらなる飛躍の年となりますよう心よりお祈り申し上げます。 お問い合わせ エヌアイシー・パートナーズ株式会社 技術企画本部 E-Mail:nicp_support@NIandC.co.jp     .bigger { font-size: larger; } .highlighter { background: linear-gradient(transparent 50%, #ffff52 90% 90%, transparent 90%); } .anchor{ display: block; margin-top:-20px; padding-top:40px; } .btn_A{ height:30px; } .btn_A a{ display:block; width:100%; height:100%; text-decoration: none; background:#eb6100; text-align:center; border:1px solid #FFFFFF; color:#FFFFFF; font-size:16px; border-radius:50px; -webkit-border-radius:50px; -moz-border-radius:50px; box-shadow:0px 0px 0px 4px #eb6100; transition: all 0.5s ease; } .btn_A a:hover{ background:#f56500; color:#999999; margin-left:0px; margin-top:0px; box-shadow:0px 0px 0px 4px #f56500; } .table { border-collapse: collapse; border-spacing: 0; width: 100%; } .td { padding: 10px; vertical-align: top; line-height: 1.5; } .tbody tr td:first-child { font-weight: bold; width: 20%; } .tbody tr td:last-child { width: 80%; } .ul { margin: 0 !important; padding: 0 0 0 20px !important; } .ol { margin: 0 !important; padding: 0 0 0 20px !important; } .tr { height: auto; } .table { margin: 0; } *, *:before, *:after { -webkit-box-sizing: inherit; box-sizing: inherit; } .html { -webkit-box-sizing: border-box; box-sizing: border-box; font-size: 62.5%; } .btn, a.btn, button.btn { font-size: 1.6rem; font-weight: 700; line-height: 1.5; position: relative; display: inline-block; padding: 1rem 4rem; cursor: pointer; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; -webkit-transition: all 0.3s; transition: all 0.3s; text-align: center; vertical-align: middle; text-decoration: none; letter-spacing: 0.1em; color: #212529; border-radius: 0.5rem; } a.btn--orange { color: #fff; background-color: #eb6100; border-bottom: 5px solid #b84c00; } a.btn--orange:hover { margin-top: 3px; color: #fff; background: #f56500; border-bottom: 2px solid #b84c00; } a.btn--shadow { -webkit-box-shadow: 0 3px 5px rgba(0, 0, 0, .3); box-shadow: 0 3px 5px rgba(0, 0, 0, .3); }

2026年02月18日

【開催レポート】IBM様主催 Bobathon in Tokyo - IBM Bobで何が生まれた?

公開日:2026-02-18 2月12日、日本IBM様 箱崎オフィスにて、弊社(NI+C Partners)のパートナー様を対象としたハッカソン「Bobathon(ボバソン)」を開催しました。 Bobathonでは、次世代AIエージェント型開発支援ツールである「IBM Bob」を活用。 USより来日したIBM Bobの開発責任者や、GlobalのTechリーダーをファシリテーターに、 Early Access版(早期アクセス版)のBobを使い倒す、非常に濃密で実践的なワークショップとなりました。 目次 イベント概要 IBM Bobで形にした驚きの活用アイデア パートナー様からのリアルな声 今後の展望とアクション お問い合わせ イベント概要 参加: 7社 17名 目的: IBM Bobを用いた自社利用の具体化、およびお客様への提案アイデアの磨き込み 手法: IBM Bobの実機を使用し、テーマに沿った実践的なプロトタイピングを実施 IBM Bobで形にした驚きの活用アイデア 各社チームに分かれ、Bobを操作しながら導き出された活用案は、どれも現場の課題に即した非常に具体的なものでした。 業務自動化: 紙の社内申請のデジタル化、RFP回答の自動補助、プロジェクトメンバーの最適アサイン 開発・モダナイズ: レガシーRPGコードの解析・モダナイズ支援、ETL構成の自動確認・移行 戦略・分析: 食品ロス防止の在庫分析、特許情報の収集・解析による知財戦略の高度化 スピード開発: キャンペーンサイトの短期間構築・運用 パートナー様からのリアルな声 実際にIBM Bobを触り、他社の活用法を目の当たりにした皆様からは、驚きと期待の声を多数いただきました。 他のパートナー様のアウトプットを見て、業務活用のイメージがぐんと広がりました 自分の中にはなかったアイデアに触れ、非常に刺激になりました 「ついに開発もここまで来たか!」と驚きました。実機を触ることで、想像以上に参考になるイベントでした 立場や業務によって、Bobの用途が無限に広がることを実感できました 今後の展望とアクション 今後は、検討いただいた内容をクライアントゼロとしてご活用いただくこと、および、実案件への提案展開を全力でご支援してまいります。 また、弊社は今後も、IBM様と協業し継続的な「Bobathon」の開催を予定しています。 IBM Bobの社内評価・PoC・導入ご支援 お客様への提案同行のご依頼 これらに関するご相談は、ぜひお気軽にお問い合わせください。 最後になりますが、ご参加いただいたパートナーの皆様、そして素晴らしいファシリテーションをいただいたIBMの皆様、本当にありがとうございました! お問い合わせ エヌアイシー・パートナーズ株式会社 技術企画本部 E-Mail:nicp_support@NIandC.co.jp .highlighter { background: linear-gradient(transparent 50%, #ffff52 90% 90%, transparent 90%); } .anchor{ display: block; margin-top:-20px; padding-top:40px; } .btn_A{ height:26px; } .btn_A a{ display:block; width:100%; height:100%; text-decoration: none; background:#eb6100; text-align:center; border:1px solid #FFFFFF; color:#FFFFFF; font-size:16px; border-radius:50px; -webkit-border-radius:50px; -moz-border-radius:50px; box-shadow:0px 0px 0px 4px #eb6100; transition: all 0.5s ease; } .btn_A a:hover{ background:#f56500; color:#999999; margin-left:0px; margin-top:0px; box-shadow:0px 0px 0px 4px #f56500; } .bigger { font-size: larger; }

back to top