【问题标题】:How to define hash (dict) in ansible inventory file?如何在 ansible 库存文件中定义哈希(dict)?
【发布时间】:2015-07-03 14:29:32
【问题描述】:

我可以在 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"

但是对于我的生活,我无法弄清楚如何在 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"
}"

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

【问题讨论】:

    标签: ansible ansible-inventory


    【解决方案1】:

    您不能在库存文件中使用 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。

    【讨论】:

    【解决方案2】:

    当我阅读 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.:我不知道官方允许这种库存变量定义。

    【讨论】:

    • 几年后,这不再起作用,ansible (2.9) 输出解析失败的警告:Expected key=value host variable assignment。
    • 我的错,将字典放在引号之间时它可以工作,例如data_partition="{'shard1': '/data', 'shard2': '/data2'}"。见:stackoverflow.com/questions/18572092/…
    猜你喜欢
    • 2010-12-02
    • 1970-01-01
    • 2023-03-12
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    相关资源
    最近更新 更多