Ответ на пост «Что-то легко хотите жить»107
Вспомнилась история с бывшей работы.
В общем, компы в организации были все на линуксе. Сотрудникам, привыкшим к Винде, было, мягко скажем, неудобно. Но спорить никто не спорил: Линукс - СПО, винда - нет, пиратку не поставишь (там с этим прям очень строго было).. В общем, нравится-не нравится, но раз так положено - работали на линуксе.
Но. Если какой сбой в компе или глюк, что-то непонятно - звали ГИПа или сисадмина, так как только эти двое понимали во всех настройках и т.п.
Так вот. ГИП любил задания давать, чтобы делали быстро. Нет, даже не так. Чтобы БСТР!
Итак, очередное задание от ГИПа, чтобы БСТР! было сделано, комп как назло начинает показывать характер, зову ГИПа. Он сидит, копается, я жду, и между делом говорю - "А нельзя просто "Ctrl+Alt+Del" и процессы поснимать?", на что ГИП даёт офигенный ответ:
- А вы привыкли в своей Винде легко тремя клавишами решать! Здесь я вам не дам быстро и просто делать, вы здесь РАБОТАТЬ должны!
Через некоторое время комп налаживает, уходит, почти сразу вызвает в кабинет:
- Ну что, сделал?
Я говорю - когда? За 15 минут? Он такой:
- Я в обед задание дал!
- Вы сами же 40 минут комп мне налаживали.
- Надо было БСТР! сделать!
И тут я и говорю:
- Знаете, что? Тут ПОРАБОТАТЬ надо, а само собой быстро не получится!
Разворачиваюсь и ухожу.
Понимаю, что такая хрень будет продолжаться постоянно, поэтому купил себе ноутбук. Сижу на работе с ноутом, всё работает шустро, настроено удобно..
В конце дня ГИП обратил внимание, что я его БСТРые задания выполняю быстрее, чем по плану. Заходит ко мне в кабинет, видит ноут.
- Ух ты, можно глянуть?
- Смотрите.
- Крутая машина!
- Ага, я вот на нём теперь всё успеваю.
- А ДАВАЙ НА НЕГО ЛИНУКС ПОСТАВИМ?
Ну вот любил человек и других затрахать, и сам затрахаться...
Бюджетная видеокарта для нейросетей
Люди, порекомендуйте бюджетную видеокарту для обучения нейросетей в Москве! Пожалуйста! Мне нужно для дообучения нейросеток из готовых программ (nnU-Net), да и просто сам хочу учить сетки. В том числе в дороге, где у меня плохо с интернетом. Kaggle и Colab, конечно, здорово, но интуиция подсказывает, что личная карточка лишней не будет. Нужно ли для этого покупать ПК (я с ноута работаю)? Буду рад альтернативным предложениям.
P.S.: могу выделить до 250 килорублей на всё сопутствующее оборудование.
Microsoft AD, ADFS, Azure Entra, LDAP, Samba, SMB, x500, Kerberos, Keycloak, и другие страшные слова. Часть 1. Историческая
Для лиги лени: что-то старое
Ответчик был построен, чтобы действовать столько, сколько необходимо, - что очень большой срок для одних и совсем ерунда для других. Но для Ответчика этого было вполне достаточно.
Answerer was built to last as long as was necessary—which was quite long, as some races judge time, and not long at all, according to others. But to Answerer, it was just long enough.
Пришли ко мне коллеги ,со словами: вот ты Григорий, такой большой(Да!!!) ―...такой толстый... (―Да!!!) Уместился в этом крохотном кувшине расскажи нам на ночь сказку, почему у нас чего-то там не работает в k8s. Ответ оказался очевиден - потому что вы бы сначала думали, что делаете, а не читали какие-то помойки от минцифры с маркетингово – рекламным кг\ам, по исторической памяти считающийся «сайтом про ИТ». Ну да ладно, бывает.
Однако в процессе обсуждения оказалось, что я чего-то уже стал подзабывать, откуда есть пошла Microsoft Entra ID (formerly Azure AD) и как это работало «тогда».
A long time ago или Исторический очерк и немного словаря
Если бы вы вдруг оказались .. в РФ 30 лет назад, в 1995 году, и пошли в ИТ, то обнаружили бы .. разное. В домашнем сегменте медленно и долго умирает Z80 и Amiga / Commodore.
Уже вышел первый intel Pentium 1993, и только что вышел (в ноябре 1995) Pentium Pro.
На рынке домашнего программного обеспечения существует, в основном, MS Dos и варианты на тему (например IBM PC DOS). Windows 3.1 и 3.11 существуют, но особой популярностью не пользуются. Потому что на 286\386 тормозит и не нужно.
Вышедшая 24 августа 1995 Windows 95 еще не шла ни в какие массы, потому что поставлялась или на очень не часто встречаемых тогда «дома» cd приводах, или на 13 дискетах. Так что Dos, или Windows 3.1 - 3.11 . Если вам было совсем нечего делать, существовала OS\2 (какой-то редакции) и Windows NT 3.51.
В среднем бизнес сегменте живет Novell и ее NetWare 4, вместе с NetWare Directory Services.
В тогдашнем корпоративном сегменте живет и не кашляет Unix в разных вариантах. Если вам нечем заняться, то уже вышли BSD и FreeBSD, и их смотрят, и даже применяют.
Linux? Он, как бы, есть, уже даже есть Debian и SUSE. Но он находится в таком, странноватом положении. Существовать он существует, как операционная система, как тот же MINIX, но на этом и все. Проблема не в том, что он есть, или его нет, а в том, что под него еще нет готового работающего программного обеспечения. Надо или все пересобирать, или искать собранное и чтобы работало. Драйвера под что-то в нем есть, но скорее или нет, или кривые.
Wine теоретически уже есть, а практически заработает только в 1996 (January 1996: Word and Excel reported to run).
Есть еще NeXTSTEP, Mac OS 7, и еще масса всякого.
Но где искать "всякое"?
Интернет .. интернет тогда уже, конечно, есть. Но в России массово никакого интернета, конечно, нет. Да и в мире его немного. Почему? Потому что:
В 1995 году «минимальный современный» компьютер, то есть Intel или AMD 486, с монитором, диском (мегабайт на 500), стоит примерно 1000$.
За 1995 год курс доллара к российскому рублю вырос на 1 017,00 руб. за $1. Максимальная стоимость доллара за год была зафиксирована в начале мая и равнялась 5 130,00 руб., а минимальная — в начале января и составляла 3 623,00 руб.
То есть 486й компьютер стоит 3-5 миллионов рублей.
Средняя заработная плата по РФ в январе 1995 – 302.642, в ноябре 1995 – 615.656 рублей.
То есть x86 стоит 10-20 месячных зарплат. Много ли людей могли себе позволить ПЭВМ? Вопрос риторический.
Институт «Открытое общество» Сороса, которого сейчас обвиняют во всех грехах, в 1995-1996 годах только начал вкладывать в развитие 33 интернет-центров по всей стране, в учебные материалы, и так далее. Но в 1995 году ни про какой массовый интернет в России еще речь не идет. В 1996 году уже идет. Нет сколько-то массового интернета, значит документацию и учебники еще придется поискать. Для Москвы, конечно, все гораздо проще - есть горбушка, есть фидо. За пределами Москвы интернет есть у РЖД, и очень, очень местами.
До WinNuke (1997) и Ultima Online (1997) еще два года, до Win95.CIH (1998) и Lineage (1998) – три.
В малых и средних сетях, они уже есть, царит NetWare Directory Services.
NTDS (Windows NT Directory Services) уже существует, и даже где-то используется, но NetWare настолько вне конкуренции, что даже говорить особо не о чем.
И где-то в эти годы возникает LDAP.
Что такое LDAP ?
Придется опять пойти в историю. В 1988 году в Telecommunication Standardization Sector of the International Telecommunication Union (ITU-T) , он же Сектор стандартизации электросвязи Международного союза электросвязи, МСЭ-Т, была принята группа стандартов X.500.
В группу стандартов X.500 были включены протоколы – X.501, X.509 и так далее.
Что они пописывали и как, желающие могут почитать самостоятельно.
В марте 1995 выходит RFC 1777 Lightweight Directory Access Protocol.
The protocol described in this document is designed to provide access to the X.500 Directory while not incurring the resource requirements of the Directory Access Protocol (DAP). This protocol is specifically targeted at simple management applications and browser applications that provide simple read/write interactive access to the X.500 Directory, and is intended to be a complement to the DAP itself.
Попутно желающие могут изучить Howes, T., Kille, S., Yeong, W., and C. Robbins, "Lightweight Directory Access Protocol", RFC 1488, University of Michigan, ISODE Consortium, Performance Systems International, NeXor Ltd., July 1993 - The X.500 String Representation of Standard Attribute Syntaxes
Как легко догадаться, что, поскольку X.500 (семейство) и LDAP, это протоколы, описанные в соответствующих стандартах, то применение этих протоколов в каких-то коммерческих продуктах вопрос только времени. Под какой операционной системой будут работать эти продукты - не так важно.
27.02.1997 Для администраторов, нуждающихся в возможности централизованного управления несколькими платформами служб каталогов с помощью единого интерфейса, Lightweight Directory Access Protocol (LDAP) - весьма многообещающая технология. Можно считать, что Novell LDAP Services for NDS 1.0, первый продукт, интегрирующий протокол со службами каталогов, - это весьма неплохое начало, хотя для реализации его полного потенциала необходим LDAP 3.0.
Computerworld Россия 1997 № 08 "Изящное украшение" для Novell NetWare NDS
Можно ли было по протоколу LDAP работать с какими-то еще сервисами, кроме NDS \ Novell eDirectory? Наверное, можно.
Были ли «тогда» какие-то реализации служб каталогов под Unix ? Википедия говорит про Banyan VINES, значит были.
Было ли что-то еще ? Был Windows NT Directory Services (NTDS), от него остались протоколы семейства LanManager - NTLMv1 / NTLMv2. Времена NetBEUI, IPX, вот это все. Battle.net будет запущен только 31 декабря 1996
19.02.1998 Технологические новшества Banyan Vines 8.0 вряд ли способны удивить пользователей, но данная версия очень важна для компании Banyan Systems, поскольку демонстрирует всему миру, что Banyan не собирается отказываться от Vines.
Средства StreetTalk Directory Assistance предоставляют возможность версии Vines 8.0, вышедшей в конце декабря, взаимодействовать с протоколом Lightweight Directory Access Protocol (LDAP).
"Протокол LDAP поддерживается только технологией StreetTalk для Windows NT, однако сетевые службы позволяют извлекать информацию также из сетей Vines или других систем Windows NT", - пояснил менеджер Banyan по корпоративным сетевым продуктам Шон Хейес.
Computerworld Россия 1998 № 07 Banyan остается верна Vines
В следующей части
NTLMv1 и Kerberos, SMB и Samba – протоколы и сервисы.
389 Directory Server (он же Fedora Directory Server, он же Redhat Directory Server).
Stay tuned!
Литература
Windows™ Programs on Linux (WINE and its History)
«Computerworld Россия» выпуск №12, 1996 содержание
RFC 1777 Lightweight Directory Access Protocol.
starcraft and networking in the 90s (part 1)
Computerworld Россия 1997 № 08 "Изящное украшение" для Novell NetWare NDS
Computerworld Россия 1998 № 07 Banyan остается верна Vines
Первый отечественный домен верхнего уровня .su (ответ DeepSeek)
Моë мнение о последних годах:
К сожалению, в 2020 году научные конференции, мягко говоря, не очень быстро перешли в онлайн-формат!
Первый отечественный домен верхнего уровня .su (Soviet Union) был зарегистрирован 19 сентября 1990 года Советской ассоциацией пользователей UNIX (SUUG — Soviet UNIX User's Group). Заявку в международную базу данных InterNIC подавал руководитель одной из бригад кооператива «Демос» Вадим Антонов, а непосредственную запись в DNS выполнял студент Университета Хельсинки Петри Ойала.
🌐 Контекст регистрации и дальнейшая судьба домена
· Предыстория: Регистрация стала возможной после того, как 28 августа 1990 года была установлена первая телекоммуникационная свясь между СССР и Финляндией, положившая начало сети «РЕЛКОМ».
· Первые сайты: Первым сайтом в зоне .su стал ресурс отделения математики Российской академии наук — ipsun.ac.msc.su.
· Дальнейшая судьба: Несмотря на распад СССР в 1991 году, доменная зона .su не была ликвидирована. В 1993 году администрирование доменом перешло к Российскому НИИ развития общественных сетей (РосНИИРОС). После появления в 1994 году домена .ru регистрация в зоне .su была заморожена, но позже, в 2002-2003 годах, снова открыта для всех желающих.
Windows 10: конец поддержки
Вот и наступил тот день, когда «Десятка» закончила обновляться. Сборки менялись сначала каждые полгода, а затем только раз в год. Последней была сборка 22H2. Кто-то её называет легендарной, хотя, думаю, до «Семёрки» или «XP» ей далеко. Платная поддержка продолжится для корпоративных клиентов, и, как водится в России, эти файлы обновлений, скорее всего, будут взяты на левых ресурсах и безвозмездно передадутся всем желающим, так что отчаиваться не стоит.
Windows 11 — единственная оставшаяся актуальная система зашла не всем, поэтому большинство останется на «Десятке». Есть, конечно, вариант перехода на Linux (в т.ч. отечественные дистрибутивы Astra, Alt, Роса, Кобальт), но мало прикладного ПО поддерживается, да и заменители MS Office оставляют желать лучшего.
А я тут live дистрибутив собираю, CephOS
Приветствую! :)
Зовут меня Sheridan и я алкоголик гентушник. 0x14 лет уже в emerge медитирую. А кнопки нажимаю и того больше.
Захотелось мне домой NAS. Хорошая штука, удобная. Да только вот ничего меня из того, что есть, не устраивало. А потом я узнал про распределённые ФС. А потом узнал про ceph (кстати, советую почитать это - неплохо для понимания что такое ceph). И захотел себе этот самый ceph домой. Не спрашивайте - зачем. Потому что могу :)
Долго ли коротко я эту хотелку в себе носил, да только вот недавно обломились мне несколько корпусов серверных. И железо дома накопилось разное. Решил, что пора действовать. Ну, железо в кучу собрать да от пыли почистить недолго, а вот ceph развернуть там-же - жалко диски то. Это ж целых как минимум два диска надо в btrfs raid положить, чтобы / там себя чувствовало нормально и у меня голова не болела на тему "А что если диск всё? Переустанавливать?".
И вспомнил я тут про SmartOS. А что, удобно! Грузимся с флешки а все диски гипервизору отдаём и радуемся. Поискал такое про ceph и не нашёл. Штош, думаю, зря я с железа компрессором пыль сдувал? Надо писать.
Ну, и, собственно, вот: CephOS. Уже 0.0.6beta, почти релиз. Обкатываю как раз на железе, ищу слабые стороны.
Идея такая:
Загружаем с флешек несколько хостов
Выполняем на каждом несколько команд
...
PROFIT!
Взял я в руки дебьяновый live-build и полез в него встраивать ceph. И скриптами обмазывать. И метриками обкладывать. Куда-ж без метрик то?
И вот что в итоге получилось:
Live дистрибутив, предназначенный для поднятия кластера ceph
Дистрибутив умеет в persistence (настройки/изменения в / будут храниться на другом разделе/устройстве)
Про ceph можно ничего не знать
Можно просто выключить ноду и хранилище не пострадает
Можно добавить дисков, хостов и хранилище просто увеличится.
Можно удалять из хранилища диски и хосты
Метрики, метрики, мои любимые метрики :) От node_exporter до smatrctl_exporter. К тому же есть специальный helper-генератор конфига для prometheus, чтобы не приходилось врукопашную все эти хосты подключать.
Для более лёгкого подключения есть специальный скрипт, который складывает всё нужное в архив. Этот архив потом нужно забрать на хост клиента, разложить оттуда всё по местам, выбрать и установить нужный вариант монтирования. Ну, в смысле можно руками, можно в fstab, а можно и systemd юнитами монтировать.
Можно управлять сжатием CephFS
Ну и никто не отнимает стандартный ceph cli, ежели надо чтото сделать, что скриптами ещё не обмазано. Или написать ишью в github проекта - вполне возможно, что обмажу :)
Debian bookworm, Ceph squid
Да, флешки менее надёжны, чем hdd. Но флешки категорически дешевле. Да, флешки медленнее hdd. Но это не сильно то и надо в контексте CephOS. Вдобавок live-build поддерживает persistent разделы - то есть можно условный /var/lib/ceph положить на отдельный ssd и оно ещё до загрузки основной системы примонтируется куда надо. Флешка ушла к тёмным магистрам? Ну и дырку на ней в небе, мы с другой загрузимся и заново подключим ноду к хранилищу. Удобно!
Ориентирован CephOS на soho сегмент, где особо не нужны высокие скорости и сверхвысокая надёжность. То есть можно поднять вообще на хламе. То есть не надо это сравнивать с промышленными Ceph кластерами на десятки хостов (хотя ничего не мешает и на CephOS это поднять). А для дома, я считаю, самое то, если завалялось штуки три комплекта старого железа :)
Как? Скачиваем cephos_installer_0.0.6beta.run, записываем несколько флешек, втыкаем флешки в хосты, выполняем на хостах несколько команд, генерируем и забираем архив со всем необходимым для монтирования, монтируем, пользуемся. Всё :)
А ежели поподробнее интересно, то вот тут моя шпаргалка по подъёмы CephOS в виртуалках и на железном полигоне
И мне нужна ваша помощь.
Если у кого есть возможность - протестируйте пожалуйста. Баги/вопросы/пожелания/проклятия в ишью забрасывайте. А если вы с ceph работаете, то я бы очень хотел от вас советов полезных. Мои то два глаза ещё зоркие вроде, но это глаза автора. А нужны глаза пользователей :)
Спасибо, что прочитали эту простыню :)
Ansible для детского сада. Часть 6. Пока что не СУБД для Linux Server Update Services (LSUS)
А за скрюченной рекой
В скрюченном домишке
Жили летом и зимой
Скрюченные мышки.
Корней Чуковский. Скрюченная песня
У меня постоянное ощущение того, что я описываю не велосипед с костылями, а велосипед, который давно изобретен, на котором все катались лет 15 назад, если не 20. Что-то типа «введение в линукс и все вокруг для 10 класса». Что на информатике учат.
Поскольку этот текст пишется 50\50 – половина сделана еще осенью 2024, а половину я переделываю в ходе самообучения, и когда время и желание есть, то не удивляйтесь, что в тексте попадаются странные решения.
Для лиги лени: много примеров, как делать не надо, и как точно не работает
Ansible для детского сада в скольки то частях. Часть 1.Про все сразу
Ansible для детского сада в скольки то частях. Часть 2. Костылируем жалкое подобие WSUS - Linux Server Update Services (LSUS)
Ansible для детского сада. Часть 3. Настраиваем подобие безопасности и все остальное
Подготовка Git
Ansible для детского сада. Часть 4. Первичная настройка конечного клиента
4.1 Теоретически все просто
4.2 Сначала готовим открытую часть сертификата без пароля через Putty в Windows и еще раз вспоминаем что генерирует Putty в Windows, а что нужно в ssh
4.3 Детский скрипт, и как не надо делать
4.4 Отлаживаем SSH, снова и опять
4.5 Проблемы с переносом строки и не только
4.6 Проверяем, что получилось
4.7 Почти переходим к второму Ansible плейбуку
4.8 Воюем с пробелами в Anisble и восстанавливаем пример из первой статьи
4.9 Возвращаемся к основной задаче
Ansible для детского сада в скольки то частях. Часть 5. Приделываем костыли
5.1 Теоретическое обоснование костылей, или «зачем».
5.2 Выбор dataflow
5.3 Собираем Ansible facts без плейбука
5.4 Разбираем полученную выгрузку
Ansible для детского сада. Часть 6. Пока что не СУБД для Linux Server Update Services (LSUS)
6.1 Введение
6.2 Еще раз про готовые решения – Spacewalk, Satellite, Foreman + katello, Rudder
6.3 Переходим к проектированию на минималках
6.4 Начинаем писать код
6.4 Начинаем писать код или Powershell класс в классе. Часть 1
6.5 Продолжаем писать код или Powershell класс в классе. Часть 2
Ansible для детского сада. Часть 7, опять не связанная с Ansible
Ansible для детского сада. Часть 8. Теперь костыльная БД для Linux Server Update Services (LSUS)
Ansible для детского сада. Часть 6. Пока что не СУБД для Linux Server Update Services (LSUS)
Все, что мне было надо, я писал во второй части –
С целевой структурой данных ситуация сложнее. Для своего предпоследнего пет проекта под похожие задачи я просто развернул базу данных (Postgre), и туда клал разное. Нужно ли на первом шаге такое решение? Не знаю, мне не нужно, мне и бинарной таблицы хватит. Но что туда класть? Очевидно, туда должны попасть: FQDN, IP, дистрибутив, версия дистрибутива, ядро сейчас, последние дата и время доступности, аптайм. Должно ли туда попадать предыдущее состояние объекта, и какие-то еще настройки? Не очень важно, всегда можно расширить схему данных, добавить к объекту еще пару свойств.
И вот тут самое время подумать. Что я хочу от системы, какую задачу она решает. И как хранит данные для этого, и как глубоко.
Какие технические данные хранить уже понятно, с чем сравнивать, в общем, тоже.
6.2 Еще раз про готовые решения – Spacewalk, Satellite, Foreman + katello, Rudder
Повторю из второй части
У Microsoft был Baseline Security Analyzer
У Microsoft есть Security Compliance Toolkit (SCT)
У Microsoft есть Azure Update Manager operation(AUM).
В опенсорсе был Spacewalk. Последний релиз - 2.10 / March 18, 2020
У RH был Satellite. Это Foreman + katello+ support. Foreman 3.16 and Katello 4.18
Ivanti Patch for Endpoint Manager ? Ага:
Release Date September 18, 2025 The U.S. Cybersecurity and Infrastructure Security Agency (CISA) has published an analysis of the malware deployed in attacks exploiting vulnerabilities affecting Ivanti Endpoint Manager Mobile (EPMM). The Cybersecurity and Infrastructure Security Agency (CISA) obtained two sets of malware from an organization compromised by cyber threat actors exploiting CVE-2025-4427 and CVE-2025-4428 in Ivanti Endpoint Manager Mobile (Ivanti EPMM). Each set contains loaders for malicious listeners that enable cyber threat actors to run arbitrary code on the compromised server. Malicious Listener for Ivanti Endpoint Mobile Management Systems
Rudder ? Ничего про него не знаю.
Вопрос в сложности развертывания, это совсем не WSUS с его далее – далее - готово – пропишите WSUS в GPO
6.3 Переходим к проектированию на минималках
Функциональные требования: что делает этот софт – понятно, структурирует информацию про то, что надо обновить. Но, кстати, в таком случае нужно еще поле «пометки для объекта, почему не обновлено», и это уже точно нужно вести в CMDB (Configuration Management Database).
Не функциональные требования: как он это хранит.
И дальше UI \ UX.
Для начала, нужен уникальный идентификатор объекта.
В Windows это Machine ID, в Linux /etc/machine-id. Кроме этого, скорее всего, у сервера будет уникальный MAC или, для Cloud init, MAC останется, но со своими особенностями.
Что касается «истории состояния», то можно долго думать, читать про всякие 36 нормальных форм, Кимбалла, Data Vaul и вот это все.
Или можно зарезервировать строки данных:
Состояние00 «состояние сейчас»
Состояние01 «состояние при предыдущем опросе, вне зависимости от даты»
Состояние24 «состояние сутки назад»
Состояние168 «состояние неделю назад»
Состояние720 «состояние месяц назад»
Это позволяет организовать простую логику «было – стало» и перемещать данные по цепочке и до заполнения таблицы или таблиц. Вторая и третья нормальные формы SQL, вот это все.
На этом этапе и начинается разделение между «держим в каждом объекте 5 лишних групп, зато это один простой массив» и «держим данные в связанных таблицах с одним первичным ключом, зато модно стильно SQL».
Или, можно немного упороться, и сделать объект из 5 объектов, то есть 3 мерную таблицу.
Это, с одной стороны, штатный и понятный (мне) механизм, с другой снимает требование по заведению SQL.
Получаемый объект будет в формате:
Сервер.Состояние00.Параметр01
Сервер.Состояние01. Параметр01
и так далее.
Давайте пробовать.
То есть, с точки зрения «вспомнить как Python работает с модулем psycopg2 и СУБД» полезнее сделать с базой данных, с точки зрения скорости \ удобства сейчас – проще сделать класс и класс из классов. Так что перенесу задачу «по базе данных» на часть 7.
Пока писал текст, понял что задача «хранение данных в базе» все равно требует считывания данных в какой-то объект или группу объектов, как-то с этим всем все равно потом работать.
Переусложнение не нужно.
Логика первичного заполнения
В первый момент времени не заполнено ничего. Поэтому при каждом запуске придется выполнять пре-проверку.
Получить сегодняшнее число, считать Data00 и выбрать Data00.timestamp
Взять Data00.timestamp. Если Null, то заполнить текущим временем и данными.
Можно прописать везде 01.01.1970 (Unix Epoch) при первом запуске и проверять, что там. Это гораздо проще сравнивать при следующих шагах.
Дальше в чем-то проще.
Взять текущую дату. Сравнить с датой в Data01. Если данным в Data01 больше 24 часов, то переместить их в Data24. Ну или как-то так. Можно наоборот – посмотреть данные в Состояние720 и Состояние168, сравнить с текущей отметкой времени, переместить.
На этом месте я понял, что было два пути:
1. Более правильный в сложных системах: планировать еще пару дней, нарисовать схему движения данных, итд. Возможно, сделать схему более гибкой.
2. Начать писать код, и поправить все что нужно, по мере необходимости. В том числе, расширить схему объекта, если надо.
6.4 Начинаем писать код или Powershell класс в классе.Часть 1
Почему Powershell, а не питон ? Да потому, что часть из этого кода пишется для людей, которые Powershell читать и использовать еще могут, а питон уже сложно, сложно ничего не понятно.
В таких статьях всегда есть соблазн «просто взять и скопипастить уже готовое» или «взять и сделать через AI». AI я использую, но не очень люблю. Даже не смотря на то, что Copilot очень нравится и коллегам, и мне.
Поэтому будет, как обычно, много примеров «неправильно» или «непонятно».
Всегда есть соблазн написать сразу итоговое «хорошо». На мой взгляд, надо писать и пример «вот так плохо, потому что».
Как я писал раньше, вот так, разумеется, работать будет:
Class AnsibleFacts01{
[string]$IsSUCCESS
[string]$FQDN
[string]$IP
[string]$Ansible_kernel_version
[string]$Comment}$NewHost1 = [AnsibleFacts01]::new()
$NewHost1.Comment = "123"
$NewHost1
И даже вот так система сработает без ошибок:
Class AnsibleFactsForData{[AnsibleFacts01]$Data00
[AnsibleFacts01]$Data01}
$NewHost2 = [AnsibleFactsForData]::new()
Но уже на этапе
$NewHost2.Data00.Comment = "123"
система скажет
The property 'Comment' cannot be found on this object.
Почему? Потому. Overloading constructors, вот это все по руководству Petri PowerShell Classes – Your Ultimate Guide
Поэтому что? Поэтому есть три пути. Webcam, дальше вы знаете.
Путь первый. Конструктор и инициализация.
Для начала перепишу первый класс, а точнее скопирую пример из Using other classes with a class in Powershell
class SomeOtherClass {
[string] $Status
[string] $ReasonSomeOtherClass () { }
SomeOtherClass ([string] $Status, [string] $Reason) {
$this.Status = $Status
$this.Reason = $Reason }}class SomeClass {
[string] $Server
[string] $File
[SomeOtherClass] $OtherClass
SomeMasterClass () { }
SomeMasterClass ([string] $Server, [string] $File, [SomeOtherClass] $Class) {
$this.Server = $Server
$this.File = $File
$this.OtherClass = $Class}}
Но к такому примеру нужна инициализация: (там же)
$testing = [SomeClass]@{
Server = 'Server01'
File = 'SomeFile'
OtherClass = [SomeOtherClass]@{
Status = 'OK!'
Reason = 'Idk' }}
В моем примере (выше) это будет выглядеть как:
Class AnsibleFactsForData01{
[AnsibleFacts01]$Data00
[AnsibleFacts01]$Data01}$NewHost1 = [AnsibleFactsForData01]::new()
$NewHost1.Data00 = [AnsibleFacts01]@{Comment = '456'}
Посмотрю что получилось:
$NewHost1.Data00
Поменяю значение и еще раз посмотрю что получилось:
$NewHost1.Data00.Comment = '6'
$NewHost1.Data00
Вот такая вот история. Хотите, не хотите, а будьте добры инициализировать, а после этого уже как хотите.
Путь второй, тоже не очень
Class AnsibleFactsForData02{
[AnsibleFacts01]$Data00
[AnsibleFacts01]$Data01
# AnsibleFactsForData02 () { } Ввиду тупости, я не понимаю зачем эта строка, поэтому ее закомментировал.
AnsibleFactsForData02 () {
$this.Data00 = [AnsibleFacts01]::new()}}$NewHost02 = [AnsibleFactsForData02]::new()
$NewHost02.Data00.Comment = '12'
Проверим что вышло:
$NewHost02.Data00
Выглядит, что все работает.
Теперь проверим:
$NewHost02.Data01.Comment = '34'
И, конечно, так не работает.
Потому что внутри AnsibleFactsForData02 я потрогал только $this.Data00, и не потрогал $this.Data01
Раз я его не потрогал, то под него не выделилась память, и все такое. Но у меня есть оправдание, когда в школе люди учили typedef struct, constructor и прочие ~className (Destructors), я прогуливал.
Тут должен быть третий путь, но я его не придумал.
Но в моем примере можно вместо класса с классами внутри использовать простой массив классов, только придется запомнить, что [0] это сейчас, [1] это в прошлый раз, итд.
Осталось записать это в файл.
6.5 Продолжаем писать код или Powershell класс в классе. Часть 2
Упрощаем и отрезаем. Получаем:
Class Ans_F{ # AnsibleFacts
[string]$IsSUCCESS
[string]$FQDN
[string]$IP
[string]$Ansible_kernel_version
[string]$Comment}Class A4D { #AnsibleFactsForData
[Ans_F]$D00
[Ans_F]$D01
[Ans_F]$D24 # «состояние сутки назад»
[Ans_F]$D168 # «состояние неделю назад»
[Ans_F]$D720 # «состояние месяц назад»
# AnsibleFactsForData02 () { } не понимаю зачем эта строка, поэтому закомментировал.
A4D () {
$this.D00 = [Ans_F]::new()
$this.D01 = [Ans_F]::new()
$this.D24 = [Ans_F]::new()
$this.D168 = [Ans_F]::new()
$this.D720 = [Ans_F]::new() }}
$NewHost02 = [A4D]::new()
$NewHost02.D00.Comment = '12'
$NewHost02.D01.Comment = '34'
$NewHost02.D00$NewHost03 = [A4D]::new()
$NewHost03.D168.Comment = '56'$HostList = @()
$HostList += $NewHost02
$HostList += $NewHost03
$ScriptPath = $PSScriptRoot
$OutFileName = 'Ansible2.xml'
$OutFullName = $ScriptPath + "\" + $OutFileName
Export-Clixml -Path $OutFullName -InputObject $HostList$HostListExport = Import-Clixml -Path $OutFullName
$HostListExport[1].D168.Comment
Есть минус, про Select при выборе формата – можно забыть.


