LINUX.ORG.RU

Добавление секции non-free в APT через Ansible - почему удаляются строки?

 , , ,


0

1

Имеется исходный файл /etc/apt/sources.list :

deb http://ftp.ru.debian.org/debian bullseye main contrib
deb-src http://ftp.ru.debian.org/debian bullseye main contrib

deb http://security.debian.org/debian-security bullseye-security main contrib
deb-src http://security.debian.org/debian-security bullseye-security main contrib
И надо в него добавить секцию non-free.

Придумал такой код:
   - name: "Добавление секции non-free в APT"                                                                              
     replace:                                                                                                              
       dest: /etc/apt/sources.list                                                                                         
       regexp: '(deb|deb-src)\s*(http://.*debian.*)\s*(.?)\s*main contrib\s.*(?!non-free)'                                 
       replace: '\1 \2 \3 main contrib non-free'
В результате в файле, за каким-то хреном, исчезают строки deb-src:
deb http://ftp.ru.debian.org/debian bullseye   main contrib non-free

deb http://security.debian.org/debian-security bullseye-security   main contrib non-free

Почему так то? Какое правильное регулярное выражение должно быть?

★★★★★

у меня так:

deb http://debian.ethz.ch/debian/ bullseye main non-free contrib
deb-src http://debian.ethz.ch/debian/ bullseye main non-free contrib

deb http://security.debian.org/debian-security bullseye-security main contrib non-free
deb-src http://security.debian.org/debian-security bullseye-security main contrib non-free

deb http://debian.ethz.ch/debian/ bullseye-updates main contrib non-free
deb-src http://debian.ethz.ch/debian/ bullseye-updates main contrib non-free

Gennadevich
()
Ответ на: комментарий от Xintrea

вообще вот полностью файл:


uzer-pc1@my-pc:/tmp$ cat /etc/apt/sources.list
# deb cdrom:[Debian GNU/Linux 11.5.0 _Bullseye_ - Unofficial amd64 NETINST with firmware 20220910-10:39]/ bullseye contrib main non-free

#deb cdrom:[Debian GNU/Linux 11.5.0 _Bullseye_ - Unofficial amd64 NETINST with firmware 20220910-10:39]/ bullseye contrib main non-free

deb http://debian.ethz.ch/debian/ bullseye main non-free contrib
deb-src http://debian.ethz.ch/debian/ bullseye main non-free contrib

deb http://security.debian.org/debian-security bullseye-security main contrib non-free
deb-src http://security.debian.org/debian-security bullseye-security main contrib non-free

# bullseye-updates, to get updates before a point release is made;
# see https://www.debian.org/doc/manuals/debian-reference/ch02.en.html#_updates_and_backports
deb http://debian.ethz.ch/debian/ bullseye-updates main contrib non-free
deb-src http://debian.ethz.ch/debian/ bullseye-updates main contrib non-free

# This system was installed using small removable media
# (e.g. netinst, live or single CD). The matching "deb cdrom"
# entries were disabled at the end of the installation process.
# For information about how to configure apt package sources,
# see the sources.list(5) manual.

Gennadevich
()
Ответ на: комментарий от TeopeTuK

Я бы задумался над тем, что именно соответствует подшаблону (.?) и почему.

Ему соответствует имя репозитария, ибо оно зажато между двумя пробельными символами. Если быть точным, стоило бы вместо \s* писать \s+, но и так должно работать.

Вопрос то не в этом. Вопрос в том, почему исчезают строки.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Aceler

Зачем ты используешь такой костыль вместо штатного модуля?

deb822_repository - твою налево, кто такие названия модулям дает?

Но в любом случае, я им воспользоваться не могу, потому что:

New in ansible-core 2.15

А у меня:
ansible 2.9.27

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от George

Твоя регулярка потенциально матчит то, что не должна. Я бы избавился от (.?)

Тут дело не в (.?)

Какая бы не была регулярка она либо должна сматчить всю строку, либо не сматчить.

  • Если сматчит, то новая строка будет как минимум содержать «main contrib non-free», потому что это написано явным текстом в опции replace.
  • Если не сматчит, то строка должна остаться неизменной.

Какого хрена строка удаляется, мне непонятно.

Кстати, Если в регулярке убрать завершающее выражение \s.*(?!non-free), то вставка non-free начинает работать везде где нужно, и строки не удаляются. Вот только проблема - если два раза запустить плейбук, то non-free тоже два раза будет вставлено. Поэтому я и дописываю отрицательное выражение. А с ним почему-то глючит.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Что значит неканонично? Я привел цитату из дебиановской доки. Это предпочтительный способ.

А если смотреть на вопрос каноничности в перспективе ансибля, то лучше вообще раздавать весь sources.list целиком.

thesis ★★★★★
()
Ответ на: комментарий от TeopeTuK

Я бы задумался над тем, что именно соответствует подшаблону (.?) и почему.

Заменил (.?) на (.+?), я просто ошибся и написал
«0 или 1 указанных символов» вместо "
1 или больше указанных символов".

В общем получается такая вещь. Тут до non-free еще проблемы есть.

Если использовать выражение:

^(deb|deb-src)\s+(http:\/\/[^\s]*debian[^\s]*)\s+(.+?)\s+main\s+contrib.*$

То оно матчится правильно. Оно находит в моем случае четыре строки, в них находит три группы, все правильно высчитывает.

Теперь, если взять, и после contrib всунуть \s* вот так:
^(deb|deb-src)\s+(http:\/\/[^\s]*debian[^\s]*)\s+(.+?)\s+main\s+contrib\s*.*$

То происходит следующая вещь. Этот \s* попадает на перевод строки. Матчит его (считает перевод строки за \s), и захватывает через .*$ всю последующую строку.

Я такого вообще не ожидал, я думал что если есть $, на нем всегда будет останавливаться парсинг строки. А тут вона как - перепрыгивает на следующую. Пока не знаю что с этим делать.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от s-warus

Ну такое себе решение. Если в имени http/https-хоста встретится main, или будет добавлен сторонний репозитарий с именем, содержащим main, то у тебя все слетит.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от einhander

Понятно, что такое секции ты не знаешь.

Как ты собираешься добавить к любым существующим секциям еще одну через модуль apt_repository?

Xintrea ★★★★★
() автор топика
Последнее исправление: Xintrea (всего исправлений: 1)
Ответ на: комментарий от s-warus

Теперь тебе надо молиться, чтобы имя репозитария не было main. Гарантировать, что в каком-нибудь другом подключенном репозитарии майнтейнеры не использовали имя main для имени репозитария ты не можешь.

Xintrea ★★★★★
() автор топика

Ты опять делаешь какую-то фигню

https://docs.ansible.com/ansible/latest/collections/ansible/builtin/apt_repository_module.html#ansible-collections-ansible-builtin-apt-repository-module

Потом посмотри хотя бы по диагонали содержимое коллекции ansible.builtin https://docs.ansible.com/ansible/latest/collections/ansible/builtin/index.html

И черт возьми, прочитай хоть одну книгу по ansible

Методом тыка и жипитей ты далеко не уедешь

router ★★★★★
()
Ответ на: комментарий от s-warus

домен " main " как такое может быть?

Вот такое может быть:

deb http://ourProject.org/projectName main supersecurity megadata

Здесь main - это имя ветки.
А supersecurity и megadata - это секции.

Вместо имени секции у тебя сматчится имя ветки main.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

А если в репозитории нет секции non-free? А ты ее уже добавил? Сам подход неудачный. Конкретный репозиторий, с конкретной секцией.

einhander ★★★★★
()
Последнее исправление: einhander (всего исправлений: 1)
Ответ на: комментарий от s-warus
- name: "Добавление секции non-free в APT"                                                                              
     replace:                                                                                                              
       dest: /etc/apt/sources.list                                                                                         
       regexp: ' main.*$'                                 
       replace: ' main contrib non-free'

так лучше " main" репозиторий https:\\main не поподает

в старом варианте

deb-src http://ftp.ru.debian.org/debian bullseye main
не попал

s-warus ★★★
()
Ответ на: комментарий от Xintrea

Иногда стоит задуматься: не фигню ли ты делаешь

Если хочешь править именно source.list, подумай о модуле ansible.builtin.template

Сделать черезжопу - ни разу не ansible way

router ★★★★★
()
Ответ на: комментарий от einhander

А если в репозитории нет секции non-free?

Именно поэтому у меня матчится debian. В нем есть.

А ты ее уже добавил?

Именно поэтому я вставляю отрицательное выражение (?!non-free)

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от s-warus

так лучше " main" репозиторий https:\\main не поподает

Еще раз: после http://... идет имя ветки, и только потом имена секций. Твоя регулярка может сматчить имя ветки, а должна только имя секций.

Xintrea ★★★★★
() автор топика