O CloudOps Orchestration Service (OOS) é um serviço automatizado de O&M da Alibaba Cloud. Crie modelos para definir tarefas, sequências de execução, parâmetros de entrada e saída e execute tarefas de O&M automaticamente.
O login sem senha via SSH é comum na automação de O&M para gerenciar muitos servidores com segurança e eficiência. Se você tiver várias instâncias do Elastic Compute Service (ECS), use o OOS para configurar o login sem senha em algumas ou em todas simultaneamente.
Verifique se há instâncias do ECS disponíveis. Caso não haja, adquira instâncias do ECS. Para mais informações, consulte Primeiros passos.
Use o mesmo usuário para conectar-se às instâncias do ECS nas quais deseja configurar o login sem senha.
Somente instâncias do ECS baseadas em Linux são compatíveis.
Procedimento
Faça login no console do OOS.
Adicione um usuário para conexão sem senha às instâncias do ECS. Se o usuário já existir, pule esta etapa. Caso contrário, execute um script para adicionar o usuário às instâncias do ECS na página Batch Instance Operations do console do OSS. A figura a seguir ilustra os detalhes.

Crie um modelo.
Use um modelo para configurar o login sem senha nas instâncias do ECS. Para visualizar o conteúdo do modelo, consulte a seção Apêndice 1: Modelo para login sem senha.
Copie o script, cole-o na caixa de entrada e clique em Create Template. O modelo seleciona e obtém as chaves públicas das instâncias do ECS especificadas e configura o login sem senha para o usuário definido.
Execute o modelo.
Na página Custom Template, localize o modelo e clique em Create Execution na coluna Actions. Configure as informações básicas e clique em Next Step: Parameter Settings.
Configure os parâmetros na etapa Parameter Settings. Selecione manualmente as instâncias do ECS ou especifique tags para selecioná-las. A figura a seguir mostra os detalhes.

Clique em Next Step: OK. Confirme os parâmetros e clique em Create. Em seguida, execute o modelo.

Após a execução do modelo, verifique se a configuração de login sem senha entrou em vigor.
Para validar o funcionamento do login sem senha, conecte-se a uma instância do ECS configurada e execute o comando ssh como o usuário designado para acessar outra instância. No exemplo a seguir, o comando su alterna para o usuário freelogin, que se conecta a outra instância do ECS sem precisar inserir senha.
Apêndice 1: Modelo para login sem senha
A tabela a seguir descreve os parâmetros do modelo.
|
Parâmetro |
Descrição |
|
regionId |
ID da região do cluster. |
|
sourceTarget |
Instância do ECS cuja chave pública é necessária para o login sem senha. |
|
destinationTarget |
Instância do ECS na qual configurar o login sem senha. |
|
userName |
Nome do usuário usado para conectar-se às instâncias do ECS. |
|
rateControl |
Taxa de concorrência das execuções de tarefas. |
|
OOSAssumeRole |
Função do Resource Access Management (RAM) usada pelo OOS. |
Script do modelo:
FormatVersion: OOS-2019-06-01
Description:
en: 'In the instance, a user is linked without encryption by means of an authorization key.'
Parameters:
regionId:
Type: String
Description:
en: The id of region.
AssociationProperty: RegionId
Default: '{{ ACS::RegionId }}'
sourceTarget:
Type: Json
Description:
en: Example of obtaining the secret-free public key when configuring the secret-free login.
AssociationProperty: Targets
AssociationPropertyMetadata:
ResourceType: 'ALIYUN::ECS::Instance'
RegionId: regionId
destinationTarget:
Type: Json
Description:
en: Need to open an instance of password-free login.
AssociationProperty: Targets
AssociationPropertyMetadata:
ResourceType: 'ALIYUN::ECS::Instance'
RegionId: regionId
Default:
Type: ResourceIds
ResourceIds: []
userName:
Description:
en: Password-free login username in the instance.
Type: String
rateControl:
Description:
en: Concurrency ratio of task execution.
Type: Json
AssociationProperty: RateControl
Default:
Mode: Concurrency
MaxErrors: 0
Concurrency: 10
OOSAssumeRole:
Description:
en: The RAM role to be assumed by OOS.
Type: String
Default: OOSServiceRole
RamRole: '{{ OOSAssumeRole }}'
Tasks:
- Name: getSourceInstance
Description:
en: Get an instance that needs to be logged in without password.
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.
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.
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.
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.
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 }}'