• Google заблокирован Роскомнадзором
  • Google заблокирован Роскомнадзором
    +20
    А зачем православному человеку гугль? Вот отцы жили без гугля, деды жили без гугля, и внуки тоже смогут без гугля кобылу запрячь.
  • РКН заблокировал несколько КРУПНЫХ подсетей Amazon и Google (UPD.: и продолжает блокировать новые!)
    0
    У меня оно залочено штатными средствами umatrix'а. Аналитика идёт по SSL, т.е. его банят по IP без банеров. Это означает connection timeout, а как страница себя в такой ситуации поведёт — не знаю.
  • РКН заблокировал несколько КРУПНЫХ подсетей Amazon и Google (UPD.: и продолжает блокировать новые!)
    0
    Интересно, когда гугльаналитику залочат, сайт gov.ru перестанет открываться?

  • Почему "=" означает присваивание?
    0
    Окей. Но если мы становимся на эту позицию, то что остаётся от математики?

    Если X=2, и Y=2, то X+Y=4. Эти знаки равно что обозначают?
  • Почему "=" означает присваивание?
    0
    Предположение. Если мы считаем, что X+Y=5, то оказывается, что 2+2=5, а второе утверждение ложное, значит и первое утверждение так же ложное.

    Два равно, и оба ложные, и вселенная всё ещё не взорвалась (повторно).
  • Почему "=" означает присваивание?
    +2
    Почему не валидно? Есть куча доказательств от противного, и в них всегда приходят к противоречию, это означает, что часть утверждений (со знаком равно) не являются истинными.
  • Почему "=" означает присваивание?
    0
    Всем, кто говорит, что в математике "=" означает равенство «навсегда», вот вам простой пример:

    Пусть X = 2, Y = 2. Если X + Y = 5, то 2 + 2 = 5, что неверно. Из этого следует, что X+Y ≠ 5.

    Скажите, в этом нехитром упражнении, сколько раз я использовал "=" в странном смысле?
  • Continuous Integration для новичков
    0
    Если проект гигантский, а вносимые изменения локальные, то имеет смысл держать стейджинг (который можно переподнять), куда изменения могут вливаться малой кровью (быстро).

    Плюс: быстро
    Минус: может пропустить баг из-за того, что предыдущие тесты поменяли окружение.

    Частично можно компенсировать, если переподнимать стейджинг автоматически каждой ночью.
  • Генеральная уборка в компании: как мы переворошили магазины
    +1
    Не «продавец на час» (с таким сложно — матответственность и т.д.), а «консультант на час».
  • Генеральная уборка в компании: как мы переворошили магазины
    +3
    Мне сейчас очень комфортно вашими деньгами раскидываться. Что бы я сделал, чтобы этот имидж поломать? Например, ввёл бы должности с свободным появлением на работе. Т.е. кто-то соблюдает график, а у кого-то можно приходить когда интересно. Оплата соответствующая. Например, те, кто блюдут график — получают больше. Представьте себе студента, который на 3 часа после лекций приходит потусить в магазине (попродавать) пока ему интересно. Мотивация у него выше, выгорания точно нет.

    Дайте людям оплачиваемое время на интересные ко-проекты (рамках тематики компании). Хочет кто-то провести местный турнир? Вы поддерживаете. Кто-то ваяет свою настолку? Дайте сколько-то часов рабочего времени это делать.

    Итог? Персонал, который любит свою (уникальную!) работу. Минус? Бабло и организационные сложности.
  • Генеральная уборка в компании: как мы переворошили магазины
    +1
    Аргумент хороший. Но всё-таки, у меня ощущение, что у вас получается обычная такая компания в которой корпоративные правила превыше здравого смысла, периодически начальство выдумывает странное, а инициатива наказуема.

    (это я со стороны издалека смотрю).
  • Логотип выборов за 37 миллионов VS. за 75 тысяч
    +2
    Критика нового логотипа: теряется традиционность, аппеляция к узнаваемым характерным атрибутам стиля. Ленточка, ВСЁ КУРСИВНЫМ КАПСОМ и прочие атрибуты госмашины.

    Аутентичность теряете.
  • Генеральная уборка в компании: как мы переворошили магазины
    0
    Я скажу странную вещь. А где на этой работе креативность, кофе в офисе и горизонтальные связи? Выглядит как «пахать-пахать-пахать». А где интерес-то?
  • Дата-центр в миниатюре
    0
    Рассказжу одну байку. Звонит мне знакомый бизнесмен, занимающийся оптовой торгово-закупочной деятельностью, и спрашивает: у меня есть ангар и 150кВт мощности. Хочу сделать коммерческий ДЦ. С чего начать?
  • Ansible не так прост
    +1

    Я с некоторыми мелкими глюками использую LXC для быстрой разработки (если использовать LXC как виртуалку, т.е. по SSH, то глюков нет, я говорю про lxc-transport, который позволяет работать с контейнерами без ssh). В принципе, можно поднять любую виртуализацию руками — тот же вагрант вам всего лишь фигачит виртуалки в virtualbox'е. Если у вас локальный линукс — то lxc или libvirt + kvm (virtualbox — ужасен). На других платформах выбирайте сами, но идея состоит в том, что не надо пытаться автоматизировать всё сразу. Поднимите виртуалки старыми методами (install from ISO), работайте с ними как с серверами.


    Насчёт стейджинга — обычно у людей есть доступ к вычислительным рерсурсам работодателя. Если нет, то неприятно, да. Хотя я когда xen отлаживал, то я просто старый компьютер юзал для этого.


    2) apt слишком простой, чтобы делать его playbook'ой или ролью. У меня есть роль apt_install, которая вызывается из common.yaml и ставит туда стандартный набор пакетов, но это ерунда и не надо об этом заморачиваться. Таска и таска.
    3) Я вызываю не update_cache, а dist=true, что означает "сделай мне apt-get update && apt-get dist-upgrade" — ставит все апдейты на сервер в процессе "bootstrap".
    4) munin-node-configure --sh | sh — ужасная строчка. В таком виде что shell, что модуль — всё равно не ясно будет что там происходит внутри. Я бы попробовал расковырять и сделать руками (всё что там делается), но если трудно — обычного shell будет достаточно.


    5) Вопрос хранения больших файлов — очень, очень, очень обширный топик. Вариантов много: приватный репозиторий, swift (cloud), иногда — submodule в git'е. В репе бинарники лучше не хранить. Какие-то мелкие скрипты — может быть, блобы — однозначно нет.


    Но у компании должен быть workflow для работы с блобами. Это большая задача и её нельзя "обойти".

  • Долбанутые командные игры
    0
    Game the system требует правил, которые достаточно хорошо прописаны и энфорсены, чтобы можно было видеть «по правилам оно или нет». Хорошие хаки строго по правилам, а на выходе безобразие.
  • Долбанутые командные игры
    +3
    Не, вы не понимаете. Когда вы правила нарушаете, то это одно. Если вы тестируете правила на прочность и непротиворечивость, это другое.

    Утрируя, вам государство сказало показать всю вашу переписку, и вы ей настроили перенаправление всех мейллистов, на которые подписаны, включая usenet.daily.allgithub.updates.uue.

    Или, у вас на руках купон со скидкой 50% и скидкой -20. Вы берёте что-то за 40, и предъявляете оба купона (а на них не сказано, что они не суммируются). Дальше у вас дебат с принимающим о том, кто выбирает порядок применения купонов.
  • Ansible не так прост
    0

    В моих тестах ваш второй пролетал успешно как skipped, но если убрать set_fact, падал. is defined видимо, специально обрабатывают.

  • Долбанутые командные игры
    0
    В манчкине game the system — часть system, не сильно интересно.
  • Ansible не так прост
    0
    2.5 — мажорный релиз, а у ансибла довольно крутые изменения каждый мажорный релиз, так что нужно использовать выбранную версию. А между ними миграция класса «c postgres 9.3 на 10». Кстати, такая же фигня и у остальных систем — рядом отдел планирует переезд на новый chef уже пол-года.

    Я планирую миграцию на 2.5 после следующего минорного релиза. Пока только changelog глянул и всё.
  • Ansible не так прост
    0
    ansible-lint, atom + linter-ansible-lint
  • Ansible не так прост
    0
    ---
    - hosts: all
      gather_facts: no
      tasks:
       - debug: msg="{{foo}}"
         when: foo is not string

    ansible-playbook -i localhost, 1.yaml


    fatal: [localhost]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'foo' is undefined\n\nThe error appears to have been in '/tmp/1.yaml': line 5, column 6, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n tasks:\n — debug: msg=\"{{foo}}\"\n ^ here\nWe could be wrong, but this one looks like it might be an issue with\nmissing quotes. Always quote template expression brackets when they\nstart a value. For instance:\n\n with_items:\n — {{ foo }}\n\nShould be written as:\n\n with_items:\n — \"{{ foo }}\"\n\nexception type: <class 'ansible.errors.AnsibleUndefinedVariable'>\nexception: 'foo' is undefined"}


    ЧЯДНТ?


    Мораль: is not string не катит для несуществующих переменных.

  • Ansible не так прост
    +3
    Ну вот я yaml-то это не надо гнать. У yaml всё ровненько и хорошо. Выучил возможности (их конечное количество и они не меняются) и ладушки.

    Вот у ansible — что ни версия, то революция. То им loop вместо with_ захотелось, то им with надо с кавычками (а раньше без), то у них теперь dynamic includes которые глючат и бибикают и перезаписывают default'ами роли set_facts, и т.д.

    К ансиблу тут претензий куча. Но yaml за что гнобить-то?
  • Ansible не так прост
    0

    is not string очевидно упадёт и без всякого with_items, потому что чтобы сделать type(foo) нужно иметь foo определённым.

  • Долбанутые командные игры
    +1
    Хаккер, это тот, кто умеет использовать правила не по правилам. game the system и т.д. И это крайне благородный скилл, который нужно всячески в детях воспитывать. out of box thinking, etc.
  • Ansible не так прост
    +2

    Почему не очевидно? Табуляция отрезается по первому элементу. Если хочется с пробелами в начале, есть |+4 и т.д.


    yaml надо изучить, но когда изучишь, лучше языка (для написания данных) трудно придумать. Именно потому, что в нём есть ответы на все вопросы.


    Насчёт опечаток — есть линтеры для yaml'а и ансибла, они ошибки подсвечивают.

  • Ansible не так прост
    0
    Я думаю, это результат ленивых вычислений jinja2. item — это же foo|next, правильно?
  • Новая микроархитектура процессоров Intel: быстро, но не бесплатно
    0
    Так же и новая микроархитектура Intel CPU, в которой алгоритмы неупорядоченного исполнения (OOO execution) и предсказания ветвлений (Branch Prediction) будут полностью засекречены,


    Security through obscurity! Мы придумаем такой алгоритм, который хаккеры никогда не узнают и не догадаются, потому что мы умные, а хаккеры тупые, так что тупые хаккеры никогда не сумеют реверс-инженернуть наш алгоритм, мы же умные!

    Seriously, Intel? STO как ответ на узявимости? Может, ещё CVE'шки заскретить, чтобы никто не знал про дыры и не мог их использовать?
  • Ansible не так прост
    +3

    Читать удобно. Много строк, но разобраться в чужой плейбуке, если там выкрутасов на сайд-эффектах не делали, чаще всего очень легко. А ещё из-за того, что yaml, то очень легко получаются вот такие конструкции:


    - name: Configure settings
      become: yes
      copy:
        dest: /etc/default/foo
        content: |
          # managed by ansible
          PORT={{iinternal_port}}
          ADDRESS={{internal_ip}}

    Даже питоновские тройные кавычки не катят — | позволяет иметь правильное многострочное форматирование с сохранением отступов. Более того, я не знаю ни одного другого формата энкапсуляции, который бы такое позволял.

  • Ansible не так прост
    +1

    Это не брюзжание. Это непрерывное ощущение, что процесс не smooth, и что там постоянно кулибинство. К сожалению, более адекватной системы нет.

  • Ansible не так прост
    0

    Неа. is defined проверяет на то, определено или нет. Если нет, то блок skipped.


    ---
    - hosts: all
      gather_facts: no
      tasks:
       - debug: msg="{{foo}}"
         when: foo is defined
         with_items: '{{foo}}'
    

    ansible-playbook -i localhost, 1.yaml


     ______________
    < TASK [debug] >
     --------------
            \   ^__^
             \  (oo)\_______
                (__)\       )\/\
                    ||----w |
                    ||     ||
    
    skipping: [localhost]
  • Ansible не так прост
    +1
    Полный список мест не знаю, я обычно в корне гита храню (в соотв. каталоге). Вот что документация говорит:
    You can enable a custom action plugin by either dropping it into the action_plugins directory adjacent to your play, inside a role, or by putting it in one of the action plugin directory sources configured in ansible.cfg.
  • Ansible не так прост
    +2
    Да, ещё: если проект живёт и в command что-то, что не получается модулями, но нужно, то можно написать свой модуль. Модуль на питоне это лучше, чем bash + register с yaml'ом и jinja для парсинга вывода модуля.

    Модули в репозитории с проектом — это нормально.
  • Ansible не так прост
    +7

    Ух. Много. Я попробую ответить на некоторые вопросы, но в целом хочу сказать, что все приключения с vagrant'ом связаны с тем, что vagrant — ужас. Не используйте его, у него слишком много полиси. Для начала освоения — поднимите стейджинг руками, настройте начального пользователя и юзайте его. Автоматизация того, что не понимаешь — это боль и отчаяние, потому что от тебя скрывают ошибки нижележащего уровня.


    По сказанному: update_cache надо делать только в качестве параметра для установки пакетов. Отдельной таской — глупо (и не понятно, оно changed или нет, и даже если файлы поменялись, то нас это касается или нет?). Если очень хотите, то можно в эту таску написать changed_when: False, но я обычно делаю вот так:


    - name: Install packages
      apt: name={{item}} update_cache=yes cache_valid_time='{{apt_cache_valid_time}}'
      with_items: '{{packages}}'
      register: apt_result
      retries: 10
      delay: 10
      until: apt_result|success
      when: packages is defined
      tags:
       - apt
       - install

    При этом у меня есть playbook'а для update (которая устанавливает обновления софта) — она переопределяет дефолтное apt_cache_valid_time в 1. Фигня с retries — баг в lxc-транспорте, который я юзаю на локальной машине (он падает если в выводе больше 64кб текста).


    Become для не-рута и sudo:
    1) Пакет acl — на все хосты обязательно. Вся фигня возникла из-за security-дыры на многопользовательских машинах, которую решили залатать, даже если она не кусает однопользовательские.
    2) все атрибуты become/become_user наследуются от уровня выше. become на tasklist (рядом с hosts) наследуется на все такски. Так же как и become_user. Моё собственное правило — минимизировать become, т.е. вешать его только на таски внутри ролей.


    Насчёт начального появления питона на хосте.


    Вот мой bootstrap.yaml, позволяющий настроить python и т.д. даже если хост был переустановлен:


    ---
    - hosts: all
      gather_facts: no
      serial: 1
      tasks:
       - name: Remove old facts
         meta: clear_facts
       - name:
         set_fact:
            host_v1: '{{ansible_ssh_host}}'
            host_v2: '{{ansible_host}}'
         tags:
          - always
       - name: Forcefully drop fact cache for host
         local_action: file path=.facts/{{inventory_hostname}} state=absent
       - name: remove old server key
         local_action: command ssh-keygen -R '{{host_v1}}'
         failed_when: false
       - name: remove old server IP key
         local_action: shell ssh-keygen -R `host {{host_v1}}|awk '{print $4}'`
         failed_when: false
       - name: remove old server key
         local_action: command ssh-keygen -R '{{host_v2}}'
         failed_when: false
       - name: remove old server IP key
         local_action: shell ssh-keygen -R `host {{host_v2}}|awk '{print $4}'`
         failed_when: false
    - hosts: all
      gather_facts: no
      tasks:
       - name: Remember sever key and install python
         raw: test -x /usr/bin/python || sudo apt-get update && sudo apt-get -y install python
      vars:
        ansible_ssh_extra_args: '-o StrictHostKeyChecking=no'
    - hosts: all
      become: true
      strategy: free
      pre_tasks:
       - apt: update_cache=yes upgrade=dist
      roles:
       - mivok0.users
       - Stouts.sudo
       - george.shuklin.reboot-if-needed-for-upgrade

    В этом скрипте много боли и хаков, но он (почти) работает (предполагается, что хосты resolvable). Иногда на ребутах отваливается чуток (после того, как всё сделал), планирую поправить.


    Остальное попробую прокомментировать чуть позже.

  • Как мы в ISPsystem резервные копии делали. Часть первая
    0
    Если у вас данные после восстановления (или время восстановления) не соответствуют ожиданиям бизнеса, у вас плохой IT-процесс.

    Что делать? Шардинг, большие мощности, смена типа БД, etc. Проблема решаема в любом случае. Если денег ни на что нет, то остаётся expectation management.

    Если вы не можете себе позволить на стейджинге поднять копию продакшена (минус вопросы всяких PCI DSS), то ваш бизнес зависит от того, сколько выпил А Гуй Вам в ночь перед тем, как паял провод 12 В в БП рядом с проводом 5В.
  • Генеральная уборка в компании
    +3

    А если гендиректор задержался на встрече, то он тоже "раб"?


    Вопрос же не в том, могут планировать вечер или нет, а как на это реагирует компания. Например, есть такая вещь, как сверхурочные.

  • Генеральная уборка в компании
    0

    Как вы понимаете, что ничего не сломали?

  • Генеральная уборка в компании
    +1

    Нет, идеального мира не бывает. Задачей рефакторинга часто как раз и является распутывание "слипшихся" частей. Но для самой слипшейся мерзкости можно написать тест, который её проверит. Даже если придётся сделать mock.patch("god.create", return_value=mock.MockWorld).


    Распутал два кусочка, дальше можно уже чуть легче третий. Это очень энергозатратный процесс, который точно не терпит спешки и оверкомитмента (по кусочку за раз).


    Часто нужно сначала отрефакторить ужасно (но чуть менее связно), а потом уже переписывать хорошо. На ужасных кусках уже есть тесты и "хорошо" можно писать не боясь сломать экзотическую хрень.

  • Как мы в ISPsystem резервные копии делали. Часть первая
    0
    Есть ещё четвёртая группа: те, кто проверяет процедуры восстановления. Если вы можете загрузить бэкап базы в тестовую СУБД, это не означает, что вы можете поднять СУБД на новом сервере, или что содержимое бэкапа похоже на данные.

    Полный регламент:

    1) Автоматический провиз сервера/виртуалки/контейнера
    2) Подъём СУБД с нуля
    3) Загрузка резервной копии
    4) Комплект SQL тестов (для postgres — pgtap), проверяющих, что данные в SQL «похожи» на свежие и правильные (число клиентов, данные «за вчера», наличие ключевых таблиц, какие-то domain specific queries).
    5) Всё это под таймером, гарантирующим, что восстановление происходит за время из SLA.

    P.S. Это всё должно делаться роботами и каждый день (каждый интервал времени после бэкапа).