Ansible - запись отладки в файл: объект dict не имеет атрибута stdout_lines - PullRequest
0 голосов
/ 27 июня 2019

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

- name: Get cksum of the first file
  stat:
    path: "baselinedFiles/{{ inventory_hostname }}/file"
    checksum_algorithm: sha1
    get_checksum: yes
  register: myfristfile
  delegate_to: localhost

- name: Current SHA1 p1
  set_fact:
    mf1sha1: "{{ myfristfile.stat.checksum }}"
  delegate_to: localhost

- name: Get cksum of second file
  stat:
    path: "tmpFiles/{{ inventory_hostname }}/file"
    checksum_algorithm: sha1
    get_checksum: yes
  register: mysecondfile
  delegate_to: localhost

- name: Current SHA1 p2
  set_fact:
    mf2sha1: "{{ mysecondfile.stat.checksum }}"
  delegate_to: localhost

Приведенное выше просто получает SHA1, поэтому мы можем легко сравнить их в будущем, когда я записываю diff в файлы (я хочу записать diff только в случае, если файлы разные). Это работает как задумано.

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

- name: "Show diff if the hashes are different"
  copy:
    src: "baselinedFiles/{{ inventory_hostname }}/file"
    dest: "tmpFiles/{{ inventory_hostname }}/file"
  check_mode: yes
  diff: yes
  register: diffOutput
  delegate_to: localhost

Это работает и дает вывод примерно так:

TASK [diffNlog : Show diff if the hashes are different] *******************************************************************************************************************
ok: [a -> localhost]
ok: [b -> localhost]
ok: [c -> localhost]
ok: [d -> localhost]
--- before: tmpFiles/e/file
+++ after: /home/me/someDir/baselinedFiles/e/file
@@ -78,5 +78,4 @@
 #
 # End of: blah
 #
-#######################
-#THIS IS A CHANGE THAT MIGHT HAVE BEEN MADE
+#######################
\ No newline at end of file

changed: [e -> localhost]
ok: [f -> localhost]

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

- local_action: shell echo "{{ diffOutput }}" > logs/mytestlog
  when: mf1sha1 != mf2sha1
  delegate_to: localhost
  become: true
  become_user: me

Здесь я сталкиваюсь с проблемами логики. Он завершается нормально, но выбрасывает ENTIRETY файлов 1 и 2 в файл журнала, а затем показывает изменения. Это слишком много ненужного вывода, который я не хочу. Затем я попробовал это решение: Ansible выход оболочки Playbook , где я использую отладку, но, к сожалению, я продолжаю получать эту ошибку:

"The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'stdout_lines'

так как кажется, что переменная, которую я сохранил из вывода diff, не имеет атрибута stdout_lines. Как я уже говорил ранее, я хотел бы просто записать вывод, который ANSIBLE отображает на вашей консоли, пока он запускает вашу книгу воспроизведения, но я застрял здесь.

Любая помощь очень ценится. Спасибо

1 Ответ

1 голос
/ 27 июня 2019

Можно использовать разницу файла before и after

- set_fact:
    my_diff: "{{ diffOutput.diff.0.before|list|
                 difference(diffOutput.diff.0.after|list) }}"

Для получения diffOutput.stdout_lines использование команда

- command: "diff {{ file1 }} {{ file2 }}"
  register: diffOutput
  ignore_errors: yes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...