Обычно это выполняется с помощью процесса, называемого сканированием классов. В общем случае загрузчики классов не позволяют сканировать все классы в пути к классам. Но обычно единственным используемым загрузчиком классов является UrlClassLoader
, из которого мы можем получить список каталогов и файлов jar (см. getURLs ) и открывать их один за другим для отображения доступных классов.
Этот подход реализуется такими библиотеками, как Scannotation и Reflections .
Еще один подход заключается в использовании Java Plug-and-end API обработки аннотации ], чтобы написать обработчик аннотации, который будет собирать все аннотированные классы во время компиляции и создавать файл индекса для использования во время выполнения.
Вышеупомянутый механизм реализован в библиотеке ClassIndex .
Использование сканирования на основе классов обычно на два порядка медленнее, чем индексирование во время компиляции. См. этот контрольный показатель .
Вы можете поместить задачи, которые хотите повторить, в отдельный файл yaml:
---
# tasks-to-repeat.yml
- name: get the date for naming purpose
shell: date +%Y%m%d-%HH%MM%SS
register: dateext
- name: grep the commands from nagios
shell: grep -R check_http_EDEN_ /etc/nagios/nrpe.cfg | cut -d= -f2-
register: nagios_check
- name: check_eden_before
shell: (printf $(echo '{{ item }}' | awk -F'country=' '{print $2}' | cut -d'&' -f1); printf ' ';{{ item }} | cut -d ' ' -f-2) >> {{ ansible_env.DATA_LOG }}/eden-{{ ansible_hostname }}-{{ dateext.stdout }}
with_items: "{{ nagios_check.stdout_lines }}"
ignore_errors: True
- name: enter simple line
shell: echo "=================" >> {{ ansible_env.DATA_LOG }}/eden-{{ ansible_hostname }}-{{ dateext.stdout }}
, а затем включить его в свой плей-лист 3 раза:
---
# Your playbook
... more code above
- include: task-to-repeat.yml
- include: task-to-repeat.yml
- include: task-to-repeat.yml
Я считаю, что ваш лучший вариант - написать пользовательский модуль , который будет инкапсулировать все шаги, которые вы пытаетесь достичь. И поместите все переменные, отличные от 1, запускаются в один список.
Исходя из того, что вы описываете, я могу предположить, что у вас есть проблемы с:
Это будет намного чище иметь строку, которая будет выглядеть примерно так:
- name: Run my nagios checks
my_custom_nagios_module_1.0: >
date={{ item.date }}
varaible_x={{ item.x }}
with_items:
- { date: '%Y-%m-%d', x: 'foo' }
- { date: '%Y-%m-%d', x: 'bar' }
- { date: '%Y-%m-%d', x: 'baz' }
в отличие от повторения одного и того же набора задач снова и снова.