ROS轻松帮你在ECS之间传递SSH Key

简介: 利用ROS UserData在ECS之间传递依赖数据,轻松帮你搞定复杂应用的部署

ROS已经提供了强大UserData功能,可以使你在创建ECS的时候做一些应用配置。同时也提供了WaitCondition和WaitConditionHandler资源,通过使用这两个资源,可以让你拿到UserData脚本执行时的任何信息。最终实现在部署多个有依赖的应用时,帮你在多个ECS创建伊始,就传递最基础的依赖信息。本文将主要介绍如何实现在ECS之间专递Json格式的数据。关于UserData的介绍,请看这里,关于WaitCondition和WaitConditionHandler的介绍,请看这里

在本文中,将通过一个简单的例子展现这一功能。这个例子的模版将创建两个ECS,第一个ECS传递自己的ssh public key到第二个ECS,最终实现第一个ECS无密码登录第二个ECS。

  1. 首先创建第一个ECS,UserData中指定了生成ssh公钥的脚本。因为使用UserData以字符串的格式传递脚本,所以在脚本的要特别注意",n,r等有特定含义的字符不被转义。ROS是通过curl命令把UserData脚本执行的结果返回给WaitCondition资源的。在脚本这里也需要注意,因为curl -d参数的数据是用''括起来,所以如果这里直接引用脚本中的变量,那么变量将不会被解析成你期望的的值。为了解这个问题就得使用的神器eval命令。最终,curl命令以json格式把ECS的公钥传回到ROS。
        "UserData": {
          "Fn::Replace": [
            {
              "ros-notify": {
                "Fn::GetAtt": [
                  "ECSFirstConditionHandle",
                  "CurlCli"
                ]
              }
            },
            {
              "Fn::Join": [
                "",
                [
                  "#!/bin/sh\n",
                  "apt-get update\n",
                  "apt-get install -y curl\n",
                  "apt-get install -y jq\n",
                  "apt-get install -y expect\n",
                  "echo '#!/usr/bin/expect' > /tmp/ssh_gen_key\n",
                  "echo spawn ssh-keygen -t rsa >> /tmp/ssh_gen_key\n",
                  "echo 'expect {' >> /tmp/ssh_gen_key\n",
                  "echo '        \"*(/root/.ssh/id_rsa)\" {send \"\\\\n\\\\r\";exp_continue}' >> /tmp/ssh_gen_key\n",
                  "echo '        \"*(empty for no passphrase)\" {send \"\\\\n\\\\r\";exp_continue}' >> /tmp/ssh_gen_key\n",
                  "echo '        \"*again\" {send \"\\\\n\\\\r\"}' >> /tmp/ssh_gen_key\n",
                  "echo '}' >> /tmp/ssh_gen_key\n",
                  "echo 'expect eof' >> /tmp/ssh_gen_key\n",
                  "\n",
                  "/usr/bin/expect /tmp/ssh_gen_key\n",
                  "pub_key=`cat /root/.ssh/id_rsa.pub`\n",
                  "cmd=\"ros-notify -d '{\\\"id\\\" : \\\"ssh_pub_key\\\", \\\"data\\\" : \\\"$pub_key\\\"}'\"\n",
                  "eval $cmd\n"
                ]
              ]
            }
          ]
        }
AI 代码解读
  1. 要想第一个ECS面密码登录第二个ECS,那么需要把第一个ECS的公钥传递到第二个ECS上并且写到ssh的authorized_keys文件中。如何实现呢?当然还得使用强大的UserData。UserData脚本中,通过使用ROS的内置函数FnGetAtt,把第一个ECS的传回的公钥json字符串赋值给了一个变量。然后通过jq解析json格式的ECS公钥,最终实现了第一台ECS免密码登录的二台机器。
        "UserData": {
          "Fn::Replace": [
            {
              "ros-notify": {
                "Fn::GetAtt": [
                  "ECSSecondConditionHandle",
                  "CurlCli"
                ]
              }
            },
            {
              "Fn::Join": [
                "",
                [
                  "#!/bin/sh\n",
                  "ssh_pub_key_json='",
                  {
                    "Fn::GetAtt": [
                      "ECSFirstWaitCondition",
                      "Data"
                    ]
                  },
                  "'\n",
                  "echo $ssh_pub_key_json > /tmp/pubkey\n",
                  "apt-get update\n",
                  "apt-get install -y curl\n",
                  "apt-get install -y jq\n",
                  "apt-get install -y expect\n",
                  "pub_key=`echo \"$ssh_pub_key_json\" | jq '.ssh_pub_key' | xargs echo `\n",
                  "echo \"$pub_key\" > /root/.ssh/authorized_keys\n",
                  "chmod 600 /root/.ssh/authorized_keys\n",
                  "sudo service ssh restart\n",
                  "cmd=\"ros-notify -d '{\\\"data\\\" : \\\"$pub_key\\\"}'\"\n",
                  "eval $cmd\n",
                  "echo $pub_key > /tmp/real_pub_key\n"
                ]
              ]
            }
          ]
        }
AI 代码解读

这只是一个简单的例子,旨在向大家展示如果通过UserData实现ECS之间复杂数据的传递。在部署分布式的应用时,如果应用之间有数据依赖,那么通过ROS的UserData可以帮你轻松搞定。

到ROS控制台创建 >>
下载完整模版 >>

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
问樵
+关注
目录
打赏
0
0
0
0
78320
分享
相关文章
网关服务器配置指南:实现自动DHCP地址分配、HTTP服务和SSH无密码登录。
哇哈哈,道具都准备好了,咱们的魔术秀就要开始了。现在,你的网关服务器已经魔法满满,自动分配IP,提供网页服务,SSH登录如入无人之境。而整个世界,只会知道效果,不会知道是你在幕后操控一切。这就是真正的数字世界魔法师,随手拈来,手到擒来。
62 14
关于一些轻量云服务器SSH断连的疑问
在使用2H2G配置的轻量级Ubuntu 22.04服务器时,按照Solana官网教程安装环境,执行`[cargo install]`命令(特别是安装avm和anchor包时),出现SSH连接中断且无法重新登录的问题。推测可能是低配服务器资源耗尽导致SSH进程被终止,即便CPU使用率下降也无法恢复连接,需重启服务器并等待约30分钟才能恢复正常。此现象或与服务器性能限制有关,期待更多测试与解释。
在Linux云服务器上限制特定IP进行SSH远程连接的设置
温馨提示,修改iptables规则时要格外小心,否则可能导致无法远程访问你的服务器。最好在掌握足够技术知识和理解清楚操作含义之后再进行。另外,在已经配置了防火墙的情况下,例如ufw(Ubuntu Firewall)或firewalld,需要按照相应的防火墙的规则来设置。
115 24
「从零开始的云上建筑师速成班:用ROS编辑器搭个会呼吸的服务器小屋」
云上建筑师速成秘籍:用阿里云ROS架构编辑器像搭乐高一样玩转服务器!零代码拖拽资源+配置指南,从部署到拆家一条龙服务~
「从零开始的云上建筑师速成班:用ROS编辑器搭个会呼吸的服务器小屋」
使用VSCode通过SSH远程登录阿里云Linux服务器异常崩溃
通过 VSCode 的 Remote - SSH 插件远程连接阿里云 Ubuntu 22 服务器时,会因高 CPU 使用率导致连接断开。经排查发现,VSCode 连接根目录 ".." 时会频繁调用"rg"(ripgrep)进行文件搜索,导致 CPU 负载过高。解决方法是将连接目录改为"root"(或其他具体的路径),避免不必要的文件检索,从而恢复正常连接。
Curl error (60): SSL peer certificate or SSH remote key was not OK for https://update.cs2c.com.cn/NS/V10/V10SP2/os/adv/lic/base/x86_64/repodata/repomd.xml [SSL: no alternative certificate subject name matches target host name 'update.cs2c.com.cn']
【10月更文挑战第30天】在尝试从麒麟软件仓库(ks10-adv-os)下载元数据时,遇到 SSL 证书验证问题。错误提示为:`Curl error (60): SSL peer certificate or SSH remote key was not OK`。可能原因包括证书不被信任、证书与域名不匹配或网络问题。解决方法包括检查网络连接、导入 SSL 证书、禁用 SSL 证书验证(不推荐)、联系仓库管理员、检查系统时间和尝试其他镜像。
2201 1
SSH后判断当前服务器是云主机、物理机、虚拟机、docker环境
结合上述方法,您可以对当前环境进行较为准确的判断。重要的是理解每种环境的特征,并通过系统的响应进行综合分析。如果在Docker容器内,通常会有明显的环境标志和受限的资源视图;而在云主机或虚拟机上,虽然它们也可能是虚拟化的,但通常提供更接近物理机的体验,且可通过硬件标识来识别虚拟化平台。物理机则直接反映硬件真实信息,较少有虚拟化痕迹。通过这些线索,您应该能够定位到您所处的环境类型。
290 2
阿里云国际服务器:全球企业数字化转型的云端基石
阿里云国际服务器提供高性能、高安全和全球化部署的云服务解决方案。其高效云盘具备单盘100万IOPS性能,9个9的数据可靠性,并采用三副本冗余存储确保数据安全。覆盖25个地域、80多个可用区的全球加速网络,大幅降低跨境访问延迟。阿里云已获50多项国际认证,支持企业合规出海。通过统一控制台管理多地域架构,助力企业提升效率、降低成本,是超过200个国家和地区企业的共同选择。

热门文章

最新文章

推荐镜像

更多
  • ros
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等

    登录插画

    登录以查看您的控制台资源

    管理云资源
    状态一览
    快捷访问