在--extra-vars中传递数组 - Ansible

Tar*_*riq 46 yaml ansible-playbook

如何将yaml数组传递给--extra-varsAnsible playbook.Ansible文档没有声明它的语法,也没有在任何互联网资源上找到它.

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

---
  - hosts: {{hostName}}
  - remote_user: admin
  ...
Run Code Online (Sandbox Code Playgroud)

然后我应该把我的剧本称为

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

但我想运行这个剧本在两台服务器上说tomcat-webApp和tomcat-all,我想从出方控制它即使用--extra-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}]"
Run Code Online (Sandbox Code Playgroud)

但在所有情况下,playbook都无法在我的调用中声明语法错误.任何帮助赞赏.

jar*_*arv 39

回答你的第一个问题"如何将yaml数组传递给Ansible playbook中的--extra-vars".你可以将json格式的字符串传递给extra-vars.

这是一个例子:

- hosts: all
  gather_facts: no
  tasks:
    - debug: var=test_list
Run Code Online (Sandbox Code Playgroud)

以及如何将test_list传递给ansible-playbook:

ansible-playbook -c local -i localhost, test.yml --extra-vars='{"test_list": [1,2,3]}'
Run Code Online (Sandbox Code Playgroud)

虽然您可以将变量用于主机,但我建议您查看Ansible的主机管理机制,该机制与该选项一起是库存--limit.

  • 每当我使用JSON时,无论是在外部还是其他地方,我都会发现使用http://jsonlint.com成为救星.通过将{test_list:[1,2,3]}粘贴到该站点,您可以快速验证您的JSON在语法上是否正确.将多个变量传递给Ansible或者您正在使用任何其他复杂的JSON时,它尤其有用. (2认同)

Iva*_*gai 11

从Ansible 1.3开始,额外的变量可以在命令行或文件中格式化为YAML.请参阅标题为在命令行上传递变量的Ansible文档.

来自链接: - extra-vars"@ some_file.json"


Pet*_*ahn 8

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

所以,@NelonG 的方法有效,但它如何在所有执行上下文中工作?我的剧本往往由 Jenkins 作业通过 ansiblePlaybook 和打包器执行。让以下所有这些(即使命令行看起来正确)都不起作用,并且可能导致逃避噩梦。

ansible -i localhost, all -m debug -a "var=test_list" \
--extra-vars='{"test_list": [1,2,3]}' 
Run Code Online (Sandbox Code Playgroud)

如何作为字符串传入然后通过 set_fact 拆分(注意:这仅适用于您的元素没有有问题的字符。我有 URL,因此它们相当安全

ansible .... -e "test_list_csv=1,2,3,http://foo.bar/file.txt"
Run Code Online (Sandbox Code Playgroud)

在剧本中

name: generate list from string
  set_fact: 
    test_list: "{{ test_list_csv.split(',') | list }}"
Run Code Online (Sandbox Code Playgroud)

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

  • 太感谢了!几天来,我一直在尝试弄清楚如何使用 ansibleplaybook 模块将 JSON 格式的列表从 Jenkins 传递到 Ansible,该模块的 extraVars 需要映射。在这里我偶然发现了你的答案。它非常简单,但完全解决了我的问题:不要以 JSON 形式传递它,而是将其作为映射中的逗号分隔值传递。太感谢了! (2认同)

cyb*_*acy 5

除了jarv的回答之外,这是我的救世主注释:

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

--extra-vars '{"my_params":[40,50,10,20,30]}'
Run Code Online (Sandbox Code Playgroud)

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