Как получить только строки stdout _с помощью Ansible с помощью почтового модуля

# find the prefix of your repository
ls /var/lib/apt/lists

# list all the packages (replace "foo" with your prefix)
grep '^Package:' /var/lib/apt/lists/foo*_Packages

# hide the filenames so you can sort by package name
grep -h '^Package:' /var/lib/apt/lists/foo*_Packages | sort
0
09.09.2021, 15:26
1 ответ

Из вашей отладки result— это зарегистрированная переменная из задачи оболочки, в которой запускается clamavв цикле по списку путей.

Как описано в документации цикла ansible , зарегистрированная переменная модифицируется, чтобы содержать список results, где каждый элемент является отдельным результатом запуска модуля с текущим итерируемым элементом (, например. /usr/binв вашем примере ).

В этом случае result.stdoutне существует (, о чем ясно сообщает ваше сообщение об ошибке ), но в качестве конкретного примера result.results.0.stdoutсуществует в вашем примере.

Хотя это сработает, если у вас всегда один путь в цикле, вы, вероятно, захотите получить список всех stdout из каждого результата. В этом случае вы можете использовать:

result.results | map(attribute='stdout')

Если мы поместим это обратно в ваш конкретный шаблон, способный выдавать результат для любого заданного host, это даст:

The {{ host }} says {{ hostvars[host].result.results | map(attribute='stdout') | to_nice_json }}

Обратите внимание, что переход к json здесь может быть не лучшим вариантом для электронной почты, и что приведенное выше приводит к потере информации об исходном пути, который был отсканирован. Альтернативный вариант может состоять в том, чтобы просто просмотреть результаты и распечатать только необходимую информацию :

.
This is report for host {{ host }}
----------------------------------
{% for scan_result in hostvars[host].result.results %}
Scan performed in directory {{ scan_result.item }}:
{{ scan_result.stdout }}
{% endfor %}

0
11.09.2021, 12:26

Теги

Похожие вопросы