使用运维编排服务配置多台实例的免密登陆

本文涉及的产品
系统运维管理,不限时长
简介: 运维编排是阿里云提供的云上自动化运维服务,能够自动化管理和执行任务。您可以通过模板来定义执行任务、执行顺序、执行输入和输出,然后通过执行模板来完成任务的自动化运行。SSH免密登陆大多用于自动化运维,主要是安全方便自动化管理大批服务器。如果您有大量的实例,期望可以将部分或全部的实例配置成免密登陆。那么怎么才能快速的配置实例的免密登陆呢?下面为您介绍通过运维编排服务来快速配置大量实例的免密登陆。

使用运维编排服务配置多台实例的免密登陆

运维编排是阿里云提供的云上自动化运维服务,能够自动化管理和执行任务。您可以通过模板来定义执行任务、执行顺序、执行输入和输出,然后通过执行模板来完成任务的自动化运行。
SSH免密登陆大多用于自动化运维,主要是安全方便自动化管理大批服务器。如果您有大量的实例,期望可以将部分或全部的实例配置成免密登陆。那么怎么才能快速的配置实例的免密登陆呢?下面为您介绍通过运维编排服务来快速配置大量实例的免密登陆。

前提条件

  1. 准备ECS实例。如果您还未有实例,请参考入门概念购买ECS实例
  2. 需要配置免密登陆的实例必须拥有相同的用户名。
  3. 本示例仅支持Linux类型实例。

操作步骤

  1. 登录运维编排控制台
  2. 给实例增加新User,如果您的实例内已经有需要做免密配置的用户,请直接跳到下一步。如果实例内还未有相同的User,您可以使用运维编排的批量操作实例功能,执行相应的增加User脚本。如下所示:

20201201111558.jpg

  1. 创建模版。

本示例为您提供了一个自动化配置实例免密登录的模板,模版内容请参考附录一,将模版内容复制进入输入框后,单击创建模版。(本模板的主要功能为,选择并获取部分实例的公钥,然后再选择需要配置免密登录的实例,将上一步的公钥配置进指定User下。)20201201103830.jpg

  1. 执行模板。

找到上一步已经创建完成的模板,单击创建执行 >> 下一步:设置参数
20201201105534.jpg

  1. 输入参数。选择实例时可以直接选择实例,或者根据实例上的标签选择实例。如下所示:

20201201112610.jpg

  1. 单击下一步:确定 >> 创建,确认输入的参数没有问题后,就可以执行模版了。

20201201112807.jpg

  1. 等待模版执行成功后,验证免密配置是否生效。

进入其中一个已经配置了免密登录的实例。在某一user下,执行ssh 命令。我们就可以不输入密码直接进入另一台实例了。如下所示的例子:进入一个为freelogin的user下,执行ssh ip地址,即进入了另外一台实例内。此时可以发现免密配置已经生效了。20201201113931.jpg

附录一:配置免密登陆模版

模板参数介绍

参数名称 说明
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 }}'
相关文章
|
2月前
|
运维 Linux Apache
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
71 3
|
3月前
|
弹性计算 JSON 运维
阿里云ECS实例运维属性-如何控制实例的宕机表现
介绍如何通过运维属性指定阿里云ECS的宕机运维表现等
|
4月前
|
缓存 运维 应用服务中间件
运维系列.Nginx配置中的高级指令和流程控制
运维系列.Nginx配置中的高级指令和流程控制
149 1
|
4月前
|
运维 应用服务中间件 nginx
自动化运维的利剑:Ansible Role 打造标准化配置
【8月更文挑战第31天】在追求效率和稳定性的今天,自动化运维不再是奢侈品,而是必需品。Ansible Role,作为自动化配置管理的利器,它如何帮助我们实现标准化部署和维护?本文将通过一个简单示例,带你了解 Ansible Role 的魅力所在,并探讨其在现代 IT 架构中的应用价值。
|
4月前
|
弹性计算 运维 监控
通过阿里云OOS“快速设置”快速配置多地域运维任务
阿里云OOS的快速设置功能助力用户简便配置多地域运维任务,如云监控安装、配置收集与补丁扫描,定时开关机,周期性带宽升级,实现自动化管理,确保配置一致性,提升运维效率。
|
5月前
|
Java BI 运维
开发与运维配置问题之升级机器配置后出现频繁的GC问题和超长的GC时间如何解决
开发与运维配置问题之升级机器配置后出现频繁的GC问题和超长的GC时间如何解决
42 1
|
5月前
|
运维 网络协议 网络安全
2023网络建设与运维正式赛卷-交换配置
【7月更文挑战第3天】某集团构建了两地三中心网络架构,包括两个数据中心和异地灾备中心,使用OSPF、RIP、ISIS、BGP协议互联。核心设备包括SW1、SW2(数据中心)、SW3(灾备及办事处),以及FW1(总司防火墙)、FW2(办事处防火墙)等。网络拓扑涉及多个VLAN和IP地址段,SW3配置了VRF隔离办事处和Internet流量。SW1配置SNMPv3用于监控,并设置流量镜像。链路故障检测和LLDP启用以确保网络健康。
|
6月前
|
运维 Java 测试技术
Spring运维之boo项目表现层测试加载测试的专用配置属性以及在JUnit中启动web服务器发送虚拟请求
Spring运维之boo项目表现层测试加载测试的专用配置属性以及在JUnit中启动web服务器发送虚拟请求
53 3
|
6月前
|
运维 网络安全 网络虚拟化
2024网络建设与运维赛题-交换配置教程
SW1, SW2, SW3作为核心交换机,配置了多个VLAN以隔离不同部门的网络,如产品、营销、财务和行政。配置中还包括启用VLAN访问控制,允许特定VLAN通过二层链路,并设置了链路聚合(LACP)以增强SW1和SW2之间的连接可靠性。此外,所有交换机都配置了IP VRF来支持分公司(Branch,RD 1:1)和Internet(RD 2:2)的虚拟专用网络。
2024网络建设与运维赛题-交换配置教程
|
5月前
|
运维 网络协议 网络安全
2023网络建设与运维正式赛卷-交换配置-上
【7月更文挑战第2天】该集团进行数字化转型,构建了两地三中心网络架构,包括两个数据中心和一个异地灾备中心。网络使用OSPF、RIP、ISIS、BGP协议互联,并设有多台交换机、路由器、防火墙和无线控制器。例如,SW1和SW2为核心交换机,SW3为灾备DC的核心交换机,FW1为总公司防火墙,FW2为办事处防火墙,RT1和RT2为路由器,AC1为有线无线控制器。配置中涉及VLAN隔离、端口访问控制、LACP聚合、负载均衡和IPSec VPN,以确保网络稳定性、安全性和可扩展性。已完成的配置需通过客户端测试验证功能正常。
下一篇
DataWorks