2015-04-24 1 views
6

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

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

ответ

5

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

+1

Также папка 'host_vars' является частью макета каталога [Ansible best practices] (http://docs.ansible.com/playbooks_best_practices.html#directory-layout). – kalefranz

6

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

Смежные вопросы