Не делай этого. Я понимаю ваше желание использовать Ansible в качестве инструмента программирования, где «обработчик» — это «функция», которую вы «вызываете», но это не так.
Вы можете изобрести дюжину уловок, чтобы делать то, что хотите, но результатом будет полный беспорядок, его будет трудно читать и еще труднее отлаживать.
Ключевая проблема заключается в том, что ansible не поддерживает «передачу аргументов» чему-либо (кроме модулей). Все трюки, о которых вы читали или придумывали сами, изменят глобальную переменную. Если вы хоть немного писали на каком-либо языке, то знаете, что эта программа, в которой каждая функция использует глобальные переменные (для чтения и записи, а также для передачи аргументов), в корне ошибочна.
Итак, как это сделать в очень хорошем и читабельном Ansible?
Да просто написал отдельный обработчик для каждого сервиса. Это самый чистый и простой Ansible. Легко читается, легко меняется.
Кстати: если вам нужно выполнить действия в цепочке, не объединяйте их с помощью '&&'.
Используйте два отдельных обработчика:
- foo:
notify:
- eye reload
- eye restart foo
(обратите внимание, что порядок обработчиков определяется в списке обработчиков, а не в списке «уведомления»).
Кстати, если у вас мало сервисов, вы сэкономите на нескольких операциях перезагрузки - «перезагрузка глаза» будет вызываться один раз.
person
George Shuklin
schedule
26.10.2020
&&
будет работать, как и ожидалось. Параметризованные обработчики работают только в ansible 2.0, поэтому правильным способом является использование имени службы в имени обработчика:- name: reload eye {{ service }} shell: eye load /path/{{ service }}.rb && eye restart {{ service }}
- person hryamzik   schedule 10.03.2016