11

我可以在 group_vars/all 中定义如下哈希(字典):

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

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

4

2 回答 2

13

当我阅读 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'}}

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

注意:我不知道官方允许这种库存变量定义。

于 2015-07-03T05:46:58.183 回答
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"

在这里阅读更多。

于 2015-04-25T10:15:11.250 回答