CloudOps Orchestration Service (OOS) est un service d’exploitation et de maintenance automatisé proposé par Alibaba Cloud. Créez des modèles pour définir les tâches, leur séquence d’exécution, ainsi que les paramètres d’entrée et de sortie, puis exécutez automatiquement les opérations de maintenance.
La connexion SSH sans mot de passe est couramment utilisée dans le cadre de l’exploitation et de la maintenance automatisées pour gérer un grand nombre de serveurs de manière sécurisée et efficace. Si vous disposez de plusieurs instances Elastic Compute Service (ECS), utilisez OOS pour configurer la connexion sans mot de passe pour certaines ou toutes ces instances en une seule opération.
Vérifiez la disponibilité des instances ECS. Si aucune instance n’est disponible, achetez-en. Pour plus d’informations, consultez Prise en main.
L’utilisateur utilisé pour se connecter aux instances ECS doit être identique pour toutes les instances concernées par la configuration sans mot de passe.
Seules les instances ECS sous Linux sont prises en charge.
Procédure
Connectez-vous à la console OOS.
Ajoutez un utilisateur permettant la connexion sans mot de passe aux instances ECS. Si cet utilisateur existe déjà, ignorez cette étape. Sinon, exécutez un script pour ajouter l’utilisateur aux instances ECS depuis la page Batch Instance Operations de la console OSS. L’image suivante illustre la procédure.

Créez un modèle.
Ce modèle configure la connexion sans mot de passe pour les instances ECS. Pour consulter son contenu, reportez-vous à la section Annexe 1 : Modèle pour la connexion sans mot de passe.
Copiez le script, collez-le dans la zone de saisie, puis cliquez sur Create Template. Le modèle récupère les clés publiques des instances ECS spécifiées et configure la connexion sans mot de passe pour l’utilisateur désigné.
Exécutez le modèle.
Sur la page Custom Template, repérez le modèle et cliquez sur Create Execution dans la colonne Actions. Configurez les informations de base, puis cliquez sur Next Step: Parameter Settings.
Configurez les paramètres à l’étape Parameter Settings. Sélectionnez manuellement les instances ECS ou spécifiez des tags pour les cibler. L’image suivante illustre la procédure.

Cliquez sur Next Step: OK. Confirmez les paramètres, puis cliquez sur Create. L’exécution du modèle démarre.

Une fois l’exécution terminée, vérifiez que la configuration sans mot de passe est effective.
Pour vérifier le bon fonctionnement de la connexion sans mot de passe, connectez-vous à une instance ECS configurée et exécutez la commande ssh en tant qu’utilisateur désigné pour accéder à une autre instance. Dans l’exemple suivant, la commande su permet de basculer vers l’utilisateur freelogin, qui se connecte ensuite à une autre instance ECS sans saisir de mot de passe.
Annexe 1 : Modèle pour la connexion sans mot de passe
Le tableau suivant décrit les paramètres du modèle.
|
Paramètre |
Description |
|
regionId |
ID de la région du cluster. |
|
sourceTarget |
Instance ECS dont la clé publique est requise pour la connexion sans mot de passe. |
|
destinationTarget |
Instance ECS pour laquelle vous souhaitez configurer la connexion sans mot de passe. |
|
userName |
Nom de l’utilisateur utilisé pour se connecter aux instances ECS. |
|
rateControl |
Taux de concurrence des exécutions de tâches. |
|
OOSAssumeRole |
Rôle Resource Access Management (RAM) utilisé par OOS. |
Script du modèle :
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 }}'