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

vi4fp9gy  于 2023-10-15  发布在  Jenkins
关注(0)|答案(3)|浏览(190)

我有一个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
xzlaal3s

xzlaal3s1#

我试着执行你的脚本和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()
acruukt9

acruukt92#

此脚本使用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
kcrjzv8t

kcrjzv8t3#

我已经厌倦了所有上述选项,我没有得到的价值,可以有人的意见,这是正确的格式
[$class:'ChoiceParameter',choiceType:'PT_SINGLE_SELECT',描述:'从下拉列表中选择环境',filterLength:1、可过滤:false,name:《金象》,剧本:[$class:'GroovyScript',script:[类路径:[],sandbox:true,脚本:"" def aws_cmd ="aws ec2 describe-instances

  • -filters Name = instance-state-name,Values = running
    Name = tag:env,Values = dev
  • -query Reservations []. PrivateIpAddress []
  • -区域us-east-2
  • -输出文本'
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
                                            '''

相关问题