全部產品
Search
文件中心

:使用系統營運管理配置多台執行個體的免密登入

更新時間:Jul 01, 2024

系統營運管理是阿里雲提供的雲上自動化營運服務,能夠自動化管理和執行任務。您可以通過模板來定義執行任務、執行順序、執行輸入和輸出,然後通過執行模板來完成任務的自動化運行。

SSH免密登入大多用於自動化營運,主要是安全方便自動化管理大批伺服器。如果您有大量的執行個體,期望可以將部分或全部的執行個體配置成免密登入。那麼怎麼才能快速的配置執行個體的免密登入呢?下面為您介紹通過系統營運管理來快速配置大量執行個體的免密登入。

重要

  1. 先準備好ECS執行個體。如果您還未有執行個體,請參考ECS入門概述購買ECS執行個體。

  2. 需要配置免密登入的執行個體必須擁有相同的使用者名稱。

  3. 本樣本僅支援Linux類型執行個體。

操作步驟

  1. 登入系統營運管理主控台

  2. 給執行個體增加新User,如果您的執行個體內已經有需要做免密配置的使用者,請直接跳到下一步。如果執行個體內還未有相同的User,您可以使用系統營運管理的大量操作執行個體功能,執行相應的增加User指令碼。如下所示:image

  3. 建立模板。

本樣本為您提供了一個自動化配置執行個體免密登入的模板,模板內容請參考附錄一:配置免密登入模板

將模板內容複寫進入輸入框後,單擊建立模板。(本模板的主要功能為,選擇並擷取部分執行個體的公開金鑰,然後再選擇需要配置免密登入的執行個體,將上一步的公開金鑰配置進指定User下。)freelogin-02

  1. 執行模板。

找到上一步已經建立完成的模板,單擊建立執行 >> 下一步:設定參數freelogin-03

  1. 輸入參數。選擇執行個體時可以直接選擇執行個體,或者根據執行個體上的標籤選擇執行個體。如下所示:freelogin-05

  2. 單擊下一步:確定 >> 建立,確認輸入的參數沒有問題後,就可以執行模板了。freelogin-06

  3. 等待模板執行成功後,驗證免密配置是否生效。

進入其中一個已經配置了免密登入的執行個體。在某一user下,執行ssh 命令。我們就可以不輸入密碼直接進入另一台執行個體了。如下所示的例子:進入一個為freelogin的user下,執行ssh ip地址,即進入了另外一台執行個體內。此時可以發現免密配置已經生效了。freelogin-07

附錄一:配置免密登入模板

模板參數介紹

參數名稱

說明

regionId

地區ID。

sourceTarget

做免密登入配置時,需要擷取免密公開金鑰的執行個體。

destinationTarget

需要開通免密登入的執行個體。

userName

執行個體內的使用者名稱。

rateControl

任務執行的並發比率。

OOSAssumeRole

OOS扮演的RAM角色。

模板內容

FormatVersion: OOS-2019-06-01
Description:
  en: 'In the instance, a user is linked without encryption by means of an authorization key.'
  zh-cn: 在執行個體內,某一使用者通過授權識別碼的方式免密連結。
Parameters:
  regionId:
    Type: String
    Description:
      en: The id of region.
      zh-cn: 地區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.
      zh-cn: 做免密登入配置時,擷取免密公開金鑰的執行個體。
    AssociationProperty: Targets
    AssociationPropertyMetadata:
      ResourceType: 'ALIYUN::ECS::Instance'
      RegionId: regionId
  destinationTarget:
    Type: Json
    Description:
      en: Need to open an instance of password-free login.
      zh-cn: 需要開通免密登入的執行個體。
    AssociationProperty: Targets
    AssociationPropertyMetadata:
      ResourceType: 'ALIYUN::ECS::Instance'
      RegionId: regionId
    Default:
      Type: ResourceIds
      ResourceIds: []
  userName:
    Description:
      en: Password-free login username in the instance.
      zh-cn: 執行個體內的免密登入的使用者名稱稱。
    Type: String
  rateControl:
    Description:
      en: Concurrency ratio of task execution.
      zh-cn: 任務執行的並發比率。
    Type: Json
    AssociationProperty: RateControl
    Default:
      Mode: Concurrency
      MaxErrors: 0
      Concurrency: 10
  OOSAssumeRole:
    Description:
      en: The RAM role to be assumed by OOS.
      zh-cn: OOS扮演的RAM角色。
    Type: String
    Default: OOSServiceRole
RamRole: '{{ OOSAssumeRole }}'
Tasks:
  - Name: getSourceInstance
    Description:
      en: Get an instance that needs to be logged in without password.
      zh-cn: 擷取需要被免密登入的執行個體。
    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.
      zh-cn: 擷取配置免密登入的執行個體。
    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.
      zh-cn: 產生或擷取公用密鑰。
    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.
      zh-cn: 將公開金鑰轉換成字串。
    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.
      zh-cn: 開通執行個體內使用者的免密登入。
    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 }}'