【问题标题】:Query AWS CLI to populate Jenkins "Active Choices Reactive Parameter" (Linux)查询 AWS CLI 以填充 Jenkins“Active Choices 反应参数”(Linux)
【发布时间】:2018-02-26 06:02:26
【问题描述】:

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

几点说明:

  • 我已为 Jenkins 2.0 EC2 分配了一个 IAM 角色,该角色具有通过 CLI 查询 AWS 的足够权限。
  • AWS CLI 安装在 Jenkins EC2 上。
  • 如果我在 Groovy 脚本中硬编码值,“Active Choices Reactive Parameter”将返回一个复选框列表,例如: 返回 ["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 "]"'}

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

["10.1.1.1", "10.1.1.2", 10.1.1.3"]

所以,在“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

【问题讨论】:

    标签: amazon-web-services jenkins groovy aws-cli


    【解决方案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()
    

    【讨论】:

    • 感谢您的帮助!我无法让您的代码按原样工作,我不知道它有什么问题。你如何看待standardErr?您只是在 Jenkins 服务器上手动执行 groovy 脚本,还是有办法从 Jenkins Active Choices Reactive Parameter 中查看standardErr?我正在努力在 Jenkins 中调试这样的东西,我还没有找到真正做到这一点的方法。
    • 这是我能够开始工作的代码:def standardOut = new StringBuffer(), standardErr = new StringBuffer() def command command = $/ aws ec2 describe-instances --region us-east-2 --filters Name=tag:Env,Values=qa --query Reservations[*].Instances[*].PrivateIpAddress --output text /$ def proc = command.execute() proc.consumeProcessOutput(standardOut, standardErr) proc.waitForOrKill(10000) return standardOut.tokenize()
    • 只打印标准错误,我用 groovy 测试,而不是用 Jenkins,如果有帮助,请接受答案。谢谢:)
    【解决方案2】:

    此脚本与 Jenkins Active Choices 参数一起使用,并返回 IP 地址列表:

    def aws_cmd = 'aws ec2 describe-instances \
                   --filters Name=instance-state-name,Values=running \
                             Name=tag:env,Values=dev \
                   --query Reservations[].Instances[].PrivateIpAddress[] \
                   --region us-east-2 \
                   --output text'
    
    def aws_cmd_output = aws_cmd.execute()
    // probably is required if execution takes long
    //aws_cmd_output.waitFor() 
    def ip_list = aws_cmd_output.text.tokenize()
    
    return ip_list
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-06
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-27
      • 2016-01-18
      • 2019-04-25
      相关资源
      最近更新 更多