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”.

 

 

その他の記事

2025年03月26日

【てくさぽBLOG】VMwareユーザー必見!IBM CloudのVCFaaSで、コストを抑えたままVMwareを継続利用

公開日:2025-03-26 こんにちは。てくさぽBLOGメンバーの宮里です。 皆さんは VMware を利用されていますか?多くの企業が仮想化技術のリーダーである VMware を採用されていますが、Broadcom による買収とそれに伴うライセンス体系の変更で価格が高騰し、多くの企業にとって大きな課題となっています。 このブログでは「VMwareを使い続けたいけど高いライセンスを買うのは嫌!」というお客様に向けて、その最適な解決方法として IBM Cloud for VMware Cloud Foundation as a Service を詳しくご説明します。 目次 VMwareを更新する際の課題 VCFaaSとは VCFaaSのメリット まとめ お問い合わせ VMwareを更新する際の課題 VMware を更新するにあたり、以下の3つの課題が存在します。 価格の高騰化 ライセンス体系の変更に伴いユーザーごとに購入可能なエディションは Broadcom側が設定するようになり、ユーザー側で自由にエディションを選択することができなくなりました。また、以前までの基本ライセンス+アドオンとしての使い方がパッケージ化されたことにより、柔軟性が以前よりも乏しくなってしまっています。 ライセンス料金が約1.2倍近く、ユーザーによっては購入できるライセンスの制限により、最大でも約8倍近く膨れ上がってしまう場合もあります。 DRサイトにかかるコスト 全ての機器が VMware である必要はないものの特定の環境では引き続き VMware を維持したい、など、依然として VMware を使用しなければならないユーザーも多く存在します。 「どうにかコストは抑えたまま今まで通りに VMware を使い続けたい。」という場合に重要なのが、DR(ディザスタリカバリ)サイトの運用方法です。DRサイトはビジネスを継続するための重要な要素ですが普段から使う環境ではないため、サービスレベルは維持しつつコストはおさえることが必要です。 見積もりに時間がかかる VMware のライセンス体系が変更されてから「VMwareのライセンス見積もりに時間がかかる」というお声もよく耳にします。これは、個別見積対応となるため見積を取得するまでに時間がかかってしましまうことが原因となっています。 特に急いでいるプロジェクトの予算計画を立てる際の大きな課題となります。 VCFaaSとは VMware Cloud Foundation as a Service(以下 VCFaaS)は、IBM Cloud上でハードウェアリソースと VMware のライセンスを提供するクラウドサービスです。1VMから利用でき、クラウドサービスのためハードウェアの調達やソフトウェアのライセンス管理に煩わされることなくすぐに利用を開始できます。 シングルテナントとマルチテナント VCFaaS は、シングルテナントとマルチテナントの2つモデルを提供しています。 マルチテナントモデルでは、月額約18,900円(127米ドル)からのスモールスタートが可能です。手頃な価格でスタートできるため、小規模なプロジェクトや初期段階の導入に最適です。一方、シングルテナントモデルはより大規模な運用や特別な要件が必要な場合に適しています。2台のサーバー(vSANプロファイルの場合は6台のサーバー)が最小構成として必要です。 ※2025年3月19日時点の価格 モデルごとの特長 マルチテナントモデル: 1VMから利用可能で、数分で利用開始が可能 オンデマンドタイプは時間課金、リサーブドタイプは月額課金のどちらかを選択可能 仮想サーバのプロファイルを複数から選択可能 課金単位はvCPUおよびRAM(1ゲストOSから) シングルテナントモデル: ユーザー専用の物理ホストを提供し、ハイパフォーマンスとセキュリティを確保 リザーブドタイプによる月額課金のみ 複数のIBM Cloud Bare Metal Serversからプロファイルやコンポーネントを必要に応じて選択可能 課金単位は物理ホスト(2台から) VCFaaSのメリット VCFaaS を導入することによって得られる具体的なメリットについて詳細にご説明します。 コスト効率と柔軟性 VCFaaS は必要に応じてリソースを容易に追加・削減することができ、ビジネスの規模やワークロードに合わせた最適なリソース管理が可能です。また、高可用性の管理プレーンを通じて VCFaaS が提供しているハードウェアとハイパーバイザーの監視やパッチ適用、アップグレード、セキュリティ管理を IBM が支援するため、企業は安心してクラウド環境を運用することができます。 以上の様に VCFaaS は迅速な展開と運用が可能であり、コスト効率と柔軟性を兼ね備えたクラウドソリューションと言えます。 DRサイトのコスト低減 VCFaaS は VMware Cloud Director Availability(VCDA)というツールが利用可能で、既存のオンプレミス環境と IBM Cloud間を簡単に行き来することができます。 すぐに本番環境を移行ができない場合、DRサイトだけでも VCFaaS に移行させることでデータセンターやラックの費用を抑えることができ、DRサイトの運用にまつわるコストを削減することができます。 迅速な見積もり IBM Cloud による見積もりプロセスは非常にシンプルであり、金額情報も明確に公開されています。複雑な計算や営業担当との煩雑なやり取りをせずに、必要なコスト情報を迅速に入手することが可能です。 また、マルチテナントモデルを選択することで購入後すぐにデプロイして利用を開始することが可能です。この即時性によりリードタイムを大幅に短縮し、迅速なビジネス運用を実現できます。ITリソースの準備を待つことなく、すぐにプロジェクトを始動できるため、タイムロスを最小限に抑えられます。 まとめ VCFaaS は、VMware のライセンス体系の変革や DRサイトの運用コスト、見積もり時間の課題をまとめて解決するクラウドソリューションです。IBM Cloud上で提供されるこのサービスはマルチテナントとシングルテナントの2つのモデルを選択可能で、柔軟かつ拡張性に優れた環境を提供します。特にマルチテナントモデルでは手軽にスモールスタートが可能で、小規模プロジェクトやテスト環境に最適です。 また、DRサイトのコストを大幅に低減する機能や迅速な見積もりプロセスにより、ビジネスのスピードを損なうことなく運用を開始でき、ストレスフリーで効率的なクラウド環境を実現し、ビジネスの成長と変化に柔軟に対応することが可能です。 VMware の環境をご利用の方は、まずは 1VM からでも VCFaaS の良さを体感してみていただけたらと思います。このブログを見て興味を持たれた際は、是非一度ご相談ください。 お問い合わせ この記事に関するご質問は以下の宛先までご連絡ください。 エヌアイシー・パートナーズ株式会社技術企画本部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: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; } .bigger { font-size: larger; }

2025年03月25日

【てくさぽBLOG】IBM watsonx Orchestrateを使ってみた(Part2)

公開日:2025-03-25 こんにちは。てくさぽBLOGメンバーの高村です。 当ブログ Part1 (前回記事)では、watsonx Orchestrate の概要と IBM Cloud版 watsonx Orchestrate のプロビジョニングおよび環境設定をご紹介しました。Part2(本記事)では、生成AIスキル、プリビルドスキルおよびスキルフローを作成し、検証してみた感想をご紹介します。 目次 はじめに 検証シナリオ 検証実施 さいごに お問い合わせ はじめに 検証に入る前に watsonx Orchestrate について簡単におさらいをしたいと思います。 watsonx Orchestrate は、チャットにやりたいことを入力するだけで複数のシステムへログインすることなく処理を実行し、生成AI を活用して効率的に業務を遂行できる製品です。主要機能には、様々なアプリケーションと連携するためのプリビルドスキルや生成AI を活用したスキル作成、プリビルドスキルや生成AIスキルを一連のスキルとして実行できるスキルフローなどが備わっています。 ※機能の詳細については Part1 をご参照ください。 検証シナリオ 検証のシナリオは、営業担当者が顧客との打ち合わせ後に議事録をまとめ、それを関係者に送信し、さらに社内の営業支援システム(以下SFA)に登録する作業を想定しています。 通常では以下の図の様に、打ち合わせ後に人力で会議ツールから会議情報を取得し、メモを議事録としてまとめ、メールツールを起動して関係者へメールを送信し、その後 SFA へ議事録を登録する、という流れになるかと思いますが、このような作業は時間がかかるうえに日常業務の中でも頻繁に発生します。 watsonx Orchestrate を使用すると、チャットに「議事録の作成と送信」と入力するだけで、会議ツールから情報を取得、議事録をまとめ、メールのドラフトを作成、SFA への登録を実行するため、作業時間の短縮と情報の共有、SFA への登録忘れの防止、コピー&ペーストミスの低減ができます。 検証環境 Part1 でプロビジョニングした IBM Cloud上の watsonx Orchestrate を利用します。検証では、会議ツールは Webex(無償版)、メールツールは Gmail(弊社アカウント)、議事録を登録する SFA は Salesforce(弊社Sandbox環境)を使用します。 検証実施 前述の通り、会議ツール(Webex)から会議情報を取得し、会議メモを生成AI が要約し、メールツール(Gmail)でメールドラフトを作成し、内容を確認してメール送信し、SFA(Salesforce)に登録する、という処理を作成していきます。 ※以降から検証の紹介になりますが、まずは watsonx Orchestrate での処理の流れを見たいという方は、「こちらの動画」をご覧ください。 1. 生成AIスキルの作成 まずはじめに、議事録をまとめる生成AIスキルを作成します。(以下の図オレンジ色の枠部分) 左サイドメニューから「スキル・スタジオ」をクリック 右上の「作成」プルダウンを開き「プロジェクト」をクリック 「Name」に任意のプロジェクト名を入力(当検証では「イニシャル_Summary」と入力しています。) 入力後「Create」をクリック スキルタイプ選択画面にて「Generative AI」をクリック 「Name」に任意のスキル名を入力(当検証では「イニシャル_Summaryskill」と入力しています。) 入力後「Create」をクリック 以下の画面が表示されます。デフォルトで選択している言語モデルは利用可能期限が近いため、画面上部に "Foundation model deprecated~" とアテンションが表示されています。 「Model: ibm/granite-15b-chat-v2」右横のプルダウンを開き、言語モデルを変更(当検証では「mixtral-8x7b-instruct-v01」を選択しています。) アテンションが消え、以下の画面の状態になります。 以下の画面①~⑤の入力・設定 1-9-1. 言語モデルのパラメータ値(Parameters)を設定 当検証では最小値 "1"、最大値 "3000" にしてトークンを設定し、出力の長さを調整します。(最大値は言語モデルによって異なる) 1-9-2. 変数を設定 watsonx Orchestrate では生成AI の入力として変数を使用することができます。Variables で会議メモを変数 "text" として設定します。 1-9-3. コンテキスト(Context)を設定 会議メモの内容をもとに日本語で議事録を作成する指示文を入力します。会議メモの箇所は変数 {{text}} に設定します。(変数は{{}}で囲う) 1-9-4. 入力プロンプト(Prompt input)を設定 ここでは言語モデルに応答してほしい文を入力します。今回は変数 {{text}} のみを入力します。 1-9-5. インプット・アウトプットの例(Training examples)を入力 「New example +」をクリックし、インプットとアウトプットの例をそれぞれ入力します。 右上の「Generate」をクリックすると文章が生成され、Generated output(出力プロンプト)で文章を確認できます。 次に、生成AI を公開してスキルを使用できるように設定します。 スキル名の横にある目のマークをクリックし、地球儀のマークに変更 右上の「Share changes」をクリック 「Share」をクリック 表示されたポップアップにて「Share」をクリック 右上に "Success" とポップアップされることを確認し、左の「← Back to xx_Summary」をクリックして戻る 右上の「Publish」をクリック 表示された「Version and publish」画面にて「Version name」に任意のバージョン名を入力し、「Create version and publish」をクリック(当検証では「1.0.0」と入力) 右上に "Published" と表示されることを確認し、左上の「←(PJ名)」をクリック 「スキル・スタジオへようこそ」画面にて、「スキルおよびアプリ」を選択 スキル一覧に作成したスキルの状況が「公開済み」となっていることを確認後、スキルの右側をクリックし「このスキルの強化」を選択 スキルの強化画面が表示されます。ここではスキルを実行する際の入力項目、出力項目、呼び出すためのフレーズを設定できます。今回は句タブでスキルを呼び出すフレーズのみ設定します。 句タブをクリックし、スキルを呼び出すフレーズを日本語で3つ追加 追加後、画面下の「発行」をクリック 右上に「正常に公開されました」と表示されることを確認 メインメニューから「スキル・カタログ」をクリック スキル・カタログから作成したスキルを自分のスキルとして追加します。 検索バーにイニシャルを入力し「スキル」をクリック タイル内の「スキルの追加 +」をクリックし、「追加」となることを確認 以上でスキルを実行する準備が整いました。早速チャットから実行してみましょう。 メインメニューから「チャット」をクリック チャット画面が表示されます。 下部の「スキルタイル」をクリックまたは入力バーにフレーズを入力(当検証では「議事録をまとめて」と入力しています。) 呼び出されたスキルを選択 text欄にサンプルの会議メモを入力し「適用」をクリック 10秒ほどで文章が生成されました。会議メモから体裁の整った議事録が生成されています! 生成AIスキルの作成は以上で完了です。 スキル作成自体の難易度は高くありませんが、整理された議事録を生成してほしいためプロンプト指示文の調整に時間がかかりました。Context の内容は指示ごとに改行し、日本語で生成することを明記するなど工夫が必要です。また最大トークン数2000としていましたが議事録が途中できれてしまう現象があったため、最大トークンを3000にして調整しました。言語モデルごとに最大トークン数、対応言語は異なるため、複数のモデルをテストして最も期待に合ったモデルを選択することをお勧めします。 2. プリビルドスキルの作成 次に、プリビルドスキルを追加ます。(以下の図緑色の枠部分) まず、Webex のプリビルドスキルを追加します。当検証では会議情報をリストする「List all meeting」とその会議情報から参加者のメールアドレス情報を取得する「List meeting invitees」を追加します。 メニューバーから「スキルカタログ」を選択し、Webexのタイルをクリック 次に、Webex への接続設定を行いなす。 「アプリの接続」をクリック Bearer Token を入力し「アプリの接続」をクリック(WebexのBearer TokenはWebex for Developersから取得しました。) 「正常に接続されました」というポップアップが表示されます。 「List all meetings」の「スキルの追加」をクリック 「追加」となったことを確認 会議参加者のメールアドレスを取得するため「List meeting invitees」を同様に追加 Webex の2つのプリビルドスキルをチャットから呼び出すことができるか確認します。 メニューからチャットを開きList all meetingsのタイルをクリックし、activeな会議をクリックするとスケジュールされている会議情報が表示されることを確認 List meeting inviteesのタイルをクリック 対象会議を選択すると、参加者の e-mailアドレスが表示されることが確認できます。※後続のGmailプリビルドスキルでメール送信先として使用します。 次に、議事録送信するための、Gmail の Send a email のプリビルドスキルを追加します。 スキルカタログからGmailの「Send a email」を選択し「アプリの接続」をクリック アカウント選択画面にて、検証用アカウントをクリック 以下の画面が表示にて「次へ」をクリック 「追加」となっていることを確認 これで、チャットから Gmail を呼び出しメールを送ることが可能になりました。 最後に、Salesforce へ議事録を登録するため、Salesforce のプリビルドスキルを追加します。ここでは、会議参加者のメールアドレスから対象リードをリストしオポチュニティーIDを取得する「Get all leads」と、Salesforceの商談に議事録を書き込む「Update an opportunity」の2つのプリビルドスキルを追加します。 スキルカタログを選択し、Salesforceのタイルをクリック 右上の「アプリの接続」をクリック Salesforce への接続に CustomURL を追加します。 (当検証ではSandbox環境を利用するため)「test.salesforce.com」を入力し「アプリの接続」をクリック 別ウィンドウに Salesforceログイン画面が表示されます。 ユーザー名、パスワードを入力しログインをクリック アクセス許可画面が表示されるので確認します。 画面をスクロールし「許可」をクリック 右側に「接続済み」と表示されました。 プリビルドスキルを追加します。 「Get all leads」をクリックし「追加」となることを確認 同様に「Update an opportunity」をクリックしてスキルを追加 これで Salesforce の商談に議事録を書き込むスキルが整いました。処理の動きは次のスキルフローで確認します。 3. スキルフローの作成 生成AIスキルと複数のプリビルドスキルを繋げたスキルフローを作成します。(以下の図ピンク色の枠部分) メインメニューバーから「スキルスタジオ」をクリック 「プロジェクト」を選択し「作成」から「スキル・フロー」をクリック 以下の画面にて、鉛筆マークをクリック 右側に任意のスキルフロー名を入力し「Save」をクリック 左画面のフローにスキルを追加していきます。追加したスキルは開始から終了へ順番に実行され、画面の「+」をクリックするとスキルをフローに追加することができます。 はじめに Webex のプリビルドスキルを追加します。 List all meetingsの「Add Skill +」をクリック 追加が完了すると以下の画面の様になります。 同様にWebexのList meeting inviteesスキルを追加 追加が完了すると以下の画面の様になります。 議事録生成する生成AIスキル、GmailのSend a emailスキル、SalesforceのGet all leads、Update an opportunityスキルの順に追加 全ての追加が完了すると以下の画面の様になります。(画面ショットの都合上、Update an opportunityスキルは省略しています。) 次に、スキル実行結果から得られる値を次のスキルの引数として渡す設定をします。 フロー内のList meeting inviteesをクリック 右側に表示された入力時の引数設定画面meetingId欄にて、List all meetingsスキルから得られる値を選択(当検証ではidを選択しています。) 設定が完了すると以下の画面の様になります。 Send a email の入力引数を以下の様に設定※richTextBody.Content は生成AIスキルで生成された議事録がメールドラフト本文に自動的に入力されるように設定します CC:List all meetingsから"hostEmail"を選択 To:List meeting inviteesから"email"を選択 Subject:List all meetingから"title"を選択 richTextBody.Content:生成AIスキルから"generated_text"を選択 次に、Salesforce の Get all leads に入力引数を設定します。 Emailの値に、List meeting inviteesから「email」を選択 さらに、Update an opportunityに入力引数を設定します。 Descriptionに、生成AIスキルから「generated_text」を選択 Filterable input欄の"Value"の値に、Get all leadsの「ConvertedOpportunityid」を選択 設定完了後、画面上部Actionsの「Save as draft」をクリック スキル・スタジオの画面に戻り、スキルフロー右側の「このスキルの強化」をクリック 「句」タブにてスキルフローを呼び出すフレーズを入力(当検証では「議事録を送信して」と入力しています。) 入力後「発行」をクリック 状況が公開済みとなっていることを確認 以上でスキルフローの作成は完了です。 スキルフローを実行するためには、スキルからスキルへ引数を設定する必要があります。どのスキルのどの実行結果を引数として設定すればよいか検討が必要ですが、UI から簡単にスキルフローを作成することができました。 4. スキルフローを実行してみる(動画あり) 長くなりましたが、スキルフローを実行します!チャットから「議事録を送信して」と入力してみます。 処理結果は以下の動画をご覧ください。※音声・字幕無しの動画となっております。動作に関してご不明点がございましたら、お問い合わせ までご連絡ください。※画面右下音量調整マーク右横のアイコンをクリックすると動画表示画面を拡大できます [video width="720" height="405" mp4="https://www.nicpartners.co.jp/wp-content/uploads/2025/03/nicp-tech-blog_wxo_2025-03.mp4"][/video] 会議メモを議事録にまとめ、メール送信、Salesforce への登録作業がほんの3分程度で完了しました!複数のアプリにログインすることなく watsonx Orchestrate の画面から操作できるため、作業時間の短縮になり業務効率化になるのではないでしょうか。 さいごに いかがでしたでしょうか。Part2 では、生成AIスキル、プリビルドスキル、スキルフローの作成と実行を行いました。 生成AIを操作するにあたりプロンプトの技術は必要ですが、watsonx Orchestrate ではノーコードで生成AIスキルを作成できるため、開発未経験者の方も手軽に生成AI を活用したスキルを作成することができると思います。また、チャット画面が提供されているのでインターフェースUI を作る必要がなく、チャットから出来上がったスキルを呼び出すことが可能です。 今回利用した Standardプランはスキル・スタジオで生成AIスキルを作成することができるプランです。Essentialプランにはスキル・スタジオでの生成AIスキル作成の機能が含まれていないため、別途API経由で生成AI を呼び出す実装工程が必要になります。 プリビルドスキルについては、意外にも躓いた点はアプリケーションの認証です。アプリケーションの認証情報は各アプリケーションにより異なりますので、事前に認証情報をご確認いただくことをお勧めします。 今回検証したスキルフローはプリビルドスキルを繋げた構成で、フロー中に分岐は含めていません。実業務では作業の結果によって次の作業が分岐する場合もあると思いますので、Part1 で記載したスキルフローの分岐機能も利用できると思います。 当ブログ(Part1、Part2)では、チャットからスキルを呼び出しましたが、今後は AIアシスタントからのスキルの呼び出しや、複数の AIアシスタントを束ねる AIエージェントについても検証してみたいと思います。 お問い合わせ この記事に関するご質問は以下の宛先までご連絡ください。 エヌアイシー・パートナーズ株式会社技術企画本部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: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; } .bigger { font-size: larger; }

2025年02月26日

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

こんにちは。てくさぽブログメンバーの佐野です。 2025年2月12日・13日に、愛徳会主催(日本IBM共催)のイベント「watsonx Tech Challenge 2024」が IBM箱崎にて開催され、弊社ではソリューション推進部から5名とソリューション企画部から1名の合計6名が参加しました。 本記事では、イベントの様子をレポートいたします。 チーム写真撮影風景 目次 イベントの概要と参加のきっかけ イベント当日までの準備 イベント当日 感想・まとめ お問い合わせ イベントの概要と参加のきっかけ このイベントは、IBM watsonx を活用したビジネスを実現出来る技術者の育成を目的とした、ハッカソン/アイディアソンです。「地域課題解決(人口減少、少子高齢化、労働力不足)」「環境問題対策」「わくわく社会の実現」の3つのテーマに関連する課題を watsonx を使ってどのよう解決できるのかのアイディアをチームで検討し発表する場となります。また、スキルのキャッチアップとして月次で「watsonx.ai Dojo」が配信されており、そこでは、watsonx.ai の使い方や watsonx で何ができるか、といったことが説明されています。 実は NI+C P(弊社)はこのイベントのスポンサーなのですが、 「我々自身がお客様へ watsonx を提案する際にも "具体的にどのようなシーンで使えるのだろう?" ということを自分たちで考えてみる場としてチャレンジしてみよう!」 という思いで参加することにしました。 個人的には、「他の参加者の方々がどういうアイディアを持ってくるのかな?」という興味もありました。 イベントの案内ページには "事前準備不要" と表記されていたものの、上記のテーマを検討しアウトプットするための作業がとても正味1日だけで完成できるものではないと感じたため、事前準備としてテーマに沿った内容を検討しソリューションの内容を固めることにしました。 イベント当日までの準備 まずはテーマに沿った課題を抽出しその課題を watsonx でどう解決できるのか、その実装を検討することにします。幅広く意見が欲しかったので本部内のメンバーに声をかけテーマにおける課題感や実装アイディアを募集したところ、合計で19個の課題を集めることができたのですが、ここから苦戦します… 1つずつ内容を確認しペルソナとその課題、効果、ビジネス拡張性を定義していったのですが、ペルソナが「行政」や「被災者」という設定になり、当事者でない我々では課題の想像を膨らませるだけで、具体性が欠けて課題や効果がぼやけてしまったのです。また、調査を進めると実現しようとしていることの類似サービスが既に多く存在していることも判明し、「いろいろなサイトの情報をまとめる比較し最適なものをお勧めする」というような結論となります。そうなるとだれからどのようにお金をもらうのか?マネタイズの面も怪しくなってしまいます。 検討を重ねていくうちに時間が過ぎて1月末になり、イベントまでの残り2週間ではソリューションを固めるのは難しい状況となりました。そこで事前準備のゴールを変更し、「自分もしくは家族」または「取引先」といった身近な人をペルソナとした課題抽出をし、後は当日にディスカッションし内容を固めることにしました。 イベント当日 1日目 まず発表順の抽選がありました。結果、最初でも最後でもない3番手という、なかなかな(個人的にはホッとする)順番を引き当てました。 イベント期間中は各チーム毎に1部屋が割り当てられ、それぞれの部屋で最終準備をします。IBM様がテクニカルなフォローのため相談部屋で待機されていました。 我々は事前に洗い出しておいた課題を整理し、解決すべきモノとして「高齢者向けのサービス」に絞り、さらにディスカッションで発散と収束を繰り返し、最終的に発表内容を「地方に住む高齢の両親が安全・安心に暮らしているかをリモートから見守るサービス」に決定しました。この段階では事前準備の最初に検討したことも活かせており、某セキュリティ会社が類似の見守りサービスを提供していることは把握していましたが、観点やアプローチが異なるため十分ニーズがあり差別化できるものであると結論を出しました。 初日はここまでで時間切れとなり、発表資料は2日目に役割分担して作ることとし、解散となります。 ミーティング風景 2日目 発表資料に何を書くかは初日にプロットしてあるので、あとは資料を作るだけです。発表時間は7分しかないので、作りこむチャートは5枚に絞ります。 初日に役割分担を決めておいたこととメンバーそれぞれが事前に内容を考えてきてくれたこともあり、資料はすんなりと完成。内容も、十分にメッセージを伝えられる内容に仕上げられたと自負しています。 午後の発表に向け、朝に配布された青いシャツを着て準備万端、いよいよ発表の時です。 発表中の様子 私が発表を担当したのですが、なんと、発表時間を2分余らせるというひどい時間管理ミスをやらかしてしまいました。QAタイムも想定外の質問に苦戦し、反省しきりの状態でした… ともあれ、発表後はメンバー全員の緊張が解けて笑顔が見られるようになりました。 発表後のメンバーの様子 全チームトラブルもなくスムーズに発表が終わり、ついに採点です。 発表は失敗の自覚があったので「審査員の反応は悪くなかったけれど、真ん中ぐらいなんじゃないかな」とぼんやり考えていると、あっという間に結果発表の時間がやってきました。スポンサー賞、優秀賞、最優秀賞の順番で発表されていきます。(『』内は私の心情です) スポンサー賞(レノボ・ジャパン賞)・・・・・田中電機工業様チーム!『うちが一番可能性ありそうなのはこの賞だったけど違ったかー』 スポンサー賞(エヌアイシー・パートナーズ賞)・・・・・スカイウイル様チーム!『ここは…まあ、ないよね』 優秀賞・・・・・CSS様チーム!『うんうん。キントーンとの連携はユースケース多そうだった』 優秀賞・・・・・エヌアイシー・パートナーズチーム!『うんうん。。。え!まじで!!』 最優秀賞・・・・・オーイーシー様チーム!『うん。ここは発表資料が一番印象的だった』 という結果で、我々のチームは晴れて優秀賞をいただくことができました。受賞者の一言では適当なことを言っていた気がします。まったく覚えていません。 受賞の記念撮影を愛徳会会長の藤田さんとパシャリ。 愛徳会 藤田会長とNI+C Pチーム 感想・まとめ 今回、幸いにも「優秀賞」をいただくことができました。 私としては、自チームのよかったところは、今後の拡張性に可能性があるところかなぁと思います。他チームの発表内容も素晴らしかったので、かなり僅差だったのではないでしょうか。 ただ、最優秀賞のオーイーシー様においては、おそらく誰もが納得のダントツTOPでした。発表資料は事前に準備してきたものだと確信できるほどの出来で、事前準備の差が歴然でした。これは、イベント期間である1日のワーク時間をどう使うのかの考え方に差があったようです。また、チーム内での事前の課題検討で発表対象から外した課題(災害時の避難支援や自治体向けの企業誘致支援)をうまく深堀しているチームもあり、課題を捉えた後にいかに深堀りできるかが大事なんだとあらためて考えさせられました。 このように、他チームの発表を聞くことで自分たちができていたこと・できていなかったこと、今後改善できそうなことを学ぶことができ、大変有意義な機会となりました。メンバー全員、今回のイベントでは前向きな刺激を受けたようです。(以下メンバーの感想) 「Dojoでwatsonx.aiを勉強したがデモを作って発表にまで至らなかったのは残念だった。」 「テレワークが主体なので、オンサイトでチーム集ってまとまった時間の中ディスカッション、アウトプットすることが刺激になった。たまにはオンサイトでの共同作業をやりたい。」 「発表資料作成時間が限られている中、意見を出し合って効率的に作成できた。」 「テーマが大きすぎて自分事に捉え切れなかった。視点を変えることが大事だと学んだ。」 「IBM様の寸劇やオーイーシー様のEVA風発表資料のように、プレゼンテーションにも遊び心があると聞き手の印象が変わることを実感できた。」 「普段から情報のアンテナを張っておくことが重要であり、それをビジネスのヒントと捉え意識することで普段から良いアイディアが発想できそう。」 「他の要素との組み合わせ、その次のステップではどうなるのか?などモノゴトの周辺や先のことを融合させることでアイディアに厚みと説得力が加えられることが理解できた。」 イベントで各チームの発表内容を、守隨 佑果(しゅずい ゆか)様(https://shuzui-yuka.com/)がグラフィックレコーディングしてくださいました。事前情報なしの一発勝負でこれを作れるのは、「スゴイ!」の一言です。 守隨佑果さまのグラフィックレコーディング 今回のイベントに参加したことで、チームメンバー全員がよい経験を積むことができました。オンサイトでまとまった時間にみんなで作業したことで学ぶことも多くありました。この経験を今後の活動にも活かしていきます。 おまけ 2日目のお昼ご飯には、主催の愛徳会様が用意してくださった人形町今半の美味しいお弁当をいただきました。 人形町今半のお弁当 お問い合わせ エヌアイシー・パートナーズ株式会社技術企画本部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: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; } .bigger { font-size: larger; }

back to top