Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Оплата
Новости
Доставка
Загрузки
Форум
Настройка
    info@proxmox.su
    +7 (495) 320-70-49
    Заказать звонок
    Аспро: ЛайтШоп
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Аспро: ЛайтШоп
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Аспро: ЛайтШоп
    Телефоны
    +7 (495) 320-70-49
    Заказать звонок
    0
    0
    0
    Аспро: ЛайтШоп
    • +7 (495) 320-70-49
      • Назад
      • Телефоны
      • +7 (495) 320-70-49
      • Заказать звонок
    • info@proxmox.su
    • Москва, Бакунинская улица, 69с1
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    Proxmox Виртуальная Среда
    API для управления репозиториями apt кажется бессвязным.

    Форумы: Proxmox Виртуальная Среда, Proxmox Backup Server, Proxmox Mail Gateway, Proxmox Datacenter Manager
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    API для управления репозиториями apt кажется бессвязным., Proxmox Виртуальная Среда
     
    mikeely
    Guest
    #1
    0
    28.04.2025 20:58:00
    Предположим, я хочу включить/выключить репозиторий "test" через API, судя по документации здесь, это должно быть или, на самом деле, возможно: https://pve.proxmox.com/pve-docs/api-viewer/#/nodes/ {node}/apt/repositories. Но вот загвоздка: требуемые параметры — index, node, path. Давайте посмотрим на вывод `get /nodes/$(hostname -s)/apt/repositories` на секунду:

    JSON: {
     "files": [
       {
         "path": "/etc/apt/sources.list",
         "repositories": [
           {...},
           {
             "description": "This is the recommended repository for testing and non-production use. Its packages are not as heavily tested and validated as the production ready enterp
    rise repository. You don't need a subscription key to access this repository.",
             "handle": "no-subscription",
             "name": "No-Subscription",
             "status": 1
           },
           {
             "description": "This repository contains the latest packages and is primarily used for test labs and by developers to test new features.",
             "handle": "test",
             "name": "Test",
             "status": 1
           },
           {...}
         ]
       },
       ...
     ],
     "infos": [
       {"index": 0, "path": "/etc/apt/sources.list"},
       {"index": 1, "path": "/etc/apt/sources.list"},
       ...
     ]
    }

    Проблема в том, что нет прямого соответствия между index, который обязателен, и фактическим репозиторием, который нужно включить/выключить. Лучшее, что я смог придумать, — это посчитать количество записей под files/repositories и затем использовать это значение, чтобы получить index, используя files/path и index/path как соединение. Я что-то упускаю, или это ошибка проектирования?
     
     
     
    guruevi
    Guest
    #2
    0
    28.04.2025 21:10:00
    Почему у тебя все репозитории в одном файле? Обычно репозитории PVE перечисляются по отдельности в каталоге sources.list.d, а репозитории Debian — только в sources.list. Тогда ты можешь удалять/переименовывать отдельные файлы, чтобы отключать/включать репозитории.
     
     
     
    mikeely
    Guest
    #3
    0
    28.04.2025 22:05:00
    Вот как они появились, когда система была построена. В любом случае API всё ещё нуждается в том, чтобы предоставить какую-то привязку между индексом и репозиторием.
     
     
     
    guruevi
    Guest
    #4
    0
    29.04.2025 00:28:00
    Но репозитории — это дети объекта файлов. Так что, когда ты знаешь, какой файл нужно изменить, ты можешь просто перебирать объект, начиная с 0, и ты знаешь связанный индекс, когда находишь подходящий параметр. Причина, по которой это нелегко, в том, что структура файла репозитория apt не была разработана для машинной обработки. Хотя я предполагаю, что ты просто хочешь запрограммировать желаемое состояние (например, как это делает Ansible), в этом случае просто напиши, как ты хочешь, чтобы выглядела твоя конфигурация, убери всё, что отклоняется от этого, и тогда ты всегда будешь знать, например, что корпоративный репозиторий находится в `/etc/apt/sources.list.d/pve-enterprise.repo` с индексом 0. Это будет упрощено с помощью этого, что можно технически использовать и сегодня: https://repolib.readthedocs.io/en/latest/deb822-format.html — не уверен, как API обрабатывает это.
     
     
     
    mikeely
    Guest
    #5
    0
    29.04.2025 00:58:00
    Конечно, управлять apt-репозиториями с помощью ansible — это просто, но API всё ещё сконструирован неправильно, учитывая, что большой файл sources.list — очень распространённый шаблон, поэтому массив infos нужно заполнять чем-то полезнее, чем просто путь. Отступая немного назад, какой общий принцип, когда использовать стандартные административные инструменты (ansible, vim и т.д.) и когда лучше использовать API? Я думаю в частности о сетевых технологиях/SDN, хотя вопрос общий для всего хоста. Я мог бы запускать Proxmox хосты как любые другие Debian серверы, но это приведёт к тому, что Proxmox придёт к несогласованному состоянию? Довольно странно, что в community.general полно полезных ansible модулей про proxmox, но ни одного про управление самими Proxmox серверами.
     
     
     
    guruevi
    Guest
    #6
    0
    29.04.2025 02:46:00
    Мой аргумент касательно APT-репозиториев в том, что в них нет ничего уникального, что можно проиндексировать: Что бы вы сделали "индексом" этого репозитория, например (это валидный репозиторий в моем кластере), если не числовой индекс с нумерацией с нуля, потому что есть точная копия этого объекта с types=deb-src и нет, это не официальный репозиторий Debian или Proxmox, но это "валидная" конфигурация APT-репозитория. JSON: {
                       "Components": [
                           "main"
                       ],
                       "Enabled": 0,
                       "FileType": "list",
                       "Options": [
                           {
                               "Key": "signed-by",
                               "Values": [
                                   "/etc/apt/keyrings//somerepo.asc"
                               ]
                           }
                       ],
                       "Suites": [
                           "bullseye"
                       ],
                       "Types": [
                           "deb"
                       ],
                       "URIs": [
                           "http://somerepo"
                       ]
                   } В моем случае имя файла для этого репозитория известно (значит, это somerepo.list), и тогда индекс 0 — это deb, а индекс 1 — это deb-src. Управлять APT-репозиториями с помощью Ansible — не 'просто', то, что делает Ansible, — это просто генерирует репозиторий с уникальным именем файла, после чего администратор "называет" репозиторий, но можно легко получить дубликаты конфигураций репозиториев. Если вы собираетесь использовать API, я предполагаю, что вы запросите текущие репозитории, проведете какое-то соответствие желаемой конфигурации (например, я добавлю репозиторий в определенный файл в определенный индекс или с помощью regexp-выражения), и тогда ваша желаемая конфигурация будет там. Я предполагаю, что для свежей установки у вас уже все в 'правильном' состоянии. Рекомендация состоит в том, чтобы не продолжать добавлять вещи в sources.list, вам действительно следует использовать отдельные файлы репозиториев.
     
     
     
    aabraham
    Guest
    #7
    0
    30.04.2025 13:29:00
    Вот почему тебе стоит разделять твои репозитории по разным файлам. Полагаю, ты видишь один и тот же файл для разных индексов именно потому, что не разделил свои репозитории.
     
     
     
    mikeely
    Guest
    #8
    0
    30.04.2025 18:18:00
    Есть несколько способов управления репозиториями с помощью Ansible, пожалуй, самый простой — с помощью модуля copy. Возвращаясь к API, я по-прежнему настаиваю, что он подходит к решению задач с ног на голову. Посмотрите на цели проектирования раздела apt Proxmox API (по крайней мере, на то, что я могу понять из функциональности):
    1. Разбирать и возвращать любое допустимое содержимое sources.list или sources.d/*.list
    2. Создавать новые, допустимые источники apt.
    3. Включать и отключать существующие источники.

    Как бы там ни было, Debian поддерживает наличие нескольких репозиториев в одном файле, и API правильно их разбирает, иначе веб-интерфейс бы их не отображал, и его можно использовать для включения/отключения. Это полностью соответствует целям проектирования. Чтобы соответствовать цели проектирования, позволяющей вызывать API для включения/отключения, индексацию следует строить на основе *содержимого* файлов репозитория, а переменную пути использовать в качестве подтверждения. Предположим, кто-то был неряшливым системным администратором, или его сменили после неряшливого системного администратора, и столкнулся с конфигурацией репозитория вроде этой:

    Code: # /etc/apt/sources.list
    ...
    deb http://foo.example main foo

    Code: # /etc/apt/sources.list.d/foo.list
    Enabled: yes
    Types: deb
    URIs: http://foo.example
    Suites: foo
    Components: main

    Отлично, теперь идентичный репозиторий foo определен в двух местах, и мы хотим отключить один из них через API. Для этого нам понадобятся следующие параметры:

    1. Индекс
    2. Узел
    3. Путь

    Мы можем предположить, что мы уже знаем, на каком узле мы находимся, так что теперь нам нужны только индекс и путь, верно? Проблема в том, что они хранятся отдельно в API и никоим образом не связаны друг с другом. Вот что возвращается при запросе:

    JSON: {
     "files": [
       {
         "path": "/etc/apt/sources.list",
         "repositories": [
           {...},
           {
             "description": "This is the foo repository for doing foo things.",
             "handle": "foo",
             "name": "Foo",
             "status": 1
           },
           {...},
             "description": "This is the foo repository for doing foo things.",
             "handle": "foo",
             "name": "Foo",
             "status": 1
         ]
       },
       ...
     ],
     "infos": [
       ...
       {"index": 3, "path": "/etc/apt/sources.list"},
       ...
       {"index": 7, "path": "/etc/apt/sources.list.d/foo.list"},
       ...
     ]
    }

    Очевидно, что отсюда все довольно просто, но меня больше всего поражает, что поле "status" находится в одном массиве, а поле "index" — в другом, ведь единственное, что мы можем реально изменить — это status. Или лучше, слить содержимое массива "infos" в "files", так как это бессмысленное различие.
     
     
     
    guruevi
    Guest
    #9
    0
    04.05.2025 17:32:00
    Когда ты работаешь с массивами, ты автоматически получаешь индекс этого массива при итерации по нему. Я не уверен, что именно делает `infos`, предполагаю, что это какой-то ярлык для проверки чего-то, но я не копался в исходном коде, чтобы посмотреть, где это используется.
     
     
     
    Страницы: 1
    Читают тему
    +7 (495) 320-70-49
    info@proxmox.su

    Конфиденциальность Оферта
    © 2026 Proxmox.su
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры