Timur
get_url?
kbks
артифакты - обычные zip архивы
Timur
Он сам умеет чексумму сравнивать у таргета и source
kbks
я видел там параметр checksum, но не совсем понимаю как его применить при сравнении
Andrey
Timur
Дальше все нужное уже сам модуль сделает, обеспечивая идемпотентность
Timur
Только force: true нужно будет поставить в модуле
Timur
Timur
Достаточно просто в модуле указать линки на sha1 и указать нужный параметр модуля
Timur
И все
Timur
Никаких stat и всего прочего не нужно
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
Модуль сам сверит чексуммы и не будет скачивать, если они совпадают
Konstantin
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.
Оба меня не очень радуют.
Как бы мне это противоречие разрешить?
Sergey
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).
Lamobot
У меня странный вопрос. Я пишу модуль 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.
Оба меня не очень радуют.
Как бы мне это противоречие разрешить?
ИМХО чтобы создать veth1, нужно так и указать veth1, а не додумывать, чего там хочется запускающему при наборе ключей.
Соответственно, если eth1 нет, то выдавать ошибку, или каким-то еще ключиком задавать чтобы при отсутствии интерфейса создавать виртуальный.
Sergey
George
@Lambot, ты не понял проблемы. Я могу сделать линк с типом veth (и назвать его eth0), но пользователь будет несколько растерян, потому что он ожидал, что ему железный eth0 поднимут. (т.е. так делать не надо).
Sergey
Sergey
Забираешь свободу стрелять в ногу?
Lamobot
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
Я не хочу догадываться за пользователя, я хочу интерфейс, который не вызывает неоднозначностей. Мой вопрос в том, какой вариант лучше.
Lamobot
George
type=ethernet смысла не имеет, потому что невозможно сделать state=present type=ethernet если его в системе нет.
George
(или я что-то в ip link не знаю)
George
Главная проблема с state=present в том, что ошибка "нужен ещё и параметр type" будет только в runtime, потому что ansible не даёт зависимых параметров в описании параметров модуля. Там можно только type указать, required и choice.
Alexander
ну конечно )
Konstantin
понятно) тоже терзают сомнения нужно ли в сеть лазить массово, но ACL есть идентичные на железках и хочется их поддерживать в актуальном состоянии
Sergey
George
Офигеть, спасибо.
George
А что этого нет в https://docs.ansible.com/ansible/latest/dev_guide/developing_program_flow_modules.html#argument-spec ?
George
required_if - как раз оно.
Sergey
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, то должна быть вся информация, чтобы его (интерфейс) создать.
Sergey
George
контрпримеры: systemd: name=service, masked=true daemon_reload=true, apt: update_cache=true
George
Cущность одна, действий над ней (чтобы сделать желаемый state) несколько.
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
George
За required_together и т.д. - большое спасибо.