如何在Ansible playbook中将yaml数组传递给--extra-vars
。 Ansible文档没有声明它的语法,也没有在任何互联网资源上找到它。
我的意思是如果我有一本剧本:
---
- hosts: {{hostName}}
- remote_user: admin
...
然后我应该把我的剧本称为
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}]"
但是在所有情况下,playbook都无法在我的通话中声明语法错误。 任何帮助表示赞赏。
答案 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 }}"
我决定逃脱,这似乎行得通。