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
Aleksey
я такое делаю на консуле
Vladimir
https://github.com/ansible/ansible/issues/12170 для таска есть ишью открытая
Aleksey
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
но костыль, однако
если ты заранее вытащишь из базы количество элементов равное количеству хостов, запихнешь их в лист и потом будешь на каждом хосте вынимать по индексу хоста, то каждый из хостов получит уникальный элемент
Aleksey
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)
Я тоже) Я уже пару забавных вещей в нём обнаружил)