множество открытых файлов может испортить вам жизнь
Вышли с праздников и опаньки - запятисотил apt-cacher. Оказалось что набежало очень много открытых им файлов. посмотреть что их много можно вот так (в обычном состоянии число меньше сотни):
В качестве решения - увеличить число возможных открываемых файлов, например в файл
/etc/security/limits.conf
#lsof #troubleshooting
Вышли с праздников и опаньки - запятисотил apt-cacher. Оказалось что набежало очень много открытых им файлов. посмотреть что их много можно вот так (в обычном состоянии число меньше сотни):
lsof -p $(ps aux | grep [a]pt-cacher-ng | awk '{print $2}') | wc -l
1153
В качестве решения - увеличить число возможных открываемых файлов, например в файл
/etc/security/limits.conf
apt-cacher-ng soft nofile 65536
apt-cacher-ng hard nofile 65536
#lsof #troubleshooting
rabbitmq 3.7 && docker
Эта история о том, как подружить зоопарк из кроликов и китов. Задача заключается в автоматическом создании очередей, пользователей и прав при запуске контейнера.
С версии 3.7 кролик поддерживает новый синтаксис в конфигурационном файле, теперь вместо json он хавает формат ключ-значение. Самая главная фишка, которая абсолютно потерялась при прочтении мануала по диагонали - новый конфиг называется rabbitmq.conf, тогда как старый - rabbitmq.config. при этом для совместимости работает и старый вариант и новый. но парсер ждет в разных файлах разный синтаксис. Когда ты находишься на стыке версий конфигов и видишь готовое решение, но для старого варианта, так и манит его использовать, но все же я себя заставил разобраться и запилить конфиг нового типа.
Все же задача по кролику решилась всего в 3 файла - definitions.json Dockerfile rabbitmq.conf
Dockerfile
В моем варианте меня устраивает вывод лога в stdout, но вы можете это поправить по своему желанию. тег из хаба докера можно подобрать по своей нужде, но для нашей задачи обязательно использовать management-плагин.
rabbitmq.conf
В конфиг, если он у вас не дефолтный, нужно добавить эту строчку. если у вас конфига нет, то эта строчка - единственное, что собственно и ожидается в конфиге. Если при запуске rabbitmq у вас будет ошибка, что мол нету точки в конце, это значит что вам отвечает старый парсер. проверьте имя конфига или версию кролика.
Ну, и самое главное - это json, который описывает все нужные нам очереди и юзверей.
definitions.json
Важно! пароль в конфиг надо заносить в base64 формате:
после чего можно билдить контейнер и запускать его, прокидывая нужные порты и тома.
#docker #rabbitmq
Эта история о том, как подружить зоопарк из кроликов и китов. Задача заключается в автоматическом создании очередей, пользователей и прав при запуске контейнера.
С версии 3.7 кролик поддерживает новый синтаксис в конфигурационном файле, теперь вместо json он хавает формат ключ-значение. Самая главная фишка, которая абсолютно потерялась при прочтении мануала по диагонали - новый конфиг называется rabbitmq.conf, тогда как старый - rabbitmq.config. при этом для совместимости работает и старый вариант и новый. но парсер ждет в разных файлах разный синтаксис. Когда ты находишься на стыке версий конфигов и видишь готовое решение, но для старого варианта, так и манит его использовать, но все же я себя заставил разобраться и запилить конфиг нового типа.
Все же задача по кролику решилась всего в 3 файла - definitions.json Dockerfile rabbitmq.conf
Dockerfile
FROM rabbitmq:3.7-management
ADD rabbitmq.conf /etc/rabbitmq/rabbitmq.conf
ADD definitions.json /etc/rabbitmq/
RUN chown rabbitmq:rabbitmq /etc/rabbitmq/rabbitmq.conf /etc/rabbitmq/definitions.json
CMD ["rabbitmq-server"]
В моем варианте меня устраивает вывод лога в stdout, но вы можете это поправить по своему желанию. тег из хаба докера можно подобрать по своей нужде, но для нашей задачи обязательно использовать management-плагин.
rabbitmq.conf
management.load_definitions = /etc/rabbitmq/definitions.json
В конфиг, если он у вас не дефолтный, нужно добавить эту строчку. если у вас конфига нет, то эта строчка - единственное, что собственно и ожидается в конфиге. Если при запуске rabbitmq у вас будет ошибка, что мол нету точки в конце, это значит что вам отвечает старый парсер. проверьте имя конфига или версию кролика.
Ну, и самое главное - это json, который описывает все нужные нам очереди и юзверей.
definitions.json
{
"rabbit_version": "3.7.0",
"users": [
{
"name": "user1",
"password_hash": "PASSWORD",
"hashing_algorithm": "rabbit_password_hashing_sha256",
"tags": "tag1"
},
{
"name": "user2",
"password_hash": "PASSWORD",
"hashing_algorithm": "rabbit_password_hashing_sha256",
"tags": "tag2"
},
{
"name": "user3",
"password_hash": "PASSWORD",
"hashing_algorithm": "rabbit_password_hashing_sha256",
"tags": "tag3"
}
],
"vhosts": [
{
"name": "\/vhost1"
},
{
"name": "\/vhost2"
},
{
"name": "\/vhost3"
}
],
"permissions": [
{
"user": "user1",
"vhost": "\/vhost1",
"configure": ".*",
"write": ".*",
"read": ".*"
},
..........................
],
"parameters": [],
"policies": [],
"queues": [],
"exchanges": [],
"bindings": []
}
Важно! пароль в конфиг надо заносить в base64 формате:
echo "XXXXX" | base64"
после чего можно билдить контейнер и запускать его, прокидывая нужные порты и тома.
#docker #rabbitmq
pip in da docker
Словил ошибку при установке некоторых пакетов с помощью pip внутри докера - ошибка asci парсера, который не может никак разобрать символ. Решение (немного костыль конечно) - добавить в Dockerfile строчку
#troubleshooting #docker
Словил ошибку при установке некоторых пакетов с помощью pip внутри докера - ошибка asci парсера, который не может никак разобрать символ. Решение (немного костыль конечно) - добавить в Dockerfile строчку
ENV LANG C.UTF-8
#troubleshooting #docker
Перепост это конечно не круто, но тем не менее, стоит сюда это залить чтобы увидело побольше людей. Windows сделала очередную отчебучку с обновлениями и чтобы вы, господа, администраторы окон не рвали на жопе волосы с вопросом, "ну что же опять не так", читайте..
https://www.anti-malware.ru/news/2018-01-09-1447/25210?utm_source=feedburner&utm_medium=feed
#thirdparty
https://www.anti-malware.ru/news/2018-01-09-1447/25210?utm_source=feedburner&utm_medium=feed
#thirdparty
Anti-Malware
Microsoft не будет обновлять Windows без специального ключа реестра
Microsoft опубликовала на странице поддержки информацию, описывающую несовместимость антивирусных продуктов и патчей для исправления уязвимостей Meltdown и Spectre. Согласно опубликованной компанией
Ростелеком, это что, шутка? 2018 год. centos 6, ubuntu 12. Это при условии что публичная поддержка была остановлена 04.2017
#whatever
#whatever
Ленимся по-полной
Когда я начал изучать linux, использовал способ задания прав в виде десятичного представления маски с правами:
Приходилось считать эту маску (сейчас то наиусть помнишь)
Потом я узнал что, например, можно для задания бита исполнения скрипту писать ключ +x и уже не считать эти маски. самые нужные я знал и так - 755, 750, 400, а отнять или добавить права у группы\пользователя\остальных можно с помощью ключей u\g\o +\- r\w\x.
Сегодня я узнал что цифровое представление можно вообще не использовать, указывая параметры вот так:
Это куда медленнее, чем написать 750, но куда проще для понимания новичков.
#newbie #bash
Когда я начал изучать linux, использовал способ задания прав в виде десятичного представления маски с правами:
chmod 750 file
Приходилось считать эту маску (сейчас то наиусть помнишь)
Потом я узнал что, например, можно для задания бита исполнения скрипту писать ключ +x и уже не считать эти маски. самые нужные я знал и так - 755, 750, 400, а отнять или добавить права у группы\пользователя\остальных можно с помощью ключей u\g\o +\- r\w\x.
Сегодня я узнал что цифровое представление можно вообще не использовать, указывая параметры вот так:
chmod u=rwx,g=r-x,o=---
Это куда медленнее, чем написать 750, но куда проще для понимания новичков.
#newbie #bash
uwsgi && docker
Замечательный софт, без сомнения.
Проблемы запуска uwsgi в docker ровно две - и обе они кроются в init скриптах автора.
1) /etc/init.d/uwsgi start вываливается с ошибкой. вот просто так, из коробки, сразу. Погружаемся в исходники и начинаем искать проблему. Она кроется в выполнении этой команды:
До этого этапа все выполняется прекрасно, процессы стартуют и главное начинают работать даже после выпадения с ошибкой init-скрипта. Проблема кроется в том, что внутри докера нет прав на прочтение /proc/{id}/exe. После чего считается что процесса нет и согласно заложенному поведению выдается код возврата 0, отсюда выдается код возврата 2 (return 2), который и дает в результате ошибку запуска. Обсуждение этого косяка при запуске разного ПО идет аж с 14 года: https://github.com/moby/moby/issues/6800.
Workaround:
a) исправляем в файле /usr/share/uwsgi/init/specific_daemon в приведенном мною выше коде ключ --exec на --startas. Согласно ману (да нет, шутка, согласно ману они одинаково работают, так что согласно форумам) при использовании ключа startas будет пропущена проверка /proc/{id}/exe и просто проверяется запущен ли процесс с таким pid. (https://chris-lamb.co.uk/posts/start-stop-daemon-exec-vs-startas)
b) запуск контейнера с ключем --cap-add=SYS_PTRACE. В этом случае править ничего не нужно.
с) не использовать авторские init-скрипты и запускать напрямую
2) После запуска /etc/init.d/uwsgi start скрипт прекрасно отрабатывает и выходит. Докер естественно после этого завершается. Причем демонизация захардкожена автором в скрипте запуска, без возможности указать в конфиге хочешь ты этого или нет. На этом моменте я все же психанул и сначала поправил скрипт запуска, но потом понял что все же это не тру путь и нужно от этого отказываться, делая просто одну строчку запуска и один конфиг файл.
В итоге что было сделано:
1) в конфиг добавлены следующие параметры (и остальные из дефолтного конфига):
2) в Dockerfile:
таким образом мы избавились и от той левой проверки из п.1 и от ключа демонизации из п.2, и сами выставили права и место pid\socket.
#troubleshooting #docker #uwsgi
Замечательный софт, без сомнения.
Проблемы запуска uwsgi в docker ровно две - и обе они кроются в init скриптах автора.
1) /etc/init.d/uwsgi start вываливается с ошибкой. вот просто так, из коробки, сразу. Погружаемся в исходники и начинаем искать проблему. Она кроется в выполнении этой команды:
start-stop-daemon --start --quiet \
--pidfile "$PIDFILE" \
--exec "$DAEMON" \
--test > /dev/null \
&& return 2
До этого этапа все выполняется прекрасно, процессы стартуют и главное начинают работать даже после выпадения с ошибкой init-скрипта. Проблема кроется в том, что внутри докера нет прав на прочтение /proc/{id}/exe. После чего считается что процесса нет и согласно заложенному поведению выдается код возврата 0, отсюда выдается код возврата 2 (return 2), который и дает в результате ошибку запуска. Обсуждение этого косяка при запуске разного ПО идет аж с 14 года: https://github.com/moby/moby/issues/6800.
Workaround:
a) исправляем в файле /usr/share/uwsgi/init/specific_daemon в приведенном мною выше коде ключ --exec на --startas. Согласно ману (да нет, шутка, согласно ману они одинаково работают, так что согласно форумам) при использовании ключа startas будет пропущена проверка /proc/{id}/exe и просто проверяется запущен ли процесс с таким pid. (https://chris-lamb.co.uk/posts/start-stop-daemon-exec-vs-startas)
b) запуск контейнера с ключем --cap-add=SYS_PTRACE. В этом случае править ничего не нужно.
с) не использовать авторские init-скрипты и запускать напрямую
2) После запуска /etc/init.d/uwsgi start скрипт прекрасно отрабатывает и выходит. Докер естественно после этого завершается. Причем демонизация захардкожена автором в скрипте запуска, без возможности указать в конфиге хочешь ты этого или нет. На этом моменте я все же психанул и сначала поправил скрипт запуска, но потом понял что все же это не тру путь и нужно от этого отказываться, делая просто одну строчку запуска и один конфиг файл.
В итоге что было сделано:
1) в конфиг добавлены следующие параметры (и остальные из дефолтного конфига):
...
stats = 0.0.0.0:9090
socket = 0.0.0.0:3031
pidfile = /run/uwsgi/pid
socket = /run/uwsgi/socket
...
2) в Dockerfile:
...
COPY app.ini /etc/uwsgi/apps-enabled/app.ini
RUN mkdir /run/uwsgi && chown www-data /run/uwsgi
CMD ["/usr/bin/uwsgi", "--ini", "/etc/uwsgi/apps-enabled/app.ini"]
таким образом мы избавились и от той левой проверки из п.1 и от ключа демонизации из п.2, и сами выставили права и место pid\socket.
#troubleshooting #docker #uwsgi
Админим с Буквой
Перепост это конечно не круто, но тем не менее, стоит сюда это залить чтобы увидело побольше людей. Windows сделала очередную отчебучку с обновлениями и чтобы вы, господа, администраторы окон не рвали на жопе волосы с вопросом, "ну что же опять не так", читайте..…
https://support.microsoft.com/en-us/help/4072699/january-3-2018-windows-security-updates-and-antivirus-software
А вот ссылка на офф страничку MS по этому поводу
А вот ссылка на офф страничку MS по этому поводу
Microsoft
Important: Windows security updates and antivirus software
Microsoft has identified a compatibility issue with a small number of anti-virus software products.
New Intel AMT Security Issue Lets Hackers Gain Full Control of Laptops in 30 Seconds - http://sketchproducts.blogspot.com/2018/01/new-intel-amt-security-issue-lets.html
#vulns
#vulns
ansible notify to telegram
Идем по пути наименьшего сопротивления. зачем нам целый модуль, который работает неизвестно как (а работает он через жопу, ибо не работает на 2.4 ансибле из коробки), если уведомление можно послать простым POST-запросом? а это можно сделать кучей способов. И, да, в этом случае уже не зазорно воспользоваться модулем, который это за нас сделает. Пример 10-строчного плейбука, который это сделает. Текст сообщения специально вынесен в переменную.
где secret - то что вы получили от @BotFather при создании бота,
chat_id - можно получить от бота @tgfinger_bot
Помните, что необходимо либо добавить бота в чат, либо первым написать ему, чтобы он мог написать вам в ответ
#ansible
Идем по пути наименьшего сопротивления. зачем нам целый модуль, который работает неизвестно как (а работает он через жопу, ибо не работает на 2.4 ансибле из коробки), если уведомление можно послать простым POST-запросом? а это можно сделать кучей способов. И, да, в этом случае уже не зазорно воспользоваться модулем, который это за нас сделает. Пример 10-строчного плейбука, который это сделает. Текст сообщения специально вынесен в переменную.
- hosts: localhost
vars:
TELEGRAM_SECRET: "XXXXXXXXX:XXXXXXXXXXX"
text: "blah-blah"
tags: ['find']
gather_facts: no
tasks:
- name: TG notify
uri:
url: "https://api.telegram.org/bot{{TELEGRAM_SECRET}}/sendMessage"
method: POST
body: "chat_id=yyyyyyyyy&parse_mode=Markdown&text={{text}}"
status_code: 200
где secret - то что вы получили от @BotFather при создании бота,
chat_id - можно получить от бота @tgfinger_bot
Помните, что необходимо либо добавить бота в чат, либо первым написать ему, чтобы он мог написать вам в ответ
#ansible
Получаем id-шники чатов в tg
можно просто даже в браузере это сделать, составив такой URL:
```https://api.telegram.org/botXXXXXXX:YYYYYYYY/getUpdates```
#telegram
можно просто даже в браузере это сделать, составив такой URL:
```https://api.telegram.org/botXXXXXXX:YYYYYYYY/getUpdates```
#telegram
Капитанство, но все же есть пара интересных моментов. И да, заголовок дурной.
https://www.hpe.com/us/en/insights/articles/the-linux-commands-you-should-never-use-1712.html
#thirdparty #commands
https://www.hpe.com/us/en/insights/articles/the-linux-commands-you-should-never-use-1712.html
#thirdparty #commands
HPE
The Linux commands you should NEVER use
Unless, of course, you like killing your machines. @Enterprisenxt