我能够在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"
}"
我知道这是不正确的,但我不知道正确的方法。有人可以开导我吗?
答案 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。