如何在ansible库存文件中定义hash(dict)?

时间:2015-04-24 20:19:08

标签: ansible ansible-inventory

我能够在group_vars / all中定义如下所示的哈希(dict):

region_subnet_matrix:
  site1:
    region: "{{ aws_region }}"
    subnet: "subnet-xxxxxxx"
    zone: "{{aws_region}}a"
  site2:
    region: "{{ aws_region }}"
    subnet: "subnet-xxxxxxx"
    zone: "{{aws_region}}b"

但是对于我的生活,我无法弄清楚如何在主机文件

下定义它
[all:vars]
region_subnet_matrix="{
  site1:
    region: "{{ aws_region }}"
    subnet: "subnet-xxxxxxx"
    zone: "{{aws_region}}a"
  site2:
    region: "{{ aws_region }}"
    subnet: "subnet-xxxxxxx"
    zone: "{{aws_region}}b"
}"

我知道这是不正确的,但我不知道正确的方法。有人可以开导我吗?

2 个答案:

答案 0 :(得分:9)

当我阅读Ansible的源代码时,库存文件中变量的值由Python的“ast.literal_eval()”评估。因此,您可以通过单行Python文字在库存文件中描述dict变量。

您的示例可能如下所示:

[all:vars]
region_subnet_matrix={'site1': {'subnet': 'subnet-xxxxxxx', 'region': '{{ aws_region }}', 'zone': '{{aws_region}}a'}, 'site2': {'subnet': 'subnet-xxxxxxx', 'region': '{{ aws_region }}', 'zone': '{{aws_region}}b'}}

确保在此示例中未评估任何变量。

N.B。:我不知道这种库存变量定义是否正式允许。

答案 1 :(得分:7)

您不能在库存文件中使用dict,因为它使用ini格式。 Ansible中的首选实践实际上不是将变量存储在主库存文件中。主机和组变量可以存储在相对于库存文件的单个文件中。

假设库存文件路径为:/etc/ansible/hosts

如果主机名为'testserver',则以下位置的YAML文件中的变量将可供主持人使用:/etc/ansible/host_vars/testserver

此文件中的数据可能如下所示:

region_subnet_matrix:
  site1:
    region: "{{ aws_region }}"
    subnet: "subnet-xxxxxxx"
    zone: "{{aws_region}}a"
  site2:
    region: "{{ aws_region }}"
    subnet: "subnet-xxxxxxx"
    zone: "{{aws_region}}b"

了解更多here