Meetup в Петрозаводске от axmit

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

Читать далее

From Devoops to DevOps

Интересный доклад от CTO(Chief Trolling Officer) Kris Buytaert о том, что же такое DevOps. Сейчас только ленивый не рассказывает, что же это такое, но на мой взгляд у него получилось достойно.

Выводы с которыми я согласен, что DevOps:

  • Это не о инструментах, которые применяются
  • Это о возможности изменятся
  • Это о людях и их взаимодействии

Доступ на заблокированные сайты в РФ, в частности linkendin

В РФ часто блокируют различные ресурсы, а часть из них полезная, к примеру Linkedin. Существуют множество способов, как пробиться через наш фаервол – это различные прокси и vpn. Если хочется чтобы это работало стабильно, то это будет платное решение. Естественно оно не стоит космических денег)

Для себя я решил это проще, т.к. мой блог хостится за пределами РФ, можно воспользоваться ssh для организации прокси.

Читать далее

Команда docker run из запущенного контейнера

Когда docker контейнеры начинаешь использовать чуть больше, чем просто запустить hello-world, возникают различные задачи. К примеру одна из таких это получить команду docker run из рабочего контейнера. Это сделать не сложно, вся фишка в ключе –format. Создаем файл run.tpl

 docker run \
 --name={{.Name}} \
 {{range $e := .Config.Env}}--env="{{$e}}" \
 {{end}}{{range $p, $conf := .NetworkSettings.Ports}}{{if $conf}}-p {{(index $conf 0).HostIp}}:{{(index $conf 0).HostPort}}:{{$p}} \
 {{end}}{{end}}{{range $network, $conf := .NetworkSettings.Networks}}--net {{$network}} \
 --ip {{$conf.IPAddress}} \
 {{end}}{{range $v := .HostConfig.VolumesFrom}}--volumes-from="{{.}}" \
 {{end}}{{range $v := .HostConfig.Binds}}--volume="{{.}}" \
 {{end}}{{range $l, $v := .Config.Labels}}--label "{{$l}}"="{{$v}}" \
 {{end}}{{range $v := .HostConfig.CapAdd}}--cap-add {{.}} \
 {{end}}{{range $v := .HostConfig.CapDrop}}--cap-drop {{.}} \
 {{end}}{{range $d := .HostConfig.Devices}}--device={{(index $d).PathOnHost}}:{{(index $d).PathInContainer}}:{{(index $d).CgroupPermissions}} \
 {{end}}{{range $v := .Config.Entrypoint}}--entrypoint="{{.}}" \
 {{end}}{{with .HostConfig.LogConfig}}--log-driver="{{.Type}}" \
 {{range $o, $v := .Config}}--log-opt {{$o}}="{{$v}}" \
 {{end}}{{end}}{{with .HostConfig.RestartPolicy}}--restart="{{.Name}}{{if eq .Name "on-failure"}}{{.MaximumRetryCount}}{{end}}" \
 {{end}}{{if .Config.Tty}}-t \
 {{end}}{{if .Config.Hostname}}--hostname {{.Config.Hostname}} \
 {{end}}{{if .Config.OpenStdin}}-i \
 {{end}}{{if not (.Config.AttachStdout)}}--detach=true \
 {{end}}{{if .HostConfig.Privileged}}--privileged \
 {{end}}{{if .HostConfig.AutoRemove}}--rm \
 {{end}}{{.Config.Image}} \
 {{range .Config.Cmd}}{{.}} {{end}}

И выполняем команду:

docker inspect --format "$(<./run.tpl)" target-container

На выходе получаем что-то вроде:

docker run \
    --name=/target-container \
    --env="BRANCH_NAME=split-front" \
    --env="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" \
    --env="TERM=xterm" \
    --env="DEBIAN_FRONTEND=noninteractive" \
    --env="LC_ALL=C.UTF-8" \
    --env="BUS_VERSION=0.14.11" \
    -p 0.0.0.0:80:80/tcp \
    --net internal-test \
    --ip 172.33.0.2 \
    --entrypoint="/bin/sh" \
    --entrypoint="-c" \
    --entrypoint="/entrypoint.sh" \
    --log-driver="json-file" \
    --log-opt max-file="1" \
    --log-opt max-size="50M" \
    --restart="" \
    -t \
    --hostname build4130.app.test.local \
    --detach=true \
    app:4130

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

Ошибка epmd rabbitmq в Docker контейнере

На той недели, при разворачивание тестового окружения, столкнулись с проблемой запуска RabbitMQ в Docker контейнере.

Почему-то rabbitmq падал с ошибкой:

ERROR: epmd error for host build189: address (cannot connect to host/port)

Самое интересное, что проблема воспроизводится не всегда, поэтому отловить и отдебажить ее было проблематично.

Запускали rabbitmq следующей командой(выкинул все лишнее):

docker run -d -h build189.rabbitmq.test.local --name rabbitmq rabbitmq

В гугле много раз упоминается данная проблема, но ни одно из решений нам не помогло. Но раз из ошибки следует, что rabbimq не знает хост build189, мы решили добавить его в /etc/hosts завернув его на 127.0.0.1 и больше баг не проявлял себя.
В Docker’e это делается просто:

docker run -d -h build189.rabbitmq.test.local --name rabbitmq --add-host build189:127.0.0.1 rabbitmq

Отчет о проведенном хаккатоне

У нас прошел первый в компании хакатон. Он проходил два дня в рамках только нашего отдела. В 17:00 второго дня всем необходимо было продемонстрировать результаты своей работы. Темы можно было предлагать любые. В нем приняли участие четыре команды. Наша команда была под номером – 3. О нашем опыте я и расскажу.

Читать далее

Crontab, перевод строки после последней задачи

Маленькая заметка о том, что при размещение задач в crontab необходимо всегда заканчивать их переводом строки, иначе задача не будет выполнена. Не зная этой особенности иногда можно потратить много времени на решение проблемы, почему не выполняется последняя задача из crontab? Будьте внимательны. В сети можно найти валидаторы crontab, онлайн или на каких-либо скриптовых языках. На php тоже есть примеры реализации.

Hackaton – первый день

Подходит к концу первый день хакатона. Небольшой отчет по первому дню.

Что получилось сделать за этот день:

  • Реализовали прототип удаленного управления нашими стробоскопами. С помощью него каждый может попробывать поиграться с нашим прототипом, заходите сюда, единственное задержка на нашем канале youtube примерно 30 секунд. Реализованы две веб-морды на PHP – Silex’e и Boostrap’e и Erlang – Chicago Boss. К этому всему добавилась логика в Arduino nano и магия с настройками сетей)
  • Убедились, что ethernet-кабелю можно запитывать лампы. По ним мы будем питать наши лампы.

Проблемы с которыми сегодня столкнулись:

  • Для работы Arduino ей необходимо какое-то время на инициализацию, соотвественно не возможно с ней работать по схеме сервер-клиент, клиенту приходится выставлять таймауты, что есть очень ни очень. Решили проблему, написав небольшой сокет сервер, который по сути открывает блочное устройство на чтение \ запись и вещает на свободный порт. Все внешние приложение уже общаются с портом прозрачно.
  • Инфраструктура. Из нас ни кто не имеет реального опыта в работе с arduino и вообще железом. Приходится подтягивать мат.часть на ходу.
  • Не успели все, что хотели подготовить к завтрашнему дню по аппаратной части.

Завтра должно быть продакшен решение, поэтому будет жарко. Смотрите за нами на нашем канале и нашими друзьями.