使用Extra-vars在Ansible中传递多维数组的元素

时间:2014-12-09 22:21:39

标签: ansible ansible-playbook packer

我有一个使用Packer构建VM的工具,而Packer又调用Ansible(在本地模式下)来完成繁重的工作。
我希望能够将参数传递给Packer(得到那个),这个参数作为额外的vars传递给Ansible。

我可以传递外部变量文件以及一个简单的变量,例如下面的例子。

ansible-playbook -v -c local something.yml --extra-vars "deploy_loc=custom"

好吧,但我确实需要传递更复杂的变量数组,例如下面的例子 我尝试过多种格式,例如下面的格式,通常会出现某种分隔符错误。

ansible-playbook -v -c local something.yml --extra-vars 'deploy_loc=custom deploy_scen: [custom][ip=1.2.34]}'

角色变量文件

# Which location
deploy_loc: 'external-dhcp'

# location defaults
deploy_scen:
  custom:
     ipv4: yes
     net_type: dhcp
     ip: '1.1.1.1'
     prefix: '24'
     gw: '1.1.1.1.254'
     host: 'custom'
     domain: 'domain.com'
     dns1: '1.1.1.2'
  standard-eng:
     ipv4: yes
     net_type: none
     ip: '12.12.12.5'
     prefix: '24'
  external-dhcp:
     ipv4: yes
     net_type: dhcp

2 个答案:

答案 0 :(得分:2)

我认为生成yaml文件并将其与vars_files一起使用会更加健壮和可读。

或者,您可以生成一个json文件,并使用文件lookupfrom_json过滤器对其进行读取和解析。像这样:

- name: Read objects
  set_fact: deploy_scen={{lookup('file', 'deploy_scen.json') | from_json}}

但是,如果你真的想要--extra-var,你可以使用dict()函数:

-e 'var={{dict(key1=dict(subkey1="value"),key2=dict(subkey1="value2"))}}'

答案 1 :(得分:0)

您可以通过extra-vars参数将json结构传递给ansible。你必须要小心一点,以确保它已正确设置。您希望参数看起来像这样:

--extra-vars {"param1":"foo","param2":"bar","file_list":[ "file1", "file2", "file3" ]}

当我做这样的事情时,我通常会编写一个小的bash包装器脚本,以确保正确设置额外的vars,然后调用ansible。