すべてのプロダクト
Search
ドキュメントセンター

CloudOps Orchestration Service:複数の ECS インスタンスのパスワードなしログオンを OOS を使用して構成する

最終更新日:Jan 17, 2025

CloudOps Orchestration Service (OOS) は、O&M タスクの管理と実行を支援するために Alibaba Cloud が提供する自動化された O&M サービスです。テンプレートを作成して、実行タスク、タスクの実行シーケンス、入力パラメーター、出力パラメーターを定義し、テンプレートを使用して O&M タスクを自動的に実行できます。

SSH ベースのパスワードなしログオンは、主に自動化された O&M に使用されます。これにより、多数のサーバーの管理を安全かつ便利に自動化できます。多数の Elastic Compute Service (ECS) インスタンスがある場合は、一部またはすべてのインスタンスに対してパスワードなしログオンを構成できます。このトピックでは、OOS を使用して多数の ECS インスタンスのパスワードなしログオンを構成する方法について説明します。

重要

  1. ECS インスタンスが利用可能であることを確認します。利用可能なインスタンスがない場合は、ECS インスタンスを購入します。詳細については、「はじめに」をご参照ください。

  2. パスワードなしログオンを構成する ECS インスタンスに接続するために使用するユーザーは同じである必要があります。

  3. Linux ベースの ECS インスタンスのみがサポートされています。

手順

  1. OOS コンソール にログオンします。

  2. パスワードなしで ECS インスタンスに接続するために使用するユーザーを追加します。ユーザーが追加されている場合は、この手順をスキップします。利用可能なユーザーがない場合は、OSS コンソールの バッチインスタンス操作image ページでスクリプトを実行して、ECS インスタンスにユーザーを追加できます。次の図は詳細を示しています。

  3. テンプレートを作成します。

この例では、テンプレートを使用して ECS インスタンスのパスワードなしログオンを構成します。テンプレートの詳細については、このトピックの「付録 1: パスワードなしログオンのテンプレート」セクションをご参照ください。

スクリプトをコピーして入力ボックスに貼り付け、[テンプレートの作成] をクリックします。このテンプレートは、一部の ECS インスタンスの公開鍵を選択して取得するために使用されます。パスワードなしログオンを構成する ECS インスタンスを選択し、指定したユーザーの公開鍵を構成する必要があります。freelogin-02

  1. テンプレートを実行します。

[カスタムテンプレート] ページで、前の手順で作成したテンプレートを見つけ、[アクション] 列の 実行の作成次の手順: パラメーター設定freelogin-03 をクリックします。[作成] ページで、テンプレートの基本情報を構成し、 をクリックします。

  1. [パラメーター設定] ステップでパラメーターを構成します。ECS インスタンスを手動で選択するか、タグを指定して ECS インスタンスを選択できます。次の図は詳細を示しています。freelogin-05

  2. 次の手順: OK作成freelogin-06 をクリックします。パラメーターを確認し、 をクリックします。次に、テンプレートを実行できます。

  3. テンプレートが実行された後、パスワードなしの構成が有効になっているかどうかを確認します。

パスワードなしログオンが構成されている ECS インスタンスに接続します。ユーザーを使用して ssh コマンドを実行します。このようにして、パスワードを入力せずに別の ECS インスタンスに接続できます。次の図は例を示しています。su コマンドを実行して freelogin ユーザーに切り替えます。ssh コマンドは freelogin ユーザーとして実行され、別の ECS インスタンスに接続します。これは、パスワードなしログオンが有効になっていることを示しています。freelogin-07

付録 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 }}'