Vladimir
serial 1 надо тебе
Vladimir
http://docs.ansible.com/ansible/latest/user_guide/playbooks_delegation.html
Vladimir
Именно :)
Aleksey
сериал рабоает на play
Vladimir
linear ?
Aleksey
на таск видимо надо изобретать колесо
Vladimir
Нет же
Vladimir
http://docs.ansible.com/ansible/latest/user_guide/playbooks_strategies.html
Aleksey
где там про task ?
Vladimir
By default, plays run with a linear strategy, in which all hosts will run each task before any host starts the next task
Vladimir
Все должны выпонить задачу перед следующей
Vladimir
+ serial 1 и пойдет дело
Aleksey
дак надо только для одного таска же
Vladimir
А linear не решит эту проблему ?
Roman
В роли есть таск: - name: Get host var local_action: module: role_module db: "{{eon_seed_man_db}}" hostname: "{{ inventory_hostname_short }}" register: host_var - name: return var debug: msg: "{{host_var}}" Модуль обращается к БД берёт либо закрепленное за хостом значение, либо свободное и закрепляет его за хостом. В случае прогона плейбуков по множеству хостов, получается наложение: TASK [Role : return var] ok: [host1] => { "msg": "value1" } ok: [host2] => { "msg": "value1" }
Aleksey
linear дефолт
Vladimir
Только последовательность там нет гарантии
Roman
БД SQLная, т.е. одновременно возможнно параллельное выполнение SELECTов
Aleksey
я такое делаю на консуле
Vladimir
https://github.com/ansible/ansible/issues/12170 для таска есть ишью открытая
Vladimir
Так пусть для всего плейбука идет и норм же
Vladimir
Да дольше, зато есть гарантия
Aleksey
филькина грамота а не гарантия. ибо требует реализации singleton для запуска плейбуа
Vladimir
Так что используй пока для этого плейбука serial и жди когда ишью поправят
Vladimir
Я не понял почему нет :(
Vladimir
Ему главное что бы это не было параллельно, serial 1 говорит что будет по очереди ... все
Vladimir
Мб я чего не понимаю -__-
Roman
Задачи в форке последовательно делаются, я так понял.
Aleksey
база compare and swap умеет ?
Roman
PGSql, воде умеет.
Vladimir
попробуй плейбук прогнать несколько раз с serial:1 с дебагом
Vladimir
посмотри
Aleksey
ну тогда имеет смысл на ее завязаться. cas block retry until. или питонячий код.
Emin Aliyev
/rmkb@remkeybot
Roman
значит, пока что, будем костылить с блокировками таблиц....
Roman
Спасибо за информацию!
Ievgen
свободные IP, номера? что то такое?
Roman
да, типа того.
Aleksey
блокировки на таблице сильно более правильное imho решение чем serial:1
Ievgen
походу есть вариант
Ievgen
кстати интересно что я его раньше не находил
Ievgen
но надо тестить
Ievgen
ansible_play_batch.index(inventory_hostname)
Ievgen
выбрать единожды на localhost из базы нужное количество а потом доставать из list по индексу
Ievgen
я не дам гарантии что это точно сработает, надо делать тестовый плейбук и смотреть, но это решение лежит внутри ansible без завязок на блокировки итд
Ievgen
если оно работает конечно (то что select на локалхосте сработает и выбор по индексу это точно, у меня вопрос только к индексам хостов при serial 0)
Roman
Впринципе.... "LOCK TABLE seedlist IN ACCESS EXCLUSIVE MODE;" сработало.
Roman
но костыль, однако
Ievgen
офигенно сработает
Ievgen
- set_fact: current_index: "{{ ansible_play_batch.index(inventory_hostname) }}" - debug: var: current_index - meta: end_play ok: [host-02] => { "current_index": "0" } ok: [host-01] => { "current_index": "1" } ok: [host-03] => { "current_index": "2" }
Ievgen
serial: 0
Ievgen
но костыль, однако
если ты заранее вытащишь из базы количество элементов равное количеству хостов, запихнешь их в лист и потом будешь на каждом хосте вынимать по индексу хоста, то каждый из хостов получит уникальный элемент
Ievgen
а что не так с кодом?
Ievgen
это как раз не костыль
Ievgen
костыль это полагаться на внешний источник в то время когда можно решить внутри и непротиворечиво
Ievgen
имхо
Aleksey
ну так же нет защиты от паралельного вызова плейбука
Ievgen
от паралельного нет
Ievgen
согласен
Aleksey
с кодом всё так. но через месяц помнять зачем там будет не просто. по этому комментарий нужен
Ievgen
но с этим вообще печально, я имею в виду с паралельностью и такими вещами
Aleksey
это так 3 строки на питоне и 290 в ансибле
Ievgen
но я бы все равно не лочил таблицу постоянно, можно при первой выборке один раз залочить и пометить эелементы как занятые (но это уже требует вмешательства в базу)
Ievgen
а по концу пробега зайти и отпустить те для которых play сфэйлился
Ievgen
и все равно имхо это лучше чем 100500 раз бегать в базу и лочить
Ievgen
хоть и сложнее в реализации
eucariot отпуск (MSK+4)
Вот такая ошибка при долгой заливке длинного конфига на сетевую железку это ошибка ansible или модуля? An exception occurred during task execution. To see the full traceback, use -vvv. The error was: error: [Errno 2] No such file or directory fatal: [device-name]: FAILED! => {"changed": false, "err": "[Errno 2] No such file or directory", "msg": "unable to connect to socket"}
eucariot отпуск (MSK+4)
Очень любопытное для меня замечание, что после этой ошибки и завершения работы плейбука недостающие команды всё-таки доезжают до железки (вижу по истории команд) - как это?
eucariot отпуск (MSK+4)
fatal: [device-name]:
Aleksey
ансибл часто так херачит.
Aleksey
думаю ошибка на самом деле другая но после многих уровней отлова ошибки в итоге приехало что приехало
eucariot отпуск (MSK+4)
С сетью порядок. Выглядит так, словно либо по времени вылетает, либо примерно на 3000-й строке.
eucariot отпуск (MSK+4)
Пробовал - менял местами разные куски - всегда ± на одном месте показывает ошибку
eucariot отпуск (MSK+4)
Понять бы ошибка ансибла или модуля.
eucariot отпуск (MSK+4)
Это модуль Huawei*
eucariot отпуск (MSK+4)
Вот не знаю, ставить ли - ведь в итоге он проливает конфигурацию дальше. Причём после того, как плейбук уже перестал выполняться
eucariot отпуск (MSK+4)
Я тоже) Я уже пару забавных вещей в нём обнаружил)