我正在使用Jenkins通过该Publish Over SSH命令远程运行Ansible剧本。
Publish Over 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"]}]}'
应该触发构建后操作,以通过SSH远程执行以下命令:
ansible-playbook /home/<myUser>/test/practice.yml --extra-vars "thisIsAList=$thisIsAList"
thisIsAList是“作业通知”下的字符串参数,并且已对作业进行了参数化。我已经成功执行了类似的命令,但是由于值是一个列表,因此该命令失败了。我尝试了“字符串参数”和“多行字符串参数”都无济于事。
thisIsAList
这是堆栈跟踪:
org.kohsuke.stapler.WrongTypeException: Got type array but no lister class found for type class java.lang.String at org.kohsuke.stapler.RequestImpl$TypePair.convertJSON(RequestImpl.java:723) at org.kohsuke.stapler.RequestImpl.bindJSON(RequestImpl.java:478) at org.kohsuke.stapler.RequestImpl.instantiate(RequestImpl.java:777) Caused: java.lang.IllegalArgumentException: Failed to convert the value parameter of the constructor public hudson.model.StringParameterValue(java.lang.String,java.lang.String) at org.kohsuke.stapler.RequestImpl.instantiate(RequestImpl.java:779) at org.kohsuke.stapler.RequestImpl.access$200(RequestImpl.java:83) at org.kohsuke.stapler.RequestImpl$TypePair.convertJSON(RequestImpl.java:678) Caused: java.lang.IllegalArgumentException: Failed to instantiate class hudson.model.StringParameterValue from {"name":"thisIsAList","value":["one","two","three"]} at org.kohsuke.stapler.RequestImpl$TypePair.convertJSON(RequestImpl.java:680) at org.kohsuke.stapler.RequestImpl.bindJSON(RequestImpl.java:478) at org.kohsuke.stapler.RequestImpl.bindJSON(RequestImpl.java:474) at hudson.model.StringParameterDefinition.createValue(StringParameterDefinition.java:88) at hudson.model.ParametersDefinitionProperty._doBuild(ParametersDefinitionProperty.java:165)
注意:这可能是如何通过远程访问api将数组传递给jenkins参数化作业的重复?但尚未得到有效的回应。
由于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命令中的数据应采用不同的格式,如下所示:
cURL
json='{"parameter":[{"name":"thisIsAList","value":"[one,two,three]"}]}'
注意:双引号用于 整个 列表,而不是单个元素。
最后,对于其他嵌套项(例如列表中的dict),您必须像这样转义双引号:
{"parameter":[{"name":"thisIsADictNestedInAList","value":"[{\"name\":\"numbers\",\"value\":[1s, 2s, 3s]}]"}]}
看起来,在此嵌套级别上,不再需要对列表加双引号。可能是因为向上一级的引号已经导致其被正确解释。