Amazon Web Services 有一个名为 的命令eb init
,允许您将当前工作目录启动为 elasticbeanstalk 应用程序。
该命令是交互式的,这意味着eb init
将使用选项列表进行响应。
$ eb init
Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-south-1 : Asia Pacific (Mumbai)
7) ap-southeast-1 : Asia Pacific (Singapore)
8) ap-southeast-2 : Asia Pacific (Sydney)
9) ap-northeast-1 : Asia Pacific (Tokyo)
10) ap-northeast-2 : Asia Pacific (Seoul)
11) sa-east-1 : South America (Sao Paulo)
12) cn-north-1 : China (Beijing)
(default is 3):
上面是region
选项,第二个是选项,第三个是可能的(或)选项app
列表。environment
env
我正在寻找的是包装命令eb init
并能够传递可以绕过脚本交互性的字符串。
ebInit --region=eu-central-1 --app=my-app --env=my-app-live
我需要解析stdout
这里并分割行并获取与传入的参数选项相对应的数字,这非常简单,因为选项可以移动数字。
作为概念验证,我什至可以接受这样的事情。
ebInit --region=5 --app=1 --env=1
我很难相信这些交互式命令是黑匣子,无法以编程方式进行交互。我尝试使用 node.js 执行此操作,但无法让它响应,这是我的旧 stackoverflow 帖子“通过子进程响应交互式命令”,却没有引起人们的注意。
我在 unix / linux 中发布此内容是为了询问这是否可能,如果可能的话,如何以及用什么语言?
答案1
解决expect
方案可能会沿着以下思路运行
#!/usr/bin/env expect
# or instead figure out a TCL getopt library
if {[llength $argv] != 3} {
puts stderr "Usage: $argv0 region app env"
exit 64
}
set aws_region [lindex $argv 0]
set aws_app [lindex $argv 1]
set aws_env [lindex $argv 2]
spawn -noecho eb init
set get_regions 1
while {$get_regions} {
expect {
# look for the "1) us-east-1 : US East (N. Virginia)"
# assign to what TCL calls an array
-re {([0-9]+). ([a-z0-9-]+) :} {
set region_to_num($expect_out(2,string)) $expect_out(1,string)
}
# how we break out of the loop, also array entry
# for "default" region if need be
-re {\(default is ([0-9]+)\)} {
set region_to_num(default) $expect_out(1,string)
set get_regions 0
}
}
}
# show what we got based on arguments and parse of eb output
puts "region=$aws_region region_num=$region_to_num($aws_region) env=$aws_env"
或者我猜你可以expect
在 JavaScript 中找到或编写一个类似的库,但这可能需要更多工作。无论你喜欢什么,都可以...