Сообщество - Лига Сисадминов

Лига Сисадминов

2 165 постов 18 686 подписчиков

Популярные теги в сообществе:

Сохранение и загрузка нескольких Docker образов

Исходный код представленный в этой заметке доступен в моем репозитории GitHub.

Код скрипта для сохранения (save-images.sh):

#!/bin/bash

list="images.txt"

images="images.tar.gz"

usage() {

echo "USAGE: $0 [--image-list images.txt] [--images images.tar.gz]"

echo " [-l|--image-list path] text file with list of images; one image per line."

echo " [-i|--images path] tar.gz generated by docker save."

echo " [-h|--help] Usage message"

}

POSITIONAL=()

while [[ $# -gt 0 ]]; do

key="$1"

case $key in

-i | --images)

images="$2"

shift # past argument

shift # past value

;;

-l | --image-list)

list="$2"

shift # past argument

shift # past value

;;

-h | --help)

help="true"

shift

;;

*)

usage

exit 1

;;

esac

done

if [[ $help ]]; then

usage

exit 0

fi

pulled=""

while IFS= read -r i; do

[ -z "${i}" ] && continue

if docker pull "${i}" >/dev/null 2>&1; then

echo "Image pull success: ${i}"

pulled="${pulled} ${i}"

else

if docker inspect "${i}" >/dev/null 2>&1; then

pulled="${pulled} ${i}"

else

echo "Image pull failed: ${i}"

fi

fi

done <"${list}"

echo "Creating ${images} with $(echo ${pulled} | wc -w | tr -d '[:space:]') images"

docker save $(echo ${pulled}) | gzip --stdout >${images}

Код для загрузки (load-images.sh):

#!/bin/bash

images="images.tar.gz"

list="images.txt"

windows_image_list=""

windows_versions="1809"

usage() {

echo "USAGE: $0 [--images images.tar.gz] --registry my.registry.com:5000"

echo " [-l|--image-list path] text file with list of images; one image per line."

echo " [-i|--images path] tar.gz generated by docker save."

echo " [-r|--registry registry:port] target private registry:port."

echo " [--windows-image-list path] text file with list of images used in Windows. Windows image mirroring is skipped when this is empty"

echo " [--windows-versions version] Comma separated Windows versions. e.g., \"1809,2004,20H2\". (Default \"1809\")"

echo " [-h|--help] Usage message"

}

push_manifest() {

export DOCKER_CLI_EXPERIMENTAL=enabled

manifest_list=()

for i in "${arch_list[@]}"; do

manifest_list+=("$1-${i}")

done

echo "Preparing manifest $1, list[${arch_list[@]}]"

docker manifest create "$1" "${manifest_list[@]}" --amend

docker manifest push "$1" --purge

}

while [[ $# -gt 0 ]]; do

key="$1"

case $key in

-r | --registry)

reg="$2"

shift # past argument

shift # past value

;;

-l | --image-list)

list="$2"

shift # past argument

shift # past value

;;

-i | --images)

images="$2"

shift # past argument

shift # past value

;;

--windows-image-list)

windows_image_list="$2"

shift # past argument

shift # past value

;;

--windows-versions)

windows_versions="$2"

shift # past argument

shift # past value

;;

-h | --help)

help="true"

shift

;;

*)

usage

exit 1

;;

esac

done

if [[ -z $reg ]]; then

usage

exit 1

fi

if [[ $help ]]; then

usage

exit 0

fi

docker load --input ${images}

linux_images=()

while IFS= read -r i; do

[ -z "${i}" ] && continue

linux_images+=("${i}")

done <"${list}"

arch_list=()

if [[ -n "${windows_image_list}" ]]; then

IFS=',' read -r -a versions <<<"$windows_versions"

for version in "${versions[@]}"; do

arch_list+=("windows-${version}")

done

windows_images=()

while IFS= read -r i; do

[ -z "${i}" ] && continue

windows_images+=("${i}")

done <"${windows_image_list}"

# use manifest to publish images only used in Windows

for i in "${windows_images[@]}"; do

if [[ ! " ${linux_images[@]}" =~ " ${i}" ]]; then

case $i in

*/*)

image_name="${reg}/${i}"

;;

*)

image_name="${reg}/${i}"

;;

esac

push_manifest "${image_name}"

fi

done

fi

arch_list+=("linux-amd64")

for i in "${linux_images[@]}"; do

[ -z "${i}" ] && continue

arch_suffix=""

use_manifest=false

if [[ (-n "${windows_image_list}") && " ${windows_images[@]}" =~ " ${i}" ]]; then

# use manifest to publish images when it is used both in Linux and Windows

use_manifest=true

arch_suffix="-linux-amd64"

fi

case $i in

*/*)

image_name="${reg}/${i}"

;;

*)

image_name="${reg}/${i}"

;;

esac

docker tag "${i}" "${image_name}${arch_suffix}"

docker push "${image_name}${arch_suffix}"

if $use_manifest; then

push_manifest "${image_name}"

fi

done

Пример списка образов (images.txt):

quay.io/prometheus/prometheus:v2.36.1

quay.io/prometheus/node-exporter:v1.3.1

grafana/grafana:9.0.3

Показать полностью

DevOps Workshop: Мониторинг. Linux, ansible, prometheus, grafana и node exporter

В данном воркшопе мы настроим и установим мониторинг Prometheus и Grafana с помощью Ansible. Информации много и подана она в очень сжатом виде. #linux #ansible #prometheus #grafana #node_exporter

Больше видео и постов в тг канале: https://t.me/devops_spb_ru

Примеры кода из видео: https://github.com/DevOps-spb-org/monitoring-webinar

Показать полностью
21

Как быть и что делать?

Всем доброго времени суток.

Скорее всего вопрос поднимался и не раз. И где-то на него найдется ответ, но почему решил сделать так. Сильного тапками не закидывайте. Надеюсь на понимание.

Так вот.Возник вопрос к коллегам.

Сам уже на протяжении последних 3ех лет являюсь оным. Работаю в небольшой контре, которая обслуживает с десяток организаций.

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

Роста знаний в какую то глубь нет. Только расширяется пул всевозможных сфер, которые за это время в той или иной степени затрагивались. И все навыки на мой взгляд на уровне "новичка". По итогу по чуть-чуть знаком со "всем",а по факту серьезных навыков нет никаких.

Да и в целом решения о каких то комплексных задачах происходят с одобрения руководителя.

Я как человек больше практик и зачастую обучаюсь при помощи великого учения "метода научного тыка", но только в тех случаях когда точно уверен что если что смогу вернуть все на свои места).

И хорошо закрепляю какие то решения задач или применяю информацию только когда есть места где их можно или даже нужно периодически использовать.

Хочется какого-то профессионального роста, но не знаю в какую сторону смотреть и как себя оценить насколько я ликвиден в профессиональном плане.

Сталкивался кто-то с подобным? Как проходили это? Мб есть какие-то полезные сервисы для развития. Или ценные сертификаты в профессии к которым можно/нужно стремится и набирать знаний для их получения. Или же проще сменить работу на ту где более серьезные задачи и расти уже там?

Заранее спасибо.

Показать полностью
12

Этого не нашел в гугле про Микротик

Представьте, что вам нужно нагородить нечто свое за каким-либо в меру тупым роутером. Например впн канал или что-то еще, но за роутером, который умеет разве что в NAT. Обычно каких то усилий это не требует, но однажды у меня возник совсем (для меня) неожиданный случай- все порты тупого роутера заняты, а мне нужен свой огород за ним. Ну ладно, какой-то не важный сервис я отключил и поставил для решения задачки свой hAP, но, блин, надо бы вернуть и этот неважный сервис к жизни. По сути, надо чтобы порт от роутера клиента каким то волшебным образом был на одном из физических портов моего микротика, а не за nat и вот это вот всё. Не, ну а чего, давайте гуглить "проброс физического ethernet в mikrotik", ага. Хрен там, нету там подсказок (пара не решающих проблему есть), в каком направлении двигаться хотя бы. Ну что делать, пришлось думать и читать мануалы в оригинале) Покурил и мысль- а что если в мост порты объединить? В моем представлении мост(bridge), все еще оставался некой непознанной абстракцией, которая непонятно что делает, в частности, чем она отличается от Switch, например. Ну т.е.е если есть Switch, зачем Bridge? Ладно, я отвлекся. Так вот. Для решения проблемы. Создаем Bridge.

Этого не нашел в гугле про Микротик Mikrotik, Настройка, Личный опыт, Мат, Длиннопост

Потом в него добавляем наш порт WAN, который мы подключили к тупому роутеру и тот порт, который мы хотим сделать так, как будто он подключен к порту тупого роутера.

Этого не нашел в гугле про Микротик Mikrotik, Настройка, Личный опыт, Мат, Длиннопост

Будет типа такого

Этого не нашел в гугле про Микротик Mikrotik, Настройка, Личный опыт, Мат, Длиннопост

Ether2 и ether1 в бридже, и как будто мы просто включили дополнительный коммутатор между портом микротика и нашим не очень нужным девайсом. И всё. Наслаждаемся. Конечно, если вы не нахуевертили чего то еще, что не позволит этой прекрасной конструкции работать)
Всех благ.

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

Показать полностью 3
12

Нужна помощь найти учебные материалы

Доброго вечера/дня/утра!

Работаю преподавателем по предметам телекоммуникаций и компьютерным сетям.
По образованию сильно далека от этого, в следствии чего имею некоторые трудности при подготовке к парам.
До меня предмет вел старенький слепенький дедок, который толком не выдавал предметы и никакой базы не собирал.
Посему большой вопрос - может кто знает действительно «рабочую и ходовую» литературу по сей отрасли?
Интернет дает слишком много информации ( в большинстве своем устаревшей) , при попытке собрать которую в единую картину - начинает кипеть мозг .
Если конкретнее то « телекоммуникации», «компьютерные системы» и самое страшное - «мультисервисные системы».

В целом за год уже +- общее понимание есть, но глубинных познаний не так много, а выдавать знания хочется качественно.
Проблема моя, тег соответственно моё :)

78

Mdadm RAID1: замена дисков на более емкие

Как-то встала задача увеличить объем зеркального массива на сервере с Debian без потери данных и без простоев. Простых и кратких инструкций в интернете нашел на тот момент не особо много, в основном на английском. Составил для себя на будущее свою, чем с вами и поделюсь сегодня. Может кому пригодится, всякое случается в практике сисадмина.

0. Посмотреть, какие диски каким именам в каталоге /dev соответствуют, и определиться, что будем менять:

lsscsi //простой список (годится, если все диски разных моделей)

lshw -class disk //подробно и с серийниками

1. Пометить каждый раздел RAID на первом заменяемом диске как извлеченный:

mdadm --manage /dev/mdX --fail /dev/sdYZ

mdadm --manage /dev/mdX --remove /dev/sdYZ

где X - номер массива, соответствующего диску

Y - буква заменяемого диска

Z - номер раздела RAID на этом диске, соответствующий массиву X

2. Заменить первый диск на новый.

3. Создать на новом диске разделы RAID, используя все свободное пространство кроме нескольких последних МБ. Пример:

parted -a optimal /dev/sdY

(parted) mklabel gpt //схема разметки GPT

(parted) mkpart primary 2048s 5999GB //создать раздел размером 5999 ГБ (не ГиБ!), начиная с 2048 сектора

(parted) set 1 raid on //пометить его тип как RAID

(parted) print //вывести список разделов диска для проверки

где Y - буква нового диска (внимание, не спутайте с другим, а то потеряете на нем данные!)

4. Добавить разделы нового диска в соответствующие массивы:

mdadm --manage /dev/mdX --add /dev/sdYZ

где X - номер массива

Y - буква нового диска

Z - номер раздела RAID на этом диске, соответствующий массиву X

5. Подождать окончания синхронизации. Проверка статуса:

cat /proc/mdstat

6. Повторить шаги 0-5 для второго заменяемого и второго нового дисков.

7. Увеличить соответствующие замененным дискам массивы:

mdadm --grow /dev/mdX --bitmap none

mdadm --grow /dev/mdX --size=max

{Подождать окончания синхронизации}

mdadm --grow /dev/mdX --bitmap internal

где X - номер массива

8. Увеличить файловые системы соответствующих из шага 7 массивов:

{остановить зависимые от массива сервисы}

umount /dev/mdX

fsck.ext4 -f /dev/mdX //проверка целостности ФС, для примера указан формат ext4

resize2fs /dev/mdX

mount /dev/mdX

{запустить сервисы}

где X - номер массива

Показать полностью
344

Вход в IT

7

Тормозит YouTube при входе в определённый аккаунт Google

Здравствуйте! Проблема следующая: очень плохо прогружаются ролики на YouTube когда вхожу в свой Основной аккаунт Google от 3 до 10 секунд, если смотрю видео как Гость, или перейду во второй свой аккаунт, проблема исправляется, очень быстро прогружаются ролики от 0.5 до 1 секунды. Кэш чистил, полностью удалял браузер, отключал синхронизацию, проблема остаётся. Пытался на Основном аккаунте по отключать разные вкладки связанные с Историей YouTube и так далее - не помогает!

Полностью удалял все расширения, даже ставил те же расширения на второй свой аккаунт или на Гостя. Может кто-то сталкивался с подобным? Я предполагаю что где-то возможно в настройках Гугла я не то включил, хотя я там никакие настройки не делал, или ещё что-то, других причин не вижу. Возможно ещё, что Основной аккаунт на ПК и на Телефоне, может из-за их синхронизации что-то происходит, пытается отправить инфу о истории просмотра или что-то подобное, мыслей других нет.

Вот видео с проблемой, тут всё наглядно видно!

Отличная работа, все прочитано!