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)