Yaml 传入数组--额外变量-Ansible

Yaml 传入数组--额外变量-Ansible,yaml,ansible-playbook,Yaml,Ansible Playbook,如何将yaml数组传递给Ansible playbook中的--额外变量。Ansible文档没有声明其语法,我在任何internet资源上都找不到 我的意思是如果我有一本剧本: --- - hosts: {{hostName}} - remote_user: admin ... 那么我应该把我的剧本叫做 ansible playbook DeployWar.yml--extra vars=“hostName=tomcat webApp” 但是我想在两台服务器上运行这个剧本,比如说t

如何将yaml数组传递给Ansible playbook中的
--额外变量。Ansible文档没有声明其语法,我在任何internet资源上都找不到

我的意思是如果我有一本剧本:

---
  - hosts: {{hostName}}
  - remote_user: admin
  ...
那么我应该把我的剧本叫做

ansible playbook DeployWar.yml--extra vars=“hostName=tomcat webApp”

但是我想在两台服务器上运行这个剧本,比如说
tomcat webApp
tomcat all
,我想从外部控制它,即使用
--额外的vars
。我试图做的是:

ansible-playbook DeployWar.yml --extra-vars="hostName=[tomcat-webApp, tomcat-all]"

ansible-playbook DeployWar.yml --extra-vars="hostName={tomcat-webApp, tomcat-all}"

ansible-playbook DeployWar.yml --extra-vars="[{hostName: tomcat-webApp}, {hostName: tomcat-all}]"
但在所有情况下,playbook都无法在我的调用中声明语法错误。
感谢您的帮助。

回答您的第一个问题“如何将yaml数组传递给Ansible playbook中的额外变量。” 你可以通过考试

下面是一个例子:

- hosts: all
  gather_facts: no
  tasks:
    - debug: var=test_list
以及如何通过ansible playbook的测试列表:

---
  - hosts: {{hostName}}
  - remote_user: admin
  ...
ansible-playbook -c local -i localhost, test.yml --extra-vars='{"test_list": [1,2,3]}'

尽管您可以为主机使用变量,但我建议检查Ansible的主机管理机制,该机制与
--limit
选项结合使用。

从Ansible 1.3开始,额外的变量可以在命令行或文件中格式化为YAML。看

从链接:
--额外变量“@some_file.json”

也许,不要试图通过命令行传递复杂类型,并在剧本中处理从json文件或字符串创建的复杂类型

所以,@NelonG的方法是有效的,但是它如何在所有执行上下文中工作呢?我的剧本往往由詹金斯·乔布斯通过ansiblePlaybook和packer执行。让以下内容在所有这些方面都起作用(即使命令行看起来是正确的)是行不通的,可能会导致噩梦般的逃避

ansible -i localhost, all -m debug -a "var=test_list" \
--extra-vars='{"test_list": [1,2,3]}' 
作为一个字符串传入,然后通过set_fact进行拆分如何(注意:这只适用于没有问题字符的元素。我有URL,因此它们相当安全

ansible .... -e "test_list_csv=1,2,3,http://foo.bar/file.txt"
在剧本里

name: generate list from string
  set_fact: 
    test_list: "{{ test_list_csv.split(',') | list }}"

我决定逃避逃避,这似乎奏效了。

除了jarv的回答,这里是我的救世主笔记:

如果有人想传入一个整数数组,这可以:

--extra-vars '{"my_params":[40,50,10,20,30]}'

注意:您传递的数组中的数字之间应该没有空格!删除空格解决了我的问题!

每当我使用JSON时,无论是在额外的变量中还是在其他地方,我都会发现使用作为救命符。通过粘贴{test_list:[1,2,3]}进入该站点后,您可以快速验证JSON的语法是否正确。将多个变量传递给Ansible或处理任何其他复杂的JSON时,这一点尤其有用。@jarv对主机变量使用
--limit
的一个很好的理由是,如果您不小心遗漏了
--limit
,则游戏手册将在您的所有主机上执行,这可能会导致您被解雇,但对您的替换人员的工作安全性非常好。@BruceP也可以作为CLI命令在本地安装,这对于敏感的JSON更为可取,在某些使用情况下甚至更为方便,例如,将压缩JSON重定向到其中以美化JSON。您可以不必创建使用以下命令生成剧本文件:
ansible-i localhost,all-m debug-a“var=test_list”--extra vars='{“test_list”:[1,2,3]}“
我通常使用jq检查语法。我知道,jq与linter不同。我喜欢jq,因为它进行过滤,因此非常有用。空“.”过滤器显示json在语法上是否正确。stedolan.github.io/jq。yaml工具
spruce
对合并、扩散等同样有用。因为它有一个--json选项,所以谢谢大家!几天来,我一直在想如何使用ansibleplaybook模块将JSON格式的列表从Jenkins传递到Ansible,ansibleplaybook模块的extraVars需要一个映射。在这里,我偶然发现了您的答案。它很简单,但完全解决了我的问题:不要用JSON传递,而是在映射中以逗号分隔的值传递。非常感谢你!@PaulFernandez我完全感受到你的痛苦。仅供参考,如果你还没有使用jenkins共享库,然后看看这两个库。他们将生活从replay&hope转移到了真正的TDD感谢共享库推荐!我讨厌在评论线程中这样做,但我不能直接给你发消息。你有什么好的资源吗对于Jenkins Groovy,特别是脚本化管道?我基本上试着用三种方式来做每件事:Apache Groovy方式、Java方式,最后是Jenkins Groovy方式,我只是因为前两种方式不起作用才无意中采用了这种方式。对于脚本化管道缺乏清晰的文档,我感到很沮丧。再次感谢!@PAull Fernandez你可以在Citizenkhan上向我发推特jenkins使用的CPS东西提出了一个挑战,因为许多合理的操作不再如此。我已经转移到一个运行python执行groovy闭包的docker容器中,以避免一些细微差别链接已经死了,请看。