Timur
get_url?
kbks
артифакты - обычные zip архивы
Timur
Он сам умеет чексумму сравнивать у таргета и source
kbks
я видел там параметр checksum, но не совсем понимаю как его применить при сравнении
Timur
я видел там параметр checksum, но не совсем понимаю как его применить при сравнении
Да элементарно. Берете чексумму с соурс ресурса (или откуда вы их там берете) и передаете в качестве аргумента модулю get_url
Timur
Дальше все нужное уже сам модуль сделает, обеспечивая идемпотентность
Timur
Только force: true нужно будет поставить в модуле
Timur
Достаточно просто в модуле указать линки на sha1 и указать нужный параметр модуля
Timur
И все
Timur
Никаких stat и всего прочего не нужно
Michael
Да элементарно. Берете чексумму с соурс ресурса (или откуда вы их там берете) и передаете в качестве аргумента модулю get_url
какой аргумент? есть checksum, но там: If a checksum is passed to this parameter, the digest of the destination file will be calculated after it is downloaded to ensure its integrity
Timur
какой аргумент? есть checksum, но там: If a checksum is passed to this parameter, the digest of the destination file will be calculated after it is downloaded to ensure its integrity
Additionally, if a checksum is passed to this parameter, and the file exist under the dest location, the destination_checksum would be calculated, and if checksum equals destination_checksum, the file download would be skipped
Michael
kbks кстати, там есть другой параметр Additionally, if a checksum is passed to this parameter, and the file exist under the dest location, the destination_checksum would be calculated, and if checksum equals destination_checksum, the file download would be skipped (unless force is true). If the checksum does not equal destination_checksum, the destination file is deleted.
Timur
Это тот же самый параметр
Timur
Вы просто до конца не дочитали
Michael
да, открытие для меня. спасибо.
Timur
Т.е. просто добавляете в поле checksum ссылку на файл с чексуммой - и все
Timur
Модуль сам сверит чексуммы и не будет скачивать, если они совпадают
Alexander
есть немножко, но ансиблом сеть не ковыряю, жалко )
Alexander
есть более удобные инструменты, тот же napalm взять
George
У меня странный вопрос. Я пишу модуль ip_link, который может интерфейс создать, а может сделать up. У меня была идея иметь общий параметр state: [present/absent/up/down], где up/down пордразумевают present. Но при этом я точно не хочу "создавать" eth1 если его нет и мне сказали state:up. Но хочу создавать условный veth1. Выглядит как противоречие. Я могу up/down вынести как отдельный параметр (link_state), либо же оставить параметр state в present/absent/up/down, но добавить create: true/false. Оба меня не очень радуют. Как бы мне это противоречие разрешить?
George
Два usecase'а: - ip_link: name=veth1 state=up peer_name=veth2 type=vethи - ip_link: name=eth1 state=up
George
Один "создай и сделай up", второй - "сделай up"
George
Видимо, надо делать state=present/absent/none (none - не создавать и не удалять, а только менять link_state).
George
В целом проблема в том, что модуль часть линков сделать может (veth/vlan/etc), а часть нет (eth1/ens1/etc).
George
@Lambot, ты не понял проблемы. Я могу сделать линк с типом veth (и назвать его eth0), но пользователь будет несколько растерян, потому что он ожидал, что ему железный eth0 поднимут. (т.е. так делать не надо).
Sergey
Забираешь свободу стрелять в ногу?
George
Я могу вместо ключика virtual смотреть на то, передали мне type или нет. Если type нет, не создавать.
George
Но не будет ли это слишком RTFM/WTF?
George
Т.е. варианты: - state: present/absent/up/down, а создание контролируется наличием type. Если интерфейса в системе нет, type нет, а требуют up - ломаться. - state: present/absent/none, link_state=up/down/none. Если none - не создавать, а только учитывать link_state.
Sergey
Но не будет ли это слишком RTFM/WTF?
На мой взгляд - нет. Ты же обёртку вокруг ip делаешь? Там же всё нужно указать ключами, недоуказал - получил странное. Всё честно, никаких нежданчиков.
George
Дока к модулям говорит, что слишком тупые обвёртки не надо делать, надо давать более человечный интерфейс.
Sergey
"человечный" и "пытающийся догадаться за пользователя" - разное, разве нет?
George
Если что, вот текущее чудо: https://github.com/amarao/ansible/blob/51e82d6f2656fa8d36facc9ee8eeee4f613fcb38/lib/ansible/modules/net_tools/ip_link.py
George
Я не хочу догадываться за пользователя, я хочу интерфейс, который не вызывает неоднозначностей. Мой вопрос в том, какой вариант лучше.
George
type=ethernet смысла не имеет, потому что невозможно сделать state=present type=ethernet если его в системе нет.
George
(или я что-то в ip link не знаю)
George
Главная проблема с state=present в том, что ошибка "нужен ещё и параметр type" будет только в runtime, потому что ansible не даёт зависимых параметров в описании параметров модуля. Там можно только type указать, required и choice.
Konstantin
есть немножко, но ансиблом сеть не ковыряю, жалко )
В каком плане жалко?;) Не хочется завалить ненароком?)
Alexander
ну конечно )
Konstantin
понятно) тоже терзают сомнения нужно ли в сеть лазить массово, но ACL есть идентичные на железках и хочется их поддерживать в актуальном состоянии
Sergey
Главная проблема с state=present в том, что ошибка "нужен ещё и параметр type" будет только в runtime, потому что ansible не даёт зависимых параметров в описании параметров модуля. Там можно только type указать, required и choice.
niet. required_together принимает на вход списки, в которых лежат названия параметров, которые имеют смысл только вместе. Я в докладе об этом год назад говорил 😊
George
Офигеть, спасибо.
George
А что этого нет в https://docs.ansible.com/ansible/latest/dev_guide/developing_program_flow_modules.html#argument-spec ?
George
required_if - как раз оно.
Sergey
Подходящая тема для PR? ;-) Я уже привык к тому, что исходники - лучшая дока.
George
Очень подходящая.
Sergey
Очень подходящая.
Добью тебя танцем: ещё есть mutually_exclusive([<list>], [<list>],...) required_one_of([<list>])
George
Я нашёл блог с такими штуками. В принципе, всё, что можно понять не в райнтайме, можно в них засунуть.
George
И всё-таки меня кусает червячок сомнения относительно state: present/up единым образом. Проблема в том, что это WTF. state=up поднимает интерфейс если он существует и фейлится, если такого интерфейса нет. state=up type=veth поднимает интерфейс если он существует и создаёт, если такого интерфейса нет. Вот прям чую запах wtf'а.
George
Я не знаю, применим ли python zen к ансиблу, но это подпадает под "явное лучше неявного". Наверное, всё-таки state: present/absent/none и отдельный link_state: up/down/none будет яснее для читающего.
George
Не указан link state - не трогаем. Не указан state - не пробуем создать/удалить.
Sergey
тогда, наверное, intf_state и link_state отдельно
George
intf?
Sergey
iface_state?
Sergey
так вроде прозрачнее
George
В принципе, в ансибле общепринято, что state - это present/absent. Это не выглядит как wtf для читающего. Для пишущего может быть чуть-чуть не очевидно, что создание задаётся через state. С другой стороны, я не вижу неоднозначности или wtf с state: present. Заодно можно потребовать, что если state: present, то должна быть вся информация, чтобы его (интерфейс) создать.
George
контрпримеры: systemd: name=service, masked=true daemon_reload=true, apt: update_cache=true
George
Cущность одна, действий над ней (чтобы сделать желаемый state) несколько.
Sergey
контрпримеры: systemd: name=service, masked=true daemon_reload=true, apt: update_cache=true
Это сильно завязано на кишки системной реализации. Попробуй найди с двумя стейтами, где два разных чегоо-либо создаются одним модулем.
Sergey
А, и ещё: какой бы вариант ты ни выбрал - всё равно на него найдётся свой слоупок, который придёт в чат и напишет свой wtf
Sergey
Так что решай сам. Свои соображения я высказал, но автор модуля - ты, тебе и решать.
George
"два разных чего-то" ты о чём? Интерфейс-то один, мы говорим "должен существовать в состоянии link up mtu 9000: - ip_link: name: eth0 mtu: 9000 link_state: upи - ip_link: name: veth1 state: present namespace: foobar peer_name: veth2 peer_namespace: barbar mtu: 4444 link_state: up peer_link_state: up
George
и - ip_link: name=eth0.1 state=absent
Sergey
Ну блин. Ты же сам примеры привёл, в которых одна сущность - железный интерфейс, вторая - виртуальный.
George
Ну, я не уверен, что в этом месте надо их различать. Всё, кроме present/absent для виртуальных интерфейсов ровно так же применимо, как и для физических.
George
Полез за контр-примерами. Есть rmnet, который ethernet и физический интерфейс, но который можно создать и удалить. ip link add link DEVICE name NAME type rmnet mux_id MUXID
Sergey
Полез за контр-примерами. Есть rmnet, который ethernet и физический интерфейс, но который можно создать и удалить. ip link add link DEVICE name NAME type rmnet mux_id MUXID
Ну это ж всё из предметной области. Ты разбирлася - тебе и решать 😊 А я пока обкатаю свой универсальный склейщик словарей/списков 😊
George
За required_together и т.д. - большое спасибо.