LINUX.ORG.RU

Сообщения samson_b

 

Подскажите, возможно ли такое архитектурное решение?

Добрый день, Сейчас работаю над проектом, который делает web scraping данных с одного веб сервера, обрабатывает их и выдает уже пользователю в удобном для него виде. Особенность проекта в том, что пользователю нужны свежие данные и по сути пользователь сам инициирует scraping ожидая довольно оперативно получить результат (в виде web интерфейса). Я написал скрипт, который забирает данные с веб сайта и загружает в БД сервера.

Все в принципе работает на одном пользователе, но я стал задумываться над масштабированием системы. Что-то мне подсказывает, что при увеличении нагрузки (количество запросов) на веб сервер, у него сработает какая-то внутренняя защита и мой сервер, который делает выгрузку будет забанен, как минимум на некоторое время.

Собственно вопрос, можно ли как-то архитектурно сделать так, чтобы выгрузка данных происходила не напрямую с веб сервера на мой сервер, а через комп пользователя, чтобы веб сервер считал, что обращения идут с разных адресов и не забанил сервер за высокую активность?

 

samson_b
()

Perl и Python как scripting languages

С наступившим господа :)!

Я сисадмин, который доучивается до DevOps, чтобы сменить профиль деятельности. В текущий момент устраняю пробелы в своих знаниях, чтобы соответствовать новой профессии и параллельно ищу работу.

Смотря вакансии, очень часто вижу в них требования знания python для scripting. Так сложилось, что я в своей работе использовал perl и bash, и мне их всегда хватало и учить что-то другое вроде как и не требовалось.

Сейчас, как я понимаю, perl устарел и неким стандартом является python для такого рода задач. Ну раз требуется, я быстренько накатил этот python и посмотрев пару youtube видео о каких-то элементарных вещах, перешел к делу. За вечер я переписал несколько своих рабочих perl скриптов на python. (ничего особенно сложного, работа с mysql, обработка текстовых файлов, бекапы и т.п.)

python мне показался вполне дружелюбным, немного другой синтаксис, пожалуй более удобный, более богатый инструментарий, многое делается проще чем на perl. Где-то наоборот как-то мудрено сделано (например при работе с mysql). Но в целом, все оказалось не сложно и я могу точно также использовать python как perl (для моих задач).

Вопрос, я что-то упустил или переход от одного языка к другому, это что-то, что требует пары вечеров?

 , ,

samson_b
()

Странные записи в логах CentOS 8

Вижу вот такие записи в логах идут постоянно, раз в 3 минуты, потом прекращаются на довольно длительное время (пол дня например), потом опять шпарят. Подскажите, что это вообще такое и куда копать?

Jan  5 00:35:51 d51102 systemd[1]: Started /run/user/0 mount wrapper.
Jan  5 00:35:51 d51102 systemd[1]: Created slice User Slice of UID 0.
Jan  5 00:35:51 d51102 systemd[1]: Starting User Manager for UID 0...
Jan  5 00:35:51 d51102 systemd[1]: Started Session c4227 of user root.
Jan  5 00:35:51 d51102 systemd[20149]: Reached target Paths.
Jan  5 00:35:51 d51102 systemd[20149]: Reached target Timers.
Jan  5 00:35:51 d51102 systemd[20149]: Starting D-Bus User Message Bus Socket.
Jan  5 00:35:51 d51102 systemd[20149]: Listening on D-Bus User Message Bus Socket.
Jan  5 00:35:51 d51102 systemd[20149]: Reached target Sockets.
Jan  5 00:35:51 d51102 systemd[20149]: Reached target Basic System.
Jan  5 00:35:51 d51102 systemd[20149]: Reached target Default.
Jan  5 00:35:51 d51102 systemd[20149]: Startup finished in 22ms.
Jan  5 00:35:51 d51102 systemd[1]: Started User Manager for UID 0.
Jan  5 00:35:51 d51102 systemd[1]: user-runtime-dir@0.service: Unit not needed anymore. Stopping.
Jan  5 00:35:51 d51102 systemd[1]: Stopping User Manager for UID 0...
Jan  5 00:35:51 d51102 systemd[20149]: Stopped target Default.
Jan  5 00:35:51 d51102 systemd[20149]: Stopped target Basic System.
Jan  5 00:35:51 d51102 systemd[20149]: Stopped target Paths.
Jan  5 00:35:51 d51102 systemd[20149]: Stopped target Sockets.
Jan  5 00:35:51 d51102 systemd[20149]: Closed D-Bus User Message Bus Socket.
Jan  5 00:35:51 d51102 systemd[20149]: Reached target Shutdown.
Jan  5 00:35:51 d51102 systemd[20149]: Stopped target Timers.
Jan  5 00:35:51 d51102 systemd[20149]: Starting Exit the Session...
Jan  5 00:35:51 d51102 systemd[1]: user-runtime-dir@0.service: Unit not needed anymore. Stopping.
Jan  5 00:35:51 d51102 systemd[1]: Stopped User Manager for UID 0.
Jan  5 00:35:51 d51102 systemd[1]: user-runtime-dir@0.service: Unit not needed anymore. Stopping.
Jan  5 00:35:51 d51102 systemd[1]: Stopping /run/user/0 mount wrapper...
Jan  5 00:35:51 d51102 systemd[1]: Removed slice User Slice of UID 0.
Jan  5 00:35:51 d51102 systemd[1]: Stopped /run/user/0 mount wrapper.

 , ,

samson_b
()

Многопоточный бекап, скрипт

С наступающим! :)

Нужно бекапить большое количество объемных баз данных и веб контента, и отправлять это все на другой сервер.

На текущий момент это все делается последовательно:

- делаем дамп первой базы

- пакуем первую базу в архив

- копируем первую базу на другой сервер

- делаем дамп второй базы

- пакуем вторую базу в архив

- копируем вторую базу на другой сервер

...

- пакуем веб контент из одной директории в архив

- пакуем веб контент из второй директории в архив

...

- копируем на другой сервер запакованный веб контент из первой директории

- копируем на другой сервер запакованный веб контент из второй директории

....

Все это занимает много времени и поскольку у сервака достаточно вычислительных ресурсов, хотелось бы сделать многопоточный бекап.

Т.е. делим всю информацию, которую хотим бекапить на объекты. Далее для каждого типа объекта (у меня их два: mysql база и директория) пишу вспомогательный скрипт, который будет его бекапить и переносить куда надо. (тут все просто и вопросов нет)

Еще будет основной скрипт, который должен запускать первый скрипт приминительно к конкретным объектам, которые надо бекапить. НО не последовательно, а параллельно группами. Т.е. допустим у меня 100 баз разного размера, я допускаю возможность бекапа 5 баз одновременно. Соответственно, этот основной скрипт, запускает 5 вспомогательных скриптов, которые бекапят базы и ждет, пока один из них не закончит работу, как закончил он запускает еще один скрипт и т.д., пока все базы не обработает.

Т.е. мне нужна возможность параллельно держать запущенными определенное количество задач, и по мере их выполнении добавлять новые задачи, пока они не закончатся. Надеюсь понятно объяснил.

Собственно вопрос, как скрипт может контролировать количество запущенных им в фоне задач, чтобы по мере их выполнения запускать новые задачи и поддерживая одновременное количество выполняемых задач на определенном уровне?

 ,

samson_b
()

Linux md raid и EFI раздел, нюансы

Доброго всем.

Есть сервак, который наша контора взяла в аренду в ДЦ. По их условиям, они сами (сотрудники датацентра) ставят ОС и настраивают рейд.

Имеем: 2x4Tb винта объединенные в software raid, по нашим требованиям они поставили CentOS 7 и кроме служебных разделов сделали один большой /. Как я понимаю, чтобы обеспечить поддержку разделов больше 2Тб, они сделали GPT диски и UEFI загрузку. UEFI загрузка требует наличие EFI раздела на одном из дисков. Как видно:

1. На диске (sda) есть раздел «EFI System Partition», а на втором (sdb) вместо него «Microsoft basic».

2. Раздел «EFI System Partition» (/dev/sda1) смонтирован как /boot/efi раздел (см команду df внизу)

3. Раздел «Microsoft basic» (/dev/sdb1) не смонтирован вообще. Я только что ради интереса смонтировал его ручками и оказалось, что в нем содержатся почти(!) те же файлы, что в /dev/sda1.

4. Интересный момент, у меня есть подозрения, что как минимум 1 раз, загрузка по каким-то причинам переключилась с /dev/sdb1 на /dev/sda1, т.к. у меня была ситуация, когда я добавил параметр ядру «ipv6.disable=1» и обновил grub.cfg на этом efi разделе, и после перезагрузки решил проверить, как это применилось, удивился, что никак и долго пытался понять почему grub.cfg вернулся в первоначальное состояние (похоже, что просто смонтировался раздел с другого диска, на котором grub.cfg был первоначальный). Я еще раз дал команду обновить grub.cfg (судя по всему уже на втором разделе) и таким образом привел файлы к общему знаменателю на двух разделах. (единственное отличие файлов на этих разделов timestamp файлов grub.cfg - полтора часа разницы)

Вопросы: 1. Самое главное, если выйдет из строя один из дисков (любой), смогу ли я загрузиться имея только второй? 2. Объясните мне пожалуйста, как при перезагрузке сервера могла произойти смена диска с которого произошла загрузка? будет или это еще повторяться?

[root@backupsrv ~]# fdisk -l
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.

Disk /dev/sda: 4000.8 GB, 4000787030016 bytes, 7814037168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk label type: gpt
Disk identifier: 8C784678-F636-44B1-A51A-5A3EAE7ED217


#         Start          End    Size  Type            Name
 1         2048       411647    200M  EFI System      EFI System Partition
 2       411648      4605951      2G  Linux RAID
 3      4605952      5654527    512M  Linux RAID
 4      5654528   7814035455    3.7T  Linux RAID
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.

Disk /dev/sdb: 4000.8 GB, 4000787030016 bytes, 7814037168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk label type: gpt
Disk identifier: 5A1DF718-A12D-4482-9001-70F5683F9BFF


#         Start          End    Size  Type            Name
 1         2048       411647    200M  Microsoft basic
 2       411648      4605951      2G  Linux RAID
 3      4605952      5654527    512M  Linux RAID
 4      5654528   7814035455    3.7T  Linux RAID

Disk /dev/md1: 2144 MB, 2144337920 bytes, 4188160 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/md2: 3997.8 GB, 3997755768832 bytes, 7808116736 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/md0: 535 MB, 535822336 bytes, 1046528 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes

[root@backupsrv ~]# df
Filesystem      1K-blocks    Used  Available Use% Mounted on
devtmpfs         16327416       0   16327416   0% /dev
tmpfs            16339676       0   16339676   0% /dev/shm
tmpfs            16339676   99580   16240096   1% /run
tmpfs            16339676       0   16339676   0% /sys/fs/cgroup
/dev/md2       3902152092 2478120 3899673972   1% /
/dev/md0           498514  109566     358689  24% /boot
/dev/sda1          204580   11280     193300   6% /boot/efi
tmpfs             3267936       0    3267936   0% /run/user/1000
tmpfs             3267936       0    3267936   0% /run/user/0

 , ,

samson_b
()

Storage solution for kubernetes

Изучая k8s возник вопрос, как делать storage для работы с данными, которые должны сохраняться, а не исчезать после завершения работы pods.

Сам кубик ничего не предлагает, а именно предлагает подключаться к сторонним ресурсам или облачным хранилищам или к всяким NFS/iSCSI и т.п. Мой кластер стоит на голом железе и варианты с использованием облачных хранилищ отпадают из-за скорости доступа к ним.

В идеале я бы хотел некое решение, которое я могу поставить как k8s приложение, прямо на кластер и использовать жесткие диски нод, как сетевой рейд. Хочется гибкости, такой же как у кубика, чтобы можно было легко создавать разделы, цеплять их к pods и потом удалять если они не нужны. Мне очень нравится фишка от VM как thin provisioning. Ес-но решение должно быть надежное и проверенное. Подскажите, кто что использует?

Я бегло погуглил и нашел пару вариантов: Rook и StorageOS, но я не знаю как они в работе и может есть что получше?

 ,

samson_b
()

Как приложение в контейнере завершает работу?

Изучая Docker и Kubernetes возник вопрос. Ну вот представим, есть некий контейнер (например субд), который работает с файлами за пределами контейнера, которые будут нужны в целостном состоянии после завершения работы контейнера. Наступит момент, когда контейнер нужно будет закрыть, при этом мы не знаем, что в этот момент контейнер делает, может проводит какие-то операции записи в БД. Правильно будет корректно закрыть приложение в контейнере и после этого потушить сам контейнер. Не правильно будет прибить его принудительно.

Вопрос, где и как прописывается, как будет остановлено приложение в контейнере? Я не нашел никаких упоминаний об этом, ни в Dockerfile нигде.

 ,

samson_b
()

Docker + Kubernetes + iptables

Я несколько запутался с этой связкой, Docker и Kubernetes, оба по умолчанию вносят изменения в iptables. Docker в т.ч. меняет default FORWARD policy на DROP и это рушит сеть Kubernetes. На сколько я понимаю, я должен доверить Kubernetes рулить сетью и firewall, а Docker от этого дела отвадить. Чтобы это сделать, я добавил параметр запрещающий Docker трогать правила iptables. (запускаю dockerd с параметром --iptables=false) После этого, вроде все заработало.

Вопрос, это правильное решение? Вообще, как правильно настраивать firewall для этой связки?

Еще вопрос по Kubernetes, я правильно понимаю, что любой pod выставленный наружу, должен быть доступен по порту его сервиса на любой ноде, в т.ч. мастере?

 , ,

samson_b
()

Как воспользоваться ENV внутри контейнера

Сделал image с добавлением двух переменных окружения REMOTEHOST и REMOTEPORT

[root@docker nginx]# docker commit --change "ENV REMOTEHOST websrv" --change "ENV REMOTEPORT 80" nginx-m nginx-m:2.0

на основании него запустил контейнер

[root@docker nginx]# docker run -d -p 443:80 --name nginx-m2 --link websrv nginx-m:2.0

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

[root@docker nginx]# docker inspect -f "{{ .Config.Env }}" nginx-m2
[PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin NGINX_VERSION=1.17.6 NJS_VERSION=0.3.7 PKG_RELEASE=1 REMOTEHOST=websrv REMOTEPORT=80]

Пробую воспользоваться ими уже внутри контейнера

[root@docker nginx]# docker exec -it nginx-m2 echo $REMOTEHOST

[root@docker nginx]# docker exec -it nginx-m2 echo $REMOTEPORT

[root@docker nginx]#

Непонятно как их использовать, чтобы в конфигурационном файле поставить переданные параметры.

 

samson_b
()

Концепция Docker контейнеров и их практическое использование

Возник вопрос по контейнерам в linux. Контейнер - это некая служба запущенная в изолированной среде. Сам контейнер получается методом развертывания его из образа (image). При завершении работы контейнера, данные внутри него теряются и запустив его снова мы получим первоначальный контейнер из образа. Если нам нужно, чтобы данные, которые контейнер создаст в процессе работы, не терялись, нам нужно подключить к нему раздел (volume) и тогда контейнер работая с файлами может сохранить их на этом разделе и они не исчезнут при завершении работы контейнера. В контейнер можно передать некоторые параметры для приложения в нем, путем указания параметров окружения при развертывании. При этом мы ограничены параметрами в образе, которые можно передать. Вопрос, мне надо создать контейнер, в котором изначально будет приложение с нужным мне конфигом и дополнительными файлами. Я так понимаю, что правильным в этом случае будет собрать новый образ из некого дефолтного, зашив в него все необходимое (конфиг, доп файлы). Таким образом при развертывании контейнера из этого нового образа, у контейнера будет все необходимое для работы и мне не надо будет передавать в него что-то, что нельзя передать при развертывании.

Простой пример: мне нужен сервис nginx определенным образом сконфигурированный и имеющий файлы с сертификатами. Я беру штатный image nginx, на основе него собираю новый кастомный image и уже с него развертываю контейнеры?

Я правильно понял концепцию? На практике оно как-то так должно быть?

 

samson_b
()

Kubernetes nodeSelector

Продолжая осваивать Kubernetes установил dashboard. После установки, один из двух dashboard pods постоянно крашился перезапускался. После гугления, выяснилось, что оба pods должны быть запущены на мастер ноде, а в моем случае они запустились на worker. Перекинув их на мастер ноду, все заработало.

Мне показалось странно, что разработчик не позаботился о том, чтобы dashboard сразу разворачивался на мастере, где ему и место. Я стал гуглить, как привязать pod к конкретной ноде и нашел такой параметр как nodeSelector. Потом открыл yaml файл dashboard и какого было мое удивление, когда я там тоже нашел этот параметр. Т.е., как я понимаю, у разработчиков была задумка сделать чтобы dashboard разворачивался именно на мастере, вот так это выглядит:

nodeSelector:

«beta.kubernetes.io/os»: linux

# Comment the following tolerations if Dashboard must not be deployed on master

tolerations:

- key: node-role.kubernetes.io/master

effect: NoSchedule

Я не очень понял этот код и тем более не понял почему он не сработал в моем случае. Объясните мне пожалуйста :)

 

samson_b
()

Kubernetes вопросы по установке

Осваиваю Kebernetes, возникли вопросы с установкой. Поставил CentOS 8, допилил его под kubernetes, поставил Docker, заявленный как рекомендуемый для v1.16.3. Установил kubeadm и все, что вместе с ним поставилось.

Дошел до развертывания кластера и дальше не понятно как быть. Как я понимаю нужно запустить команду «kubeadm init» возможно с какими-то параметрами. а дальше добавить некий «network add-on» с помощью команды kubectl apply -f <add-on.yaml>

Вот эта часть мне не очень понятна. На оф. сайте предлагается поставить один из 10 network add-ons. Я реально не понимаю, какой мне больше подойдет.

Я хочу установить мастер ноду и одну-две work ноды, чтобы освоить базовые возможности kubernetes, для начала, а дальше видно будет. Посоветуйте как мне быть.

 

samson_b
()

Скрипт который запускает консольное приложение и отвечает на его вопросы.

Приветствую! Есть приложение, которое после запуска задает пару-тройку вопросов, на которые нужно шаблонно ответить и далее все, что выведет приложение нужно сохранить в файл. Я бегло погуглил и нашел вот это:

{ echo ‘/the/path/where/to/install’; echo ‘answer to the second prompt’; } | /path/to/installer >~/temp

У меня это не работает, выдается ошибка: inappropriate ioctl for device

Посоветуйте что-нибудь :)

 ,

samson_b
()

Мгновенный бекап

Приветствую! Ситуация такая, есть linux машина с файлом в несколько килобайт, есть сервис, который отслеживает изменения файла в realtime. Как только файл был изменен сервис запускает команду по копированию этого файла на другой сервер в сети интернет. Потенциально файл может меняться часто (например пару раз в секунду) и мне важно иметь актуальный бекап этого файла на другой машине. Вопрос, как сделать копирование максимально быстрым. Я знаю, что если я буду копировать с помощью ftp, то какое-то время уйдет на установление соединения, может секунда или даже две. Можно ли как-то сократить эти технические издержки на установление соединения или может есть какой-то другой способ быстро скопировать маленький файл?

 , ,

samson_b
()

Защить файл

OS Ubuntu 16.4.4 desktop

Хочу защитить определенный файл на жестком диске, т.е. сделать его доступным только для одного приложения. Это возможно?

Т.е. если какое-то приложения пытается открыть файл, система проверяет, что это за приложение и дает доступ только, если приложение указано, как разрешенное.

 , ,

samson_b
()

reverse ssh port forwarding (обратное ssh соединение)

Есть три компа:

1. В локальной сети за NAT (192.168.1.2)

2. В локальной сети за NAT (192.168.1.3)

3. В интернете с белым IP (80.240.97.20)

Компьютер_1 подключается к компьютеру_3 командой ssh -R 2210:localhost:22 80.240.97.20

Соединение устанавливается и теперь на компьютере_3 локальный порт 2210 пробрасывается на порт 22 компьютера_1.

Далее, после этого, не разрывая соединения между компьютерами 1 и 3, мы пытаемся также подключиться с компьютера_2, такой же командой: ssh -R 2210:localhost:22 80.240.97.20

Вопрос, что при этом произойдет? Вариант 1: соединение не может быть установлено, пока соединение между компьютерами 1 и 3 не будет разорвано.

Вариант 2: соединение между компьютерами 1 и 3 разорвется, и установится новое соединение между компьютерами 2 и 3.

Вариант 3: что-то другое :)

 , ,

samson_b
()

Spamassassin, trusted_networks проблемка

В конфиге Spamassassin можно указать доверенные сети или хосты с помощью параметра trusted_networks, тогда почта полученная от этих хостов уменьшит «балл вероятности спама» правилом ALL_TRUSTED.

Штатная ситуация: я на доверенном хосте создаю новое письмо и отправляю на почтовый сервер, у письма понижается балл вероятности спама правилом ALL_TRUSTED. Все отлично, все работает.

Другая ситуация: я на доверенном хосте _перенаправляю_ полученное ранее мной письмо. У письма не понижается балл, правило ALL_TRUSTED не срабатывает.

Вопрос почему, как сделать, чтобы при перенаправлении писем с доверенных хостов правило ALL_TRUSTED срабатывало?

samson_b
()

vsftpd разрешить доступ только для конкретной группы пользователей

ftp сервер - vsftpd

Подскажите, можно разрешить доступ к ftp конкретной группе пользователей, а остальным запретить. Во всех инструкциях описано, как разрешить доступ списку пользователей, это понятно, а можно оперировать целыми группами, а не отдельными пользователями?

samson_b
()

Не пропускать письма с файлами *.scr

Есть почтовый сервер sendmail с антивирусом clamav. В принципе антивирус работает хорошо и 95% вирусов отфильтровывает. Однако есть свежие вирусы, которые еще не попали в базу антивируса и вероятность, что свежий вирус пролезет и глупый пользователь его запустит не нулевая.

Очень часто вирусы это заархивированные *.scr файлы. Поскольку в реальной жизни пользователи никогда такими файлами не обмениваются, можно смело фильтровать все письма с такими вложениями. Хочу настроить некое правило или фильтр, которое будет резать такие письма, собственно вопрос как это сделать? Нужно чтобы фильтр смотрел вложения на предмет файлов *.scr, а также заглядывал во вложенные архивы, тоже проверяя наличие этих файлов. Порекомендуйте, пожалуйста решение.

samson_b
()

iptables hashlimit реализация в CentOS 6.5

Ранее пользовался CentOS 5.X и вот такая конструкция работала на ура:

iptables -t nat -A PREROUTING -p tcp -d $IPADDR --dport 3389 -m state --state NEW -m hashlimit --hashlimit 24/hour --hashlimit-burst 6 --hashlimit-htable-expire 3660000 --hashlimit-mode srcip --hashlimit-name server_rdp -j DNAT --to $USER_IP:3389

iptables -t nat -A PREROUTING -p tcp -d $IPADDR --dport 3389 -m state --state NEW -j DROP

iptables -t nat -A PREROUTING -p tcp -d $IPADDR --dport 3389 -j DNAT --to $USER_IP:3389

В CentOS 6.5 вот эта команда - «iptables -t nat -A PREROUTING -p tcp -d $IPADDR --dport 3389 -m state --state NEW -j DROP» выдает ошибку, по смыслу ошибки - в таблице nat нельзя использовать DROP. Подскажите, как переформулировать команду, чтобы она работала?

samson_b
()

RSS подписка на новые темы