我正在使用Jenkins通过Var2
命令远程运行Ansible playbook。
此命令:
Publish Over SSH
应触发构建后操作以通过SSH远程执行以下命令:
curl -k -v -X POST https://jenkins.myhost.com/job/Ansible_Deploy/build?token=<appToken> --user <myUser>:<userToken> --data-urlencode json='{"parameter":[{"name":"thisIsAList","value":["one","two","three"]}]}'
ansible-playbook /home/<myUser>/test/practice.yml --extra-vars "thisIsAList=$thisIsAList"
是作业通知下的字符串参数,作业已参数化。我已经成功执行了类似的命令,但是这个命令失败了,假设因为值是一个列表。我已经尝试了两个&#34;字符串参数&#34;以及&#34;多线字符串参数&#34;无济于事。
这是堆栈跟踪:
thisIsAList
注意:这可能与How to pass an array to a jenkins parameterized job via remote access api?重复,但尚未获得有效回复。
答案 0 :(得分:1)
由于Jenkins或Ansible文档中的任何位置都没有详细说明这种嵌套级别,所以我现在已经解决了我的问题。
命令:
ansible-playbook /home/<myUsr>/test/practice.yml --extra-vars "thisIsAList=$thisIsAList"
应该声明thisIsAList
是一个字典对象。即:
ansible-playbook /home/<myUsr>/test/practice.yml --extra-vars "{thisIsAList=$thisIsAList}"
此外,cURL
命令中的数据应该采用不同的格式:
json='{"parameter":[{"name":"thisIsAList","value":"[one,two,three]"}]}'
注意:双引号位于整个列表周围,而不是单个元素。
最后,对于更多嵌套项(例如列表中的dict),你必须像这样转义双引号:
{"parameter":[{"name":"thisIsADictNestedInAList","value":"[{\"name\":\"numbers\",\"value\":[1s, 2s, 3s]}]"}]}
看来,在这种嵌套级别,不再需要对列表进行双引号;可能是因为引用一级已经导致它被正确解释。
答案 1 :(得分:1)
这是一个猜测,基于我在选择参数中看到的类似问题。我发现的任何文档似乎都错误地解决了这些问题。它不应该是一个列表。尝试以字符串形式传递分隔项目的换行符。
curl -k -v -X POST https://jenkins.myhost.com/job/Ansible_Deploy/build?token=<appToken> --user <myUser>:<userToken> --data-urlencode json='{"parameter":[{"name":"thisIsAList","value":"one\ntwo\nthree"}]}'
如果有效,请告诉我。我有兴趣了解一下。
修改(根据评论)
这会有效吗?
curl -k -v -X POST https://jenkins.myhost.com/job/Ansible_Deploy/build?token=<appToken> --user <myUser>:<userToken> --data-urlencode json='{"parameter":[{"name":"thisIsAList","value":"'{\"thisIsAList\": [\"one\",\"two\",\"three\"]}'"}]}'
嵌套引号有点难看。如果您正在使用管道或者可以先在shell脚本中按摩数据,那么它可能会更清晰。