Как мне записать вывод задачи в файл?

10

Одна из моих заданий импортирует базу данных Oracle, используя impdp.

Это генерирует большой вывод на консоль, поэтому я установил no_log: True.

Тем не менее, когда это не удается, я хочу увидеть журнал!

Как я могу сделать этот конкретный журнал задач в файл, а не на консоль?

opticyclic
источник
Вы используете командный модуль?
бойкот SE для Моники
Одна из идей [больше взлома] состояла бы в том, чтобы записать журналы в какой-то внешний файл, а затем выполнить задачу, которая использует failed_whenусловие, и удалить файл журнала, если пред. задание было
успешным
Почему вы все равно видите вывод консоли во время успешных запусков? Я не видел конфигурацию для, и при этом я не думал, что это возможно, чтобы показать stdout во время успешного выполнения задачи, он должен просто подойти [хорошо: имя хоста]. Однако, когда обнаруживается ошибка, вывод выводится на консоль управления ANSIBLE (и любые определяемые журналы ANS), не могли бы вы поделиться конфигурацией, которая дает вам большой стандартный вывод во время регулярного успешного запуска?
Хвиндин
@hvindin Вставьте -vvvпосле ansible-playbookкоманды для получения подробных журналов.
Dawny33
1
Регистрация переменной кажется наилучшим логическим шагом, см. Мой комментарий к вашему ответу, чтобы узнать, что делать с выходными данными команд ANSIBLE.
Хвиндин

Ответы:

4

[Преобразование моего комментария в ответ]

Один из способов сделать это - записать журналы в какой-нибудь внешний файл, а затем выполнить задачу, которая использует условие fail_when, и удалить файл журнала, если предыдущая задача была успешной.

Нечто подобное должно помочь вам.

 - name: Run Py script
      command: <>.py  > <>.log
      become: yes
      register: PyScript
      ignore_errors: True

    - name: PyScript on success
      command: rm <>.log
      when: PyScript|succeeded

Примечание. Возможно, это не лучший способ решения вашей проблемы. Но это был хак, который помог мне сделать логирование и мониторинг.

Dawny33
источник
2
Я бы пошел еще дальше и сказал, что вы можете сохранить запись вашей команды в stdout / stderr, а затем просто выбросить их в ответ на ошибку. Таким образом, в качестве примера в приведенном выше примере, если вы хотите остановить выполнение в случае сбоя, то используйте задачу сбоя, чтобы просто вывести stdout и stderr, зарегистрированные в PyScript, когда rc! = 0, может показаться более целостным решением. Если вы используете встроенные механизмы ansibles, то, если в качестве примера вы настроили ведение журнала ansible на сервере управления, этот сервер управления регистрирует ошибку в журнале ansible. Что, я думаю, было бы правильным местом для этого
hvindin
3

Я думаю, что все, что вам нужно сделать, это зарегистрировать вывод каждой необходимой вам команды (сохранить ее в переменной), а затем просто вывести переменную в файл. Таким образом, вы можете просмотреть его позже.

tasks:
  - name: Dump all vars
    action: template src=templates/dumpall.j2 dest=/tmp/ansible.all

Тогда в dumpall.j2:

Module Variables ("vars"):
--------------------------------
{{ vars | to_nice_json }} 

Environment Variables ("environment"):
--------------------------------
{{ environment | to_nice_json }} 

GROUP NAMES Variables ("group_names"):
--------------------------------
{{ group_names | to_nice_json }}

GROUPS Variables ("groups"):
--------------------------------
{{ groups | to_nice_json }}

HOST Variables ("hostvars"):
--------------------------------
{{ hostvars | to_nice_json }} 

Пример, который я использую, отсюда

13dimitar
источник
3

Я решил это, добавив

ignore_errors: true
register: results

на no_log-задачу. Это заставляет ansible продолжать выполнение следующей задачи, даже если она не выполнена. Затем для следующей задачи определите задачу отладки, которая всегда дает сбой и выводит зарегистрированную переменную, но запускается только в случае сбоя предыдущей задачи:

- name: Error output
  debug:
     var: results
  failed_when: true
  when:
     results is failed

Так что даже с no_log: true, это сделает ANSIBLE отображать результаты неудачной задачи. Это решение не записывает его в файл в соответствии с запросом, но удовлетворяет потребность в «просмотре журнала в случае сбоя», и, конечно, вы можете перенаправить или использовать tee для вывода полного ответного вывода в файл, что и в этом решении также содержат журнал невыполненной задачи.

Робин Ровенс
источник
2

То, что я делаю, когда у меня есть команда для выполнения и я хочу получить журнал только в случае сбоя, выглядит следующим образом (с префиксом команды оболочки, как /bin/sh -c '...'в случае, если инициатор не использует systemвызов или не выполняет команду напрямую без оболочки) :

command 2&>1 > command-log.txt || cat command-log.txt

Это перенаправит ошибку и стандартный вывод в файл и отобразит содержимое файла только в случае сбоя. Если команда очень многословна и вы не хотите вести журнал, когда все в порядке, вы можете перейти с:

command 2&>1 > command-log.txt && rm command-log.txt || cat command-log.txt

Цитата &&и ||использование sh manpage :

Символ && (||) заставляет выполнение следующего списка только в том случае, если предыдущий конвейер возвращает нулевое (ненулевое) значение.

Вероятно, это не самый идиоматичный способ сделать это с ANSIBLE, но его преимущество в том, что он очень переносим с любой системой управления конфигурацией, позволяющей отображать стандартный вывод команды.

Tensibai
источник
0

При условии, что ansible правильно генерирует ошибки в stderr, вы можете записать вывод ошибок в любой программе в файл, используя перенаправление вывода:

some command 2> error.log

Однако я не думаю, что это так.

Вместо этого вы, скорее всего, захотите обратиться к этому руководству, чтобы решить, когда будут возникать ошибки, http://docs.ansible.com/ansible/playbooks_error_handling.html, а затем grep перед выводом строк, указывающих на ошибку, перед выводом в файл.

то есть.

ansible-playbook my-playbook | grep 'error' > error.log

yosefrow
источник
-2

Я думаю, что вы ищете, может быть слишком просто перенаправить стандартный вывод и улицу в файл.

Обычно some-command &> logfile.log

или какой-то вариант ....

Sparq
источник
Что является лишь частичным ответом, OP хочет видеть журнал в случае ошибки.
Тенсибай
Я не думаю, что это даже частичный ответ на этот вопрос. Это нормально для сценария оболочки, но бесполезно для кодирования в ansible .
цыплята
@ chicks Я думаю, что это может быть правильным решением проблемы метода «shell» в рамках ansible (чего я не знаю много)
Tensibai
-2

Это будет очень простой инструмент для регистрации, вы можете обратиться к следующей команде.

eric@eric-MacBookPro:~$ ansible -m ping all | tee > /tmp/ansible.log
eric@eric-MacBookPro:~$ cat /tmp/ansible.log 
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
Эрик Чжан
источник
2
1. Это влияет на весь цикл, а не только на одну задачу. 2. Нет смысла прокладывать канал через тройник, если вы собираетесь перенаправить его стандартный вывод в файл; это не то, как вы используете команду. 3. Если вы используете tee должным образом, он все равно выведет весь спам на консоль, что OP не хочет.
бойкот SE для Моники