【问题标题】:Passing Jenkins Environment variable with spaces to ansible command ran via groovy file将带有空格的 Jenkins 环境变量传递给通过 groovy 文件运行的 ansible 命令
【发布时间】:2020-01-11 03:33:16
【问题描述】:

我无法将带有空格的变量从 Jenkinsfile 传递给通过 groovy 运行的 ansible 命令。

我尝试使用引号(双引号和单引号)退格和其他各种组合都无济于事。 不幸的是,我无法重命名以包含 - 或 _。 在 linux 中将其作为单行运行,使用双引号导出到 shell 的变量。 当从 Jenkins 传递时,第一个空格会破坏代码,字符串中的第二个单词被视为单独的字符串。

Jenkins 文件中有问题的变量...

env.COMPUTER_NAME = "HELLO WORLD"

在ansible中

String computer_args ="ansible-playbook deploy.yml -e COMPUTER_NAME=${env.COMPUTER_NAME}"

这会导致错误...

Kernel \r on an \m

ERROR! the playbook: WORLD could not be found

Connection to XX closed.

script returned exit code 1

但是,在 linux shell 中运行,它可以工作

export COMPUTER_NAME="HELLO WORLD"
ansible-playbook deploy.yml -e COMPUTER_NAME=${env.COMPUTER_NAME}

TASK [computer_name_gather_facts : fail if Computer name was not found] ***************************************************************************************************************************************************************************
ok: [localhost] => {
    "changed": false,
    "msg": "All assertions passed"
}

【问题讨论】:

  • 试试String computer_args ="ansible-playbook deploy.yml -e \"COMPUTER_NAME=${env.COMPUTER_NAME}\""
  • 谢谢 - 我已经尝试过了,同样的错误仍然存​​在 - 由于某种原因,ansible 似乎无法像空格一样使用变量
  • @user2920657,能否请您添加您的 groovy 脚本以及使用它可以重现该问题。
  • 嗨 @ShubhamVaishnav - 目前 groovy 文件调用的所有内容都是 String computer_args ="ansible-playbook deploy.yml -e COMPUTER_NAME=${env.COMPUTER_NAME}"
  • 这实际上是一个 shell 命令问题,与 ansible、jenkins 或 groovy 无关。您的插值命令将是 ansible-playbook deploy.yml -e COMPUTER_NAME=HELLO WORLD,它将尝试执行名为 WORLD 的剧本,因为这是最后一个参数。你需要修正你的命令中的错字,然后你就可以开始了。

标签: variables jenkins groovy ansible spaces


【解决方案1】:

来了,试试这个,

/* Groovy script to run ansible script*/
COMPUTER_NAME="Hello World"
def computer_args=["/bin/bash", "-c", /ansible-playbook -i hosts main.yml -e COMPUTER_NAME="'${COMPUTER_NAME}'"/]
print(computer_args)
def proc = computer_args.execute()
proc.waitFor()
println "Process exit code: ${proc.exitValue()}"

Ansible 剧本

---
- hosts: all
  gather_facts: no
  tasks:
    - name: Add a line to a file if the file does not exist, without passing regexp
      debug:
        msg: "{{ COMPUTER_NAME }}"

输出

[root@localhost ~]# groovy check.groovy 
[/bin/bash, -c, ansible-playbook -i hosts main.yml -e COMPUTER_NAME="'Hello World'"]Process exit code: 0
Std Err: 
Std Out: 
PLAY [all] *********************************************************************
Monday 09 September 2019  15:41:36 +0000 (0:00:00.054)       0:00:00.054 ****** 

TASK [Add a line to a file if the file does not exist, without passing regexp] ***
ok: [192.168.5.206] => {
    "msg": "Hello World"
}

PLAY RECAP *********************************************************************
192.168.5.206              : ok=1    changed=0    unreachable=0    failed=0   

如您所见,COMPUTER_NAME 已成功传递给 ansible 脚本。

【讨论】:

  • 感谢您的支持 - 我最终陷入了困境 - 虽然上述用例确实有效,但它在我的场景中不起作用。我觉得我比以前更接近了,尽管在通过 Jenkins 时仍然遇到错误令人沮丧。在外壳上,以下工作正常。 docker exec "container_name" bash -c 'export COMPUTER_NAME="Hello World; echo $COMPUTER_NAME; ansible-playbook deploy.yml -e "{\"COMPUTER_NAME\":['"$COMPUTER_NAME"']}"' 但在詹金斯... No such DSL method -e "{"COMPUTER_NAME":[' found among steps
  • @user2920657,现在您已经将 Docker 引入了图片中,它之前没有出现,您的用例有点模糊。请添加您正在使用的完整代码,您正在运行的环境以及您在问题中遇到的错误,我会看看。正如你现在所说,上一期没有。
猜你喜欢
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 2019-02-22
相关资源
最近更新 更多