Я пытаюсь использовать в своей задаче hostvars. Но кажется, что ansible интерполирует переменную, а затем пытается найти ее в объекте dict основной переменной. Вот мой код:
- name: Configure the instance
hosts: rundeck-masters
sudo: True
gather_facts: True
tasks:
- name: Gather EC2 facts
ec2_facts:
# show all known facts for this host
- debug: msg={{ hostvars[groups['rundeck-masters'][0]][ansible_ec2_instance_id] }}
- name: Snapshot the instance
local_action:
module: ec2_ami
description: "Rundeck master - {{ ansible_date_time.date }}"
instance_id: "{{ hostvars[groups['rundeck-masters'][0]][ansible_ec2_instance_id] }}"
wait: no
И ошибка, которую я получаю:
TASK: [debug msg={{ hostvars[groups['rundeck-masters'][0]][ansible_ec2_instance_id] }}] ***
fatal: [ec2-xx-xx-xx-xx.eu-west-1.compute.amazonaws.com] => One or more undefined variables: 'dict object' has no attribute u'i-12341234'
Таким образом, идентификатор экземпляра, очевидно, находится в dict hostvars, но у меня нет никакого способа фактически использовать его в качестве параметра instance_id для модуля ec2_ami.
Что я делаю не так? Цитирование сообщения отладки не имеет значения, а удаление фигурных скобок просто выводит на печать буквальную строку hostvars.
Кажется, ответ заключается в цитировании имени переменной: 'ansible_ec2_instance_id', то есть:
- debug: msg="{{ hostvars[groups['rundeck-masters'][0]]['ansible_ec2_instance_id'] }}"
Теперь все работает правильно.