A. *_*uff 28 command-line filter amazon-web-services
我正在尝试使用Amazon AWS命令行工具查找没有指定标记的所有实例.
使用标记查找所有实例非常简单,例如
ec2-describe-instances --filter "tag-key=Name"
Run Code Online (Sandbox Code Playgroud)
但是,如何将该过滤器反转为仅返回没有标记"Name"的实例?
Jas*_*321 24
这将按照您的要求执行 - 查找不包含名为"YOUR_KEY_NAME_HERE"的标记的每个实例(第二行过滤没有标记为"名称"的标记的实例):
aws ec2 describe-instances | jq '.Reservations[].Instances[] | select(contains({Tags: [{Key: "YOUR_KEY_NAME_HERE"} ]}) | not)'
aws ec2 describe-instances | jq '.Reservations[].Instances[] | select(contains({Tags: [{Key: "Name"} ]}) | not)'
Run Code Online (Sandbox Code Playgroud)
如果要过滤标记的值而不是标记的名称,此查询将列出所有不包含名为YOUR_KEY_NAME_HERE的标记的实例,其值为EXCLUDE_ME.(第二行列出了未命名为"testbox1"的实例.)
aws ec2 describe-instances | jq '.Reservations[].Instances[] | select(contains({Tags: [{Key: "YOUR_KEY_NAME_HERE"}, {Value: "EXCLUDE_ME"}]}) | not)'
aws ec2 describe-instances | jq '.Reservations[].Instances[] | select(contains({Tags: [{Key: "Name"}, {Value: "testbox1"}]}) | not)'
Run Code Online (Sandbox Code Playgroud)
菲利普是对的.解析输出是唯一的方法,因为AWS API不提供此功能,也不提供任何官方AWS CLI.JSON输出非常易于解析,尤其是与旧CLI默认打印的多行文本记录相比时.
http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeInstances.html
API本身返回JSON,新的awscli将JSON打印为其默认输出格式."jq"程序对于解析它非常有用,甚至在发送到终端时会着色,或者你可以 - 输出文本以将其缩减回字符串.
Nat*_*Fox 16
您可以使用jmespath(驱动--query
参数的引擎)执行此操作,尽管其他人说:
aws ec2 describe-instances \
--query 'Reservations[].Instances[?!not_null(Tags[?Key == `Name`].Value)] | []'
Run Code Online (Sandbox Code Playgroud)
来源:使用Amazon Web Services命令行界面(AWS CLI)查找没有"名称"标记的实例.
由于--filters
参数似乎不支持逆向过滤,这是我使用--query
参数解决此问题的方法:
aws ec2 describe-instances \
--query 'Reservations[].Instances[?!contains(Tags[].Key, `Name`)][].InstanceId'
Run Code Online (Sandbox Code Playgroud)
它查看每个实例的标签键数组,并过滤数组中没有标签“名称”的实例。然后将输出展平为实例 ID 数组。
jq
或其他命令来过滤输出。AFAIK 直接通过 CLI 你将无法做到这一点。
根据您使用的语法,我可以猜测您正在使用旧的 cli。我建议您下载新的 CLI http://aws.amazon.com/cli/并致电
aws ec2 describe-instances --output json
从 python、ruby 或任何您可能喜欢的脚本语言根据您的需要使用正确的正则表达式解析 json 输出过滤