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

时间:2014-09-02 06:40:11

标签: yaml ansible-playbook

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

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

---
  - hosts: {{hostName}}
  - remote_user: admin
  ...

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

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

但是我想在两个服务器上运行这个剧本tomcat-webApptomcat-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}]"

但是在所有情况下,playbook都无法在我的通话中声明语法错误。 任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:37)

回答你的第一个问题"我如何在Ansible剧本中将yaml数组传递给--extra-vars。" 你可以传递json formatted string to extra-vars

以下是一个示例游戏:

- hosts: all
  gather_facts: no
  tasks:
    - debug: var=test_list

如何将test_list传递给ansible-playbook:

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

虽然您可以为主机使用变量,但我建议您查看Ansible的主机管理机制inventory以及--limit选项。

答案 1 :(得分:10)

从Ansible 1.3开始,额外的变量可以在命令行或文件中格式化为YAML。请参阅the Ansible documentation titled Passing Variables On The Command Line

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

答案 2 :(得分:1)

除了来自 jarv 的答案,这是我的救星笔记:

如果有人想传递整数数组,则可以这样做:

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

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

答案 3 :(得分:0)

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

因此,@ NelonG的方法有效,但是在所有执行上下文中它将如何起作用? Jenkins Jobs倾向于通过ansiblePlaybook和打包程序来执行我的剧本。使以下内容适用于所有这些功能(即使在命令行看起来正确时)也不起作用,并且可能导致逃避现实的噩梦。

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 }}"

我决定逃脱,这似乎行得通。