CloudOps Orchestration Service (OOS) は、O&M タスクの管理と実行を支援するために Alibaba Cloud が提供する自動化された O&M サービスです。テンプレートを作成して、実行タスク、タスクの実行シーケンス、入力パラメーター、出力パラメーターを定義し、テンプレートを使用して O&M タスクを自動的に実行できます。
SSH ベースのパスワードなしログオンは、主に自動化された O&M に使用されます。これにより、多数のサーバーの管理を安全かつ便利に自動化できます。多数の Elastic Compute Service (ECS) インスタンスがある場合は、一部またはすべてのインスタンスに対してパスワードなしログオンを構成できます。このトピックでは、OOS を使用して多数の ECS インスタンスのパスワードなしログオンを構成する方法について説明します。
ECS インスタンスが利用可能であることを確認します。利用可能なインスタンスがない場合は、ECS インスタンスを購入します。詳細については、「はじめに」をご参照ください。
パスワードなしログオンを構成する ECS インスタンスに接続するために使用するユーザーは同じである必要があります。
Linux ベースの ECS インスタンスのみがサポートされています。
手順
OOS コンソール にログオンします。
パスワードなしで ECS インスタンスに接続するために使用するユーザーを追加します。ユーザーが追加されている場合は、この手順をスキップします。利用可能なユーザーがない場合は、OSS コンソールの バッチインスタンス操作
ページでスクリプトを実行して、ECS インスタンスにユーザーを追加できます。次の図は詳細を示しています。
テンプレートを作成します。
この例では、テンプレートを使用して ECS インスタンスのパスワードなしログオンを構成します。テンプレートの詳細については、このトピックの「付録 1: パスワードなしログオンのテンプレート」セクションをご参照ください。
スクリプトをコピーして入力ボックスに貼り付け、[テンプレートの作成] をクリックします。このテンプレートは、一部の ECS インスタンスの公開鍵を選択して取得するために使用されます。パスワードなしログオンを構成する ECS インスタンスを選択し、指定したユーザーの公開鍵を構成する必要があります。
テンプレートを実行します。
[カスタムテンプレート] ページで、前の手順で作成したテンプレートを見つけ、[アクション] 列の 実行の作成次の手順: パラメーター設定 をクリックします。[作成] ページで、テンプレートの基本情報を構成し、 をクリックします。
[パラメーター設定] ステップでパラメーターを構成します。ECS インスタンスを手動で選択するか、タグを指定して ECS インスタンスを選択できます。次の図は詳細を示しています。
次の手順: OK作成
をクリックします。パラメーターを確認し、 をクリックします。次に、テンプレートを実行できます。
テンプレートが実行された後、パスワードなしの構成が有効になっているかどうかを確認します。
パスワードなしログオンが構成されている ECS インスタンスに接続します。ユーザーを使用して ssh コマンドを実行します。このようにして、パスワードを入力せずに別の ECS インスタンスに接続できます。次の図は例を示しています。su コマンドを実行して freelogin ユーザーに切り替えます。ssh コマンドは freelogin ユーザーとして実行され、別の ECS インスタンスに接続します。これは、パスワードなしログオンが有効になっていることを示しています。
付録 1: パスワードなしログオンのテンプレート
次の表は、テンプレートに必要なパラメーターを示しています。
パラメーター | 説明 |
regionId | クラスターのリージョン ID。 |
sourceTarget | パスワードなしログオンに必要な公開鍵を持つ ECS インスタンス。 |
destinationTarget | パスワードなしログオンを構成する ECS インスタンス。 |
userName | ECS インスタンスへの接続に使用するユーザーの名前。 |
rateControl | タスク実行の同時実行率。 |
OOSAssumeRole | OOS が使用する Resource Access Management (RAM) ロール。 |
次のスクリプトは、テンプレートの内容を示しています。
FormatVersion: OOS-2019-06-01
Description:
en: 'In the instance, a user is linked without encryption by means of an authorization key.'
ja: インスタンスでは、認証キーを使用して暗号化なしでユーザーがリンクされます。
Parameters:
regionId:
Type: String
Description:
en: The id of region.
ja: リージョンの ID。
AssociationProperty: RegionId
Default: '{{ ACS::RegionId }}'
sourceTarget:
Type: Json
Description:
en: Example of obtaining the secret-free public key when configuring the secret-free login.
ja: シークレットフリーログインを構成する際のシークレットフリー公開鍵の取得例。
AssociationProperty: Targets
AssociationPropertyMetadata:
ResourceType: 'ALIYUN::ECS::Instance'
RegionId: regionId
destinationTarget:
Type: Json
Description:
en: Need to open an instance of password-free login.
ja: パスワードなしログインのインスタンスを開く必要があります。
AssociationProperty: Targets
AssociationPropertyMetadata:
ResourceType: 'ALIYUN::ECS::Instance'
RegionId: regionId
Default:
Type: ResourceIds
ResourceIds: []
userName:
Description:
en: Password-free login username in the instance.
ja: インスタンスのパスワードなしログインユーザー名。
Type: String
rateControl:
Description:
en: Concurrency ratio of task execution.
ja: タスク実行の同時実行率。
Type: Json
AssociationProperty: RateControl
Default:
Mode: Concurrency
MaxErrors: 0
Concurrency: 10
OOSAssumeRole:
Description:
en: The RAM role to be assumed by OOS.
ja: OOS がアシュームする RAM ロール。
Type: String
Default: OOSServiceRole
RamRole: '{{ OOSAssumeRole }}'
Tasks:
- Name: getSourceInstance
Description:
en: Get an instance that needs to be logged in without password.
ja: パスワードなしでログインする必要があるインスタンスを取得します。
Action: 'ACS::SelectTargets'
Properties:
ResourceType: 'ALIYUN::ECS::Instance'
RegionId: '{{ regionId }}'
Filters:
- '{{ sourceTarget }}'
Outputs:
instanceIds:
Type: List
ValueSelector: 'Instances.Instance[].InstanceId'
- Name: getDestinationInstance
Description:
en: Views the ECS instances than to ssh without password.
ja: パスワードなしで ssh する ECS インスタンスを表示します。
Action: 'ACS::SelectTargets'
Properties:
ResourceType: 'ALIYUN::ECS::Instance'
RegionId: '{{ regionId }}'
Filters:
- '{{ destinationTarget }}'
Outputs:
instanceIds:
Type: List
ValueSelector: 'Instances.Instance[].InstanceId'
- Name: generateOrGetPublicKey
Action: 'ACS::ECS::RunCommand'
Description:
en: Generate or get a public key.
ja: 公開鍵を生成または取得します。
Properties:
regionId: '{{ regionId }}'
commandContent: |-
#!/bin/bash
username="{{ username }}"
if [ $username == root ]; then
if [ ! -e "/root/.ssh/id_rsa.pub" ]; then
ssh-keygen -f "/root/.ssh/id_rsa" -P "" >> /dev/null
fi
cat /root/.ssh/id_rsa.pub
else
if [ ! -e "/home/$username/.ssh/id_rsa.pub" ]; then
su $username -l -c "ssh-keygen -f /home/$username/.ssh/id_rsa -P '' >> /dev/null"
fi
chmod 700 /home/$username/.ssh
cat /home/$username/.ssh/id_rsa.pub
fi
instanceId: '{{ ACS::TaskLoopItem }}'
commandType: RunShellScript
Loop:
RateControl: '{{ rateControl }}'
Items: '{{ getSourceInstance.instanceIds }}'
Outputs:
publicKeys:
AggregateType: 'Fn::ListJoin'
AggregateField: publicKey
Outputs:
publicKey:
Type: String
ValueSelector: invocationOutput
- Name: converPublicKeyToStr
Action: 'ACS::ECS::SMCConversionConstantByJqScript'
Description:
en: Convert public key to string.
ja: 公開鍵を文字列に変換します。
Properties:
parameter:
'Fn::Jq':
- First
- 'join(",")'
- '{{ generateOrGetPublicKey.publicKeys }}'
jqScript:
- '.[0] | .'
- '.[0] | .'
Outputs:
publicKey:
Type: String
ValueSelector: 'firstValue | split(",") | join("\n")'
- Name: authorizedInstances
Action: 'ACS::ECS::RunCommand'
Description:
en: Enable password-free login for users in the instance.
ja: インスタンス内のユーザーのパスワードなしログインを有効にします。
Properties:
regionId: '{{ regionId }}'
commandContent: |-
#!/bin/bash
username="{{ username }}"
publicKey="{{ converPublicKeyToStr.publicKey }}"
if [ $username == root ]; then
if [ ! -e "/root/.ssh/id_rsa.pub" ]; then
ssh-keygen -f "/root/.ssh/id_rsa" -P "" >> /dev/null
fi
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
else
if [ ! -e "/home/$username/.ssh/id_rsa.pub" ]; then
su $username -l -c "ssh-keygen -f /home/$username/.ssh/id_rsa -P '' >> /dev/null"
fi
chmod 700 /home/$username/.ssh
cat /home/$username/.ssh/id_rsa.pub >> /home/$username/.ssh/authorized_keys
fi
if [ $username == root ]; then
cat >> /root/.ssh/authorized_keys << eof
$publicKey
eof
else
cat >> /home/$username/.ssh/authorized_keys << eof
$publicKey
eof
fi
instanceId: '{{ ACS::TaskLoopItem }}'
commandType: RunShellScript
Loop:
RateControl: '{{ rateControl }}'
Items: '{{ getDestinationInstance.instanceIds }}'
Outputs:
commandOutputs:
AggregateType: 'Fn::ListJoin'
AggregateField: commandOutput
Outputs:
commandOutput:
Type: String
ValueSelector: invocationOutput
Outputs:
commandOutputs:
Type: List
Value: '{{ generateOrGetPublicKey.publicKeys }}'