开发者社区> 问樵> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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"
                ]
              ]
            }
          ]
        }
  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"
                ]
              ]
            }
          ]
        }

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

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

附件下载:https://developer.aliyun.com/topic/download?id=298

相关文章
【Spring MVC】(二)Controller、View之间的映射与参数传递
【Spring MVC】(二)Controller、View之间的映射与参数传递
32 0
MVC框架模式技术实例(用到隐藏帧、json、仿Ajax、Dom4j、jstl、el等)(1)
MVC框架模式技术实例(用到隐藏帧、json、仿Ajax、Dom4j、jstl、el等)
28 0
Docker aufs 存储驱动
Docker aufs 存储驱动
20 0
Spring中的@Transactional(rollbackFor = Exception.class)属性详解
序言 今天我在写代码的时候,看到了。一个注解@Transactional(rollbackFor = Exception.class),今天就和大家分享一下,这个注解的用法;   异常 如下图所示,我们都知道Exception分为运行时异常RuntimeException和非运行时异常 error是一定会回滚的 如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
6450 0
11g Dataguard中的snapshot standby特性
11g中的ADG特性本身已经非常有特色,促使很多对于10g中不太灵便的备库升级到11g,对于DBA是一大福利,那么还有一个福利就是snapshot standby了。 在平时的数据更新操作中,DBA可以做好sql审核,如果对于复杂的,繁多的变更,如果有些变更有一定的依赖,数据变化情况比较大,评估有难度,很多问题单纯在测试环境还发现不了,到了生产就是事儿。
930 0
+关注
12
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载