2

我有一个使用 Packer 构建 VM 的工具,而 Packer 又调用 Ansible(在本地模式下)来完成繁重的工作。
我希望能够为 Packer 提供参数(知道了),它作为额外的变量传递给 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
4

2 回答 2

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"))}}'
于 2014-12-10T13:21:27.237 回答
0

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

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

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

于 2014-12-18T18:43:41.150 回答