全部产品
Search
文档中心

CloudOps Orchestration Service:Gunakan OOS untuk mengonfigurasi login tanpa kata sandi untuk beberapa instance ECS

更新时间:Jun 28, 2025

CloudOps Orchestration Service (OOS) adalah layanan otomatisasi operasi dan pemeliharaan dari Alibaba Cloud yang membantu Anda mengelola serta menjalankan tugas operasional. Anda dapat membuat template untuk mendefinisikan tugas, urutan eksekusi, parameter input, dan output, lalu menggunakan template tersebut untuk menjalankan tugas secara otomatis.

Login tanpa kata sandi berbasis SSH banyak digunakan dalam otomatisasi operasi dan pemeliharaan, memungkinkan pengelolaan sejumlah besar server dengan aman dan efisien. Jika Anda memiliki banyak instance Elastic Compute Service (ECS), Anda dapat mengonfigurasi login tanpa kata sandi untuk beberapa atau semua instance tersebut. Topik ini menjelaskan cara menggunakan OOS untuk mengonfigurasi login tanpa kata sandi pada sejumlah besar instance ECS.

Penting

  1. Pastikan instance ECS tersedia. Jika tidak ada instance yang tersedia, belilah instance ECS. Untuk informasi lebih lanjut, lihat Memulai.

  2. Pengguna yang digunakan untuk terhubung ke instance ECS tempat Anda ingin mengonfigurasi login tanpa kata sandi harus sama.

  3. Hanya instance ECS berbasis Linux yang didukung.

Prosedur

  1. Masuk ke Konsol OOS.

  2. Tambahkan pengguna yang digunakan untuk terhubung ke instance ECS tanpa kata sandi. Jika pengguna telah ditambahkan, lewati langkah ini. Jika tidak ada pengguna yang tersedia, Anda dapat mengeksekusi skrip untuk menambahkan pengguna ke instance ECS di halaman Operasi Instansi Massal konsol OSS. Gambar berikut menunjukkan detailnya.image

  3. Buat template.

Dalam contoh ini, sebuah template digunakan untuk mengonfigurasi login tanpa kata sandi untuk instance ECS. Untuk informasi lebih lanjut tentang template, lihat bagian Lampiran 1: Template untuk Login Tanpa Kata Sandi dari topik ini.

Salin skrip dan tempelkan ke dalam kotak input, lalu klik Buat Template. Template ini digunakan untuk memilih dan mendapatkan kunci publik dari beberapa instance ECS. Anda perlu memilih instance ECS tempat Anda ingin mengonfigurasi login tanpa kata sandi, serta mengonfigurasi kunci publik untuk pengguna tertentu.freelogin-02

  1. Jalankan template.

Di halaman Template Kustom, temukan template yang Anda buat pada langkah sebelumnya dan klik Buat Eksekusi di kolom Tindakan. Di halaman Buat, konfigurasikan informasi dasar tentang template dan klik Langkah Berikutnya: Pengaturan Parameter.freelogin-03

  1. Konfigurasikan parameter di langkah Pengaturan Parameter. Anda dapat memilih instance ECS secara manual atau menentukan tag untuk memilih instance ECS. Gambar berikut menunjukkan detailnya.freelogin-05

  2. Klik Langkah Berikutnya: OK. Konfirmasikan parameter dan klik Buat. Kemudian, Anda dapat menjalankan template.freelogin-06

  3. Setelah template dijalankan, periksa apakah konfigurasi login tanpa kata sandi berlaku.

Hubungkan ke instance ECS tempat login tanpa kata sandi dikonfigurasi. Jalankan perintah ssh menggunakan pengguna tersebut. Dengan cara ini, Anda dapat terhubung ke instance ECS lain tanpa perlu memasukkan kata sandi. Gambar berikut menunjukkan contohnya. Perintah su dijalankan untuk beralih ke pengguna freelogin. Perintah ssh dijalankan sebagai pengguna freelogin untuk terhubung ke instance ECS lain. Ini menunjukkan bahwa login tanpa kata sandi berlaku.freelogin-07

Lampiran 1: Template untuk login tanpa kata sandi

Tabel berikut menjelaskan parameter yang diperlukan dalam template.

Parameter

Deskripsi

regionId

ID wilayah kluster.

sourceTarget

Instance ECS yang kunci publiknya diperlukan untuk login tanpa kata sandi.

destinationTarget

Instance ECS tempat Anda ingin mengonfigurasi login tanpa kata sandi.

userName

Nama pengguna yang digunakan untuk terhubung ke instance ECS.

rateControl

Rasio konkurensi eksekusi tugas.

OOSAssumeRole

Peran RAM yang digunakan oleh OOS.

Skrip berikut menunjukkan isi dari template:

FormatVersion: OOS-2019-06-01
Description:
  en: 'Dalam instance, pengguna terhubung tanpa enkripsi melalui kunci otorisasi.'
   
Parameters:
  regionId:
    Type: String
    Description:
      en: ID wilayah.
       
    AssociationProperty: RegionId
    Default: '{{ ACS::RegionId }}'
  sourceTarget:
    Type: Json
    Description:
      en: Contoh mendapatkan kunci publik bebas rahasia saat mengonfigurasi login bebas rahasia.
       
    AssociationProperty: Targets
    AssociationPropertyMetadata:
      ResourceType: 'ALIYUN::ECS::Instance'
      RegionId: regionId
  destinationTarget:
    Type: Json
    Description:
      en: Perlu membuka instance login tanpa kata sandi.
       
    AssociationProperty: Targets
    AssociationPropertyMetadata:
      ResourceType: 'ALIYUN::ECS::Instance'
      RegionId: regionId
    Default:
      Type: ResourceIds
      ResourceIds: []
  userName:
    Description:
      en: Nama pengguna login tanpa kata sandi di instance.
       
    Type: String
  rateControl:
    Description:
      en: Rasio konkurensi eksekusi tugas.
       
    Type: Json
    AssociationProperty: RateControl
    Default:
      Mode: Concurrency
      MaxErrors: 0
      Concurrency: 10
  OOSAssumeRole:
    Description:
      en: Peran RAM yang diasumsikan oleh OOS.
       
    Type: String
    Default: OOSServiceRole
RamRole: '{{ OOSAssumeRole }}'
Tasks:
  - Name: getSourceInstance
    Description:
      en: Dapatkan instance yang perlu login tanpa kata sandi.
       
    Action: 'ACS::SelectTargets'
    Properties:
      ResourceType: 'ALIYUN::ECS::Instance'
      RegionId: '{{ regionId }}'
      Filters:
        - '{{ sourceTarget }}'
    Outputs:
      instanceIds:
        Type: List
        ValueSelector: 'Instances.Instance[].InstanceId'
  - Name: getDestinationInstance
    Description:
      en: Lihat instance ECS yang dapat diakses via ssh tanpa kata sandi.
       
    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: Hasilkan atau dapatkan kunci publik.
       
    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: Konversikan kunci publik menjadi 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: Aktifkan login tanpa kata sandi untuk pengguna di 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 }}'