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

如何在ansible库存文件中定义哈希(dict)?,ansible,ansible-inventory,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

我能够在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"
但就我个人而言,我不知道如何在hosts文件下定义它

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

我知道这是不正确的,但我不知道正确的方法。有人能告诉我吗?

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

假设清单文件路径为:
/etc/ansible/hosts

如果主机名为“testserver”,则以下位置的YAML文件中的变量将可供主机使用:
/etc/ansible/host\u 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"
[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'}}

阅读更多。

在阅读Ansible的源代码时,清单文件中变量的值由Python的“ast.literal_eval()”计算。因此,您可以用一行Python文本来描述清单文件中的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': {'subnet': 'subnet-xxxxxxx', 'region': '{{ aws_region }}', 'zone': '{{aws_region}}a'}, 'site2': {'subnet': 'subnet-xxxxxxx', 'region': '{{ aws_region }}', 'zone': '{{aws_region}}b'}}
确保本例中未计算任何变量


注意:我不知道这种库存变量定义是正式允许的。

还有一个
host\u vars
文件夹是目录布局的一部分。从2.4开始,您可以在库存文件中使用YAML:几年后,这不再起作用并且是可解析的(2.9)分析失败时输出警告:
Expected key=value主机变量赋值
。糟糕,将字典置于引号之间时,它会起作用,例如
data\u partition=“{shard1':'/data”,“shard2':'/data2'}”
。见: