查询 AWS CLI 以填充 Jenkins“Active Choices Reactive Parameter”(Linux)

Wyl*_*ice 5 groovy amazon-web-services jenkins aws-cli

我有一个 Jenkins 2.0 作业,要求用户通过 Jenkins“主动选择反应参数”选择要执行作业的服务器列表。作业将针对的这些服务器执行是 AWS EC2 实例。我不想在“Active Choices Reactive Parameter”中对可用服务器进行硬编码,而是想查询 AWS CLI 以获取服务器列表。

一些注意事项:

  • 我已为 Jenkins 2.0 EC2 分配了一个 IAM 角色,该角色具有足够的权限通过 CLI 查询 AWS。
  • AWS CLI 安装在 Jenkins EC2 上。
  • 如果我在 Groovy 脚本中对值进行硬编码,“Active Choices Reactive Parameter”将返回复选框列表,例如: return ["10.1.1.1", "10.1.1.2", 10.1.1.3"]
  • 我知道我的 awk 命令可以改进,我还不确定如何改进,但我的主要目标是在 Jenkins 中动态加载服务器列表。

我可以直接在托管 Jenkins 的 EC2 实例上运行以下命令:

aws ec2 describe-instances --region us-east-2 --filters
   "Name=tag:Env,Values=qa" --query
   "Reservations[*].Instances[*].PrivateIpAddress" | grep -o
   '\"[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\"' | awk
   {'printf $0 ", "'} | awk {'print "[" $0'} | awk {'gsub(/^[ \t]+|[
   \t]+$/, ""); print'} | awk {'print substr ($0, 1, length($0)-1)'} |
   awk {'print $0 "]"'}
Run Code Online (Sandbox Code Playgroud)

这将返回以下内容,其格式为“Active Choices Reactive Parameter”所需的格式:

["10.1.1.1", "10.1.1.2", 10.1.1.3"]
Run Code Online (Sandbox Code Playgroud)

因此,在“Active Choices Reactive Parameter”的“Script”文本区域中,我有以下脚本。问题是我的服务器列表从未填充。我已经尝试过该脚本的多种变体,但没有运气。有人可以告诉我哪里出了问题以及我可以采取哪些措施来纠正此脚本,以便我的服务器 IP 地址列表动态加载到 Jenkins 作业中?

def standardOut = new StringBuffer(), standardErr = new StringBuffer()

def command = $/
    aws ec2 describe-instances --region us-east-2 --filters "Name=tag:Env,Values=qaint" --query "Reservations[*].Instances[*].PrivateIpAddress" | 
    grep -o '\"[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\"' | 
    awk {'printf $0 ", "'} | 
    awk {'print "[" $0'} | 
    awk {'gsub(/^[ \t]+|[ \t]+$/, ""); print'} | 
    awk {'print substr ($0, 1, length($0)-1)'} | 
    awk {'print $0 "]"'}
    /$

def proc = command.execute()
proc.consumeProcessOutput(standardOut, standardErr)
proc.waitForOrKill(1000)

return standardOut
Run Code Online (Sandbox Code Playgroud)

Sud*_*ran 1

我尝试执行您的脚本,但 standardErr 有一些错误,看起来 groovy 不喜欢 AWS CLI 中的双引号。这是一种不使用 awk 的更干净的方法

def command = 'aws ec2 describe-instances \
               --filters Name=tag:Name,Values=Test \
               --query Reservations[*].Instances[*].PrivateIpAddress \
               --output text'
def proc = command.execute()
proc.waitFor()              

def output = proc.in.text
def exitcode= proc.exitValue()
def error = proc.err.text

if (error) {
    println "Std Err: ${error}"
    println "Process exit code: ${exitcode}"
    return exitcode
}

//println output.split()
return output.split()
Run Code Online (Sandbox Code Playgroud)