#bash #shell #ansible
#bash #оболочка #ансибль #ansible
Вопрос:
У меня есть cronjob, который запускается каждые 1 минуту, чтобы получить файл с удаленного сервера, а затем поместить его в мой локальный $INC_INVENT
ниже приведен пример файла,
-rw-r--r-- 1 ansi ansi 46 Sep 21 22:34 inventory_200921223307
-rw-r--r-- 1 ansi ansi 46 Sep 21 22:35 inventory_200921223406
затем у меня есть скрипт, который будет запускаться каждые 5 минут для выполнения приведенного ниже кода. Сначала он проверит, есть ли новый файл, а затем запустит playbook
ls -1 $INC_INVENT | grep -v "process" | while read invent_file
do
check=$( find $INC_INVENT -name $invent_file -cmin -5 )
if [ ! -z $check ]
then
ansible-playbook -i $INC_INVENT/$invent_file $MAIN/applyPatch.yml -vv >> $LOG/linuxpatching.log.$$ 2>amp;1
mv $INC_INVENT/$invent_file $PROCES
exit
else
exit
fi
done
Проблема в том, что обрабатывается только файл (inventory_200921223307), другой файл (inventory_200921223406) больше не обрабатывается playbook. Кажется, больше не соответствует условию » -cmin -5″? Моя цель — любой НОВЫЙ поступающий файл будет обработан, я добавил -cmin -5, чтобы избежать повторной обработки файла инвентаризации, если он еще не перемещен в process dir это плохой подход или есть лучший способ добиться этого? Заранее благодарю.
-rw-r--r-- 1 ansi ansi 46 Sep 21 22:34 inventory_200921223307
Ответ №1:
мне кажется, это проблема дизайна, например, пока обрабатывается первый файл, проходит некоторое время, и когда вы пытаетесь проверить следующий файл в строке, он уже истекает.
Я бы исправил это, немного переписав цикл:
find . $INC_INVENT -cmin -5 | grep -v "process" | while read invent_file
do
ansible-playbook -i $INC_INVENT/$invent_file $MAIN/applyPatch.yml -vv >> $LOG/linuxpatching.log.$$ 2>amp;1
mv $INC_INVENT/$invent_file $PROCES
done
Таким образом, вы сначала запрашиваете соответствующие данные, а затем просто обрабатываете их без необходимости проверять их позже в цикле очереди