Todos os produtos
Search
Central de documentação

CloudOps Orchestration Service:Usar o OOS para configurar login sem senha em várias instâncias do ECS

Última atualização: Jun 28, 2026

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.

Importante
  1. 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.

  2. Use o mesmo usuário para conectar-se às instâncias do ECS nas quais deseja configurar o login sem senha.

  3. Somente instâncias do ECS baseadas em Linux são compatíveis.

Procedimento

  1. Faça login no console do OOS.

  2. 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.image

  3. 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.freelogin-02

  1. 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.freelogin-03

  1. 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.freelogin-05

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

  3. 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.freelogin-07

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