Ansible - Могу ли я печатать информацию во время выполнения модуля?
Я хотел бы знать, есть ли способ распечатать информацию во время работы модуля - прежде всего как средство продемонстрировать, что процесс работает и не висел. В частности, я пытаюсь получить обратную связь во время выполнения модуля cloudformation. Я попытался изменить исходный код (Python), чтобы включить следующее:
def debug(msg):
print json.dumps({
"DEBUG" : msg
})
...
debug("The stack operation is still working...")
Что это, конечно, хранит весь этот вывод и только распечатывает все это после завершения работы модуля. Поэтому для особо больших шаблонов облаков это означает, что я жду около 5 минут или около того, а затем внезапно вижу, что на экране появляется большое количество текста. Я ожидал увидеть, что "Операция стека все еще работает..." печатается каждые х секунд.
Казалось бы, что Асинхронные действия и опрос - это то, что я ищу... но это тоже не сработало. Вся задача "Запустить CloudFormation для {{stackname}}" была полностью пропущена. См. Ниже соответствующий фрагмент (YAML) из моей пьесы:
- name: Launch CloudFormation for {{ stackname }}
cloudformation: >
stack_name="{{ stackname }}" state=present
region="{{ region }}" disable_rollback=true
template="{{ template }}"
register: cloud
args:
template_parameters:
KeyName: "{{ keyName }}"
Region: "{{ region }}"
SecurityGroup: "{{ securityGroup }}"
BootStrapper: "{{ bootStrapper }}"
BootStrapCommand: "powershell.exe -executionpolicy unrestricted -File C:\\{{ bootStrapper }} {{ region }}"
S3Bucket: "{{ s3Bucket }}"
async: 3600
poll: 30
Это говорит мне, что async предназначен для типичных команд оболочки, а не для сложных модулей, таких как cloudformation. ИЛИ. Возможно, я сделал что-то неправильно.
Может ли кто-нибудь пролить свет на эту ситуацию? Опять же, для больших задач облачной обработки, которые занимают некоторое время, я хотел бы, чтобы некоторые периодические указания о том, что задача все еще работает, а не висит. Я ценю помощь!
Ответы
Ответ 1
Ответ прост - нет.
Ansible - это непрерывная система, которая направлена на то, чтобы справляться с умением работать над множеством серверов и отображать результаты stdout в реальном времени, может быть очень неудобно.
Но я думаю, что вы можете использовать некоторые трюки, если ваша целевая система может поддерживать выполнение в фоновом режиме. Я вижу, что ваша система - это окна, поэтому вам нужно установить на нее cygwin для возможности запуска фоновых команд типа "sleep 20 &" в приведенном ниже примере
Вы можете запустить эту книгу с помощью ansible-playbook -vv background.yml
Вы можете видеть, что изменение stdout.
echo Test---- >> /tmp/test && tail /tmp/test
- демонстрационная команда. Вы должны вывести данные в некоторый файл и забрать его для возможности увидеть прогресс. Или вы можете посмотреть размер файла stdout и отобразить его. Используйте воображение)))
# @file background.yml
- hosts: 127.0.0.1
connection: local
gather_facts: no
tasks:
- name: Background operation
shell: "sleep 20 & \ PPID=$! \ echo $PPID"
register: bcktsk
- name: Check PPID
shell: "kill -0 {{ bcktsk.stdout | int + 2 }}"
register: checkppid
ignore_errors: true
- name: Check if process still active
shell: "echo Test---- >> /tmp/test && tail /tmp/test && kill -0 {{ bcktsk.stdout | int + 2 }}"
register: test
when: checkppid.rc == 0
until: test.rc ==1
delay: 2
retries: 10000
ignore_errors: true
Ответ 2
Мой подход для модуля localhost:
...
module.log(msg='test!!!!!!!!!!!!!!!!!')
...
Затем в другое окно:
$ tail -f /var/log/messages
Nov 29 22:32:44 nfvi-ansible-xxxx python2: ansible-test-module test!!!!!!!!!!!!!!!!!
Ответ 3
Существует способ обойти это, и он отобразит вывод в режиме реального времени, однако вам придется иметь дело с введенными префиксами в каждой строке. Это грязный/хакерский, но для целей отладки/мониторинга он выполняет свою работу:
- name: Run some command and echo it realtime stdout
shell: ":"
with_lines: "/usr/bin/some_long_running_command with arguments and such here"
Команда :
- это просто noop, вы можете легко использовать command: /usr/bin/true
, если это проще. В любом случае, это будет выводить строки, похожие на:
changed: [localhost] => (item=first output line)
changed: [localhost] => (item=second output line)
changed: [localhost] => (item=third output line)