LINUX.ORG.RU
решено ФорумAdmin

Ansible: обновить данные динамической инвентаризации после создания инстансов

 , ,


0

2

Ansible версии 1.9.2, запускаю на Ubuntu 14.04.

Созданы роли, которые настраивают уже созданные инстансы Amazon EC2, используя, в том числе, тэги амазона с помощью contrib/inventory/ec2.py.

После создания новых инстансов, хочется в том же плейбуке начать применять к ним готовые роли, но переменных, собранных динамической инвентаризацией ec2.py (например, ec2_tag_*, ec2_key_name) для свежесозданных инстансов ещё нет, а тех, что собирает модуль ec2_facts (переменные ansible_ec2_*), недостаточно.

Попробовал сделать так:

- hosts: localhost
  connection: local
  gather_facts: False
  tasks:
    - ec2:
      …
      register: ec2

    - name: Add new instance to host group
      add_host: hostname={{ item.public_ip }} groupname=launched
      with_items: ec2.instances

- hosts: launched
  sudo: yes
  remote_user: ubuntu
  gather_facts: True
  tasks:
    - ec2_facts:

    - name: Try to run Dynamic inventory
      sudo: false
      delegate_to: 127.0.0.1
      shell:  /etc/ansible/hosts/ec2.py --refresh-cache --host {{ ansible_ec2_public_ipv4 }}
      register: ec2_new

    - set_fact:
        _meta.hostvars.[{{ ansible_ec2_public_ipv4 }}]: "{{ ec2_new.stdout | from_json }}"
Но, к примеру, в {{ ec2_key_name }} ничего нет, проблема в последнем set_fact (или во всей этой задумке).

Хочется, чтобы одни и те же роли подходили как для уже созданных инстансов, так и для создаваемых. Есть какие нибудь мысли, или придётся через shell запускать друг за другом два разных плейбука?

★★

Я не знаю этих амазоновских штук, но вот что могу посоветовать - пробегись debug'ом (или напиши коллбэк чтоб логировал тебе полностью всю информацию по таскам) и посмотри что у тебя и куда присваивается, может это поможет. Вообще если ты можешь написать два плейбука (для создания инстансов и для управления инстансами) то и в один их тоже можешь объединить.

alozovskoy ★★★★★
()
Последнее исправление: alozovskoy (всего исправлений: 1)

ec2.ini какой используется? Тот, что по умолчанию идет? А новые инстансы то уже успели перейти в состояние running на момент запуска ec2.py?

Log_in
()
Ответ на: комментарий от alozovskoy

Проблема объединения плейбуков как раз в том, что для объединённого плейбука динамическая инвентаризация запустится только один раз.

Проблема именно в записи последним set_fact, я не понимаю как записать в _meta.hostvars, может это вообще нельзя сделать с помощью set_fact.

LeNiN ★★
() автор топика
Ответ на: комментарий от Log_in

Изначально использовал изменённый ec2.ini, но потом и дефолтный пробовал. Инстансы уже запущены, принимают ssh, предпоследнее задание с shell ec2.py выполняется успешно и собирает то, что надо, но я не знаю, как это записать в _meta.hostvars.

LeNiN ★★
() автор топика
Ответ на: комментарий от LeNiN

А для чего записывать в _meta.hostvars?

- set_fact:
    ec2_output: "{{ ec2_new.stdout|from_json }}"

В ec2_output._meta.hostvars.[{{ ansible_ec2_public_ipv4 }}] у тебя всё должно быть.

Log_in
()
Ответ на: комментарий от Log_in

Я не пишу в отдельный словарь переменных, т.к. роли, настраивающие инстансы, используют переменные вида ec2_key_name и ec2_tag_*. Да, всё это можно переписать под два случая — если инстанс новый и его ещё нет в динамической инвентаризации и если инстанс уже был создан ранее и в динамической инвентаризации присутствует. Но вдруг можно просто обновить _meta.hostvars «на ходу»? Получилось бы красиво.

LeNiN ★★
() автор топика
Ответ на: комментарий от LeNiN

Получается, что нужно сделать merge двух dictionary. Ansible такого не умеет вроде бы. Можно попробовать извратиться с jinja2:


_meta.hostvars: "{{_meta.hostvars.update(ec2_output._meta.hostvars)}}{{_meta.hostvars}}"

Вот только я не уверен, что можно слева и справа использовать _meta.hostvars в одном выражении.

Log_in
()
Ответ на: комментарий от Log_in

Ну этот вариант если что-то дописываешь в переменную, внутри которой словарь. Вообще сложную логику проще будет реализовать на Jinja прям внутри плейбука. Увы, как я выше писал я не сталкивался с ec2, по-этому не знаю что у вас в этой переменной и что должно быть, но общие принципы такие.

alozovskoy ★★★★★
()
Ответ на: комментарий от alozovskoy

Это не у меня, это у топикстартера. Я понятия не имею, как у него устроены плейбуки. Все предположения строятся из обрывков его кода и известной структуры выхлопа ec2.py.

Log_in
()

Решение

В общем, писать в hostvars просто так нельзя. Плагин с VarsModule тоже не поможет, т.к. запускается только при старте.

Сделал так: одним плейбуком создаю инстансы и прописываю DNS'ы, пока они инициализируются и добавляю для себя ec2-тэги, что инстансы ещё не донастроены. Другим плейбуком настраиваю всё остальное. Всё это запускаю из shell-скрипта, между плейбуками делаю ec2.py --refresh-cache.

Всем большое спасибо за идеи!

LeNiN ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.