Как определить хеш (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"
}"

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

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

Убедитесь, что никакие переменные не оцениваются в этом примере.

NB: я не знаю, такое определение переменных инвентаризации официально разрешено.

Вы не можете использовать 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"

Узнайте больше здесь.

Другие вопросы по тегам