Как определить хэш (dict) в доступном файле инвентаризации?

Я могу определить хэш (dict), как показано ниже, в 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"
}"

Я знаю, что это было неправильно, но я не знаю, как правильно. Может кто-нибудь просветить меня, пожалуйста?


person Benson Jin    schedule 24.04.2015    source источник


Ответы (2)


Когда я читал исходный код Ansible, значения переменных в файлах инвентаризации оцениваются с помощью «ast.literal_eval()» Python. Таким образом, вы можете описывать переменные dict в файлах инвентаризации однострочными литералами Python.

Ваш пример может выглядеть так:

[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.: Я не знаю, что такое определение переменной инвентаризации официально разрешено.

person Norio Kimura    schedule 03.07.2015
comment
Несколько лет спустя это больше не работает, и ansible (2.9) выводит предупреждение о сбое синтаксического анализа: Expected key=value host variable assignment. - person Phenyl; 24.01.2020
comment
Плохо, это работает, когда словарь помещается между кавычками, например. data_partition="{'shard1': '/data', 'shard2': '/data2'}". См.: stackoverflow.com/questions/18572092/ - person Phenyl; 24.01.2020

Вы не можете использовать dict в файле инвентаря, потому что он использует формат ini. В Ansible предпочтительной практикой является не хранить переменные в основном файле инвентаризации. Переменные хоста и группы могут храниться в отдельных файлах относительно файла инвентаризации.

Предполагая, что путь к файлу инвентаризации: /etc/ansible/hosts

Если хост назван «тестовым сервером», переменные в файле 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"

Подробнее читайте здесь.

person dizballanze    schedule 25.04.2015
comment
Кроме того, папка host_vars является частью макета каталога рекомендации Ansible. - person kalefranz; 28.04.2015
comment
Начиная с версии 2.4 вы можете использовать YAML в файле инвентаризации: docs.ansible .com/ansible/latest/plugins/inventory/yaml.html - person fbicknel; 02.07.2020