Админим с Буквой
5.5K subscribers
302 photos
8 videos
59 files
1.15K links
Канал о системном администрировании, DevOps и немного Инфобеза.

По всем вопросам обращаться к @bykva. Рекламу не размещаю.
Download Telegram
rabbitmq 3.7 && docker

Эта история о том, как подружить зоопарк из кроликов и китов. Задача заключается в автоматическом создании очередей, пользователей и прав при запуске контейнера.

С версии 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 строчку

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
docker ps not found

Solution:
apt install procps


#troubleshooting #docker
Ростелеком, это что, шутка? 2018 год. centos 6, ubuntu 12. Это при условии что публичная поддержка была остановлена 04.2017

#whatever
Ленимся по-полной

Когда я начал изучать linux, использовал способ задания прав в виде десятичного представления маски с правами:
chmod 750 file

Приходилось считать эту маску (сейчас то наиусть помнишь)
Потом я узнал что, например, можно для задания бита исполнения скрипту писать ключ +x и уже не считать эти маски. самые нужные я знал и так - 755, 750, 400, а отнять или добавить права у группы\пользователя\остальных можно с помощью ключей u\g\o +\- r\w\x.
Сегодня я узнал что цифровое представление можно вообще не использовать, указывая параметры вот так:
chmod u=rwx,g=r-x,o=---

Это куда медленнее, чем написать 750, но куда проще для понимания новичков.

#newbie #bash
strace in da docker

add --cap-add=SYS_PTRACE key to docker run string

#docker
uwsgi && docker

Замечательный софт, без сомнения.

Проблемы запуска 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
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
ansible notify to telegram

Идем по пути наименьшего сопротивления. зачем нам целый модуль, который работает неизвестно как (а работает он через жопу, ибо не работает на 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
Такой замечатеьный вид жсона дает 59 FF
Лабораторная_работа__введение_в.pdf
1.2 MB
Черновик статьи про докер на хабр. Жду ваших замечаний =)