系統營運管理是阿里雲提供的雲上自動化營運服務,能夠自動化管理和執行任務。您可以通過模板來定義執行任務、執行順序、執行輸入和輸出,然後通過執行模板來完成任務的自動化運行。
SSH免密登入大多用於自動化營運,主要是安全方便自動化管理大批伺服器。如果您有大量的執行個體,期望可以將部分或全部的執行個體配置成免密登入。那麼怎麼才能快速的配置執行個體的免密登入呢?下面為您介紹通過系統營運管理來快速配置大量執行個體的免密登入。
先準備好ECS執行個體。如果您還未有執行個體,請參考ECS入門概述購買ECS執行個體。
需要配置免密登入的執行個體必須擁有相同的使用者名稱。
本樣本僅支援Linux類型執行個體。
操作步驟
登入系統營運管理主控台。
給執行個體增加新User,如果您的執行個體內已經有需要做免密配置的使用者,請直接跳到下一步。如果執行個體內還未有相同的User,您可以使用系統營運管理的大量操作執行個體功能,執行相應的增加User指令碼。如下所示:
建立模板。
本樣本為您提供了一個自動化配置執行個體免密登入的模板,模板內容請參考附錄一:配置免密登入模板。
將模板內容複寫進入輸入框後,單擊建立模板。(本模板的主要功能為,選擇並擷取部分執行個體的公開金鑰,然後再選擇需要配置免密登入的執行個體,將上一步的公開金鑰配置進指定User下。)
執行模板。
找到上一步已經建立完成的模板,單擊建立執行 >> 下一步:設定參數。
輸入參數。選擇執行個體時可以直接選擇執行個體,或者根據執行個體上的標籤選擇執行個體。如下所示:
單擊下一步:確定 >> 建立,確認輸入的參數沒有問題後,就可以執行模板了。
等待模板執行成功後,驗證免密配置是否生效。
進入其中一個已經配置了免密登入的執行個體。在某一user下,執行ssh 命令。我們就可以不輸入密碼直接進入另一台執行個體了。如下所示的例子:進入一個為freelogin的user下,執行ssh ip地址,即進入了另外一台執行個體內。此時可以發現免密配置已經生效了。
附錄一:配置免密登入模板
模板參數介紹
參數名稱 | 說明 |
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 }}'