Ответ 1
С помощью Ansible 2.0+ вы можете обновить среднюю игру вашего инвентаря, выполнив задачу :
- meta: refresh_inventory
Я использую Ansible для установки экземпляров EC2 и развертывания приложения. Там есть хосты script, который собирает теги, связанные с серверами и информацией о группах. Я хотел бы запустить эти действия в виде одной пьесы, поэтому
Однако ресурсы загружаются заранее, поэтому нет данных о серверах/группах, если серверы созданы/обновлены во время игры. Я могу: 1) отдельные игровые приставки для обеспечения и развертывания; 2) использовать трюк add_host для эмуляции динамических ресурсов при обновлении серверов, но есть недостатки в этих подходах.
Могу ли я заставить Ansible перезагрузить инвентарь? Мои тестовые файлы:
hosts
script:
#!/bin/sh
echo `date` >> log.log
echo "{\"standalone\":[\"localhost\"]}"
Пример playbook.yml
:
---
- hosts: all
tasks:
- name: show inventory_hostname
command: echo {{ inventory_hostname }}
Я запустил его ansible-playbook -i hosts playbook.yml -v
и просмотрел два:
$> cat log.log
Thu Mar 12 09:43:16 SAMT 2015
Thu Mar 12 09:43:16 SAMT 2015
но я не нашел команду, чтобы удвоить его.
С помощью Ansible 2.0+ вы можете обновить среднюю игру вашего инвентаря, выполнив задачу :
- meta: refresh_inventory
Я обнаружил, что meta: refresh_inventory
недостаточно.
Я должен был сначала добавить явный вызов ec2.py --refresh-cache
.
- name: refresh inventory hosts: localhost connection: local gather_facts: False tasks: - name: Refresh EC2 cache command: /etc/ansible/ec2.py --refresh-cache - name: Refresh in-memory EC2 cache meta: refresh_inventory
Ansible в настоящее время не поддерживает это. Если вы посмотрите на исходный код команд ansible
или ansible-playbook
, вы увидите, что инвентарь загружен первым, а затем объект инвентаризации передается команде ansible, которая запускает задание или книгу. Перемещение обработки инвентаря, чтобы оно происходило в обработчиках задач/воспроизведения, вероятно, было бы довольно серьезным делом по ряду причин.
Лучше всего сделать что-то вроде этого: просто сложить свою игру на две части и обернуть их вызовы в оболочке script, которую нужно вызвать только один раз.
Посмотрите add_host.
Он добавляет хост (и, альтернативно, группу) в инвентарь памяти in-playbook в памяти