Инвариант к direct-zookeeper-non-production. Отличия:
* другой подход к деплою - один раз нужно описать конфигурацию кластера и запустить плейбук, вместо нескольких итераций "прочитать README", "вписать параметры в командной строке", "запустить плейбук"
* другой способ дистрибуции zookeeper - docker-контейнером, вместо пакетов; oracle jre 8u92 внутри
* возможность растянуть кластер на *.haze и dev-машины одновременно
* docker из официального репозитория
* почти готовый мониторинг живости, только сконфигурировать проверки

Ограничение:
* в нескольких местах (внутри docker-image, в имени juggler-событий и в скприте для старта контейнера)
  прибито гвоздями, что запускается все из под пользователя ppalex@ 

Предварительные требования:
* ansible 2.*
* для dev-машин:
  - уже установлены все необходимые пакеты (docker, yandex-du-zookeeper-tools, yandex-du-juggler-perl)
  - docker запущен
  - логин (от которого выполняется playbook) есть в группе docker
  - есть ipv6-only доменное имя
* для haze-машин:
  - инстансы уже созданы
  - у логина есть sudo nopasswd (если судо с паролем - запускать с ключом --ask-become-pass)
  - ipv6-only сеть
  - хостнейм ноды заканчивается на .haze.yandex.net
* загруженный в docker-registry ppccloud-registry-test.yandex.ru:5000 специально подготовленный образ
  ppalex_zookeeper_on_oracle_jre:3.4.8-8u92, инструкция по изготовлению и загрузке - ниже

Деплой:
* отредактировать файл hosts, вписать в него (по одной на строку) fqdn нод кластера
* если требуются нестандартные порты - дописать в соответствующих строках (через пробелы, после хоста)
  clientPort=XX, peerPort=YY, serverPort=ZZ; умолчания соответственно 2181, 2182, 2183.
* запустить плейбук:
  ansible-playbook -i hosts zk-cluster.yml
* добавить и синхронизировать juggler-проверки (полностью ручное действие, т.к. ansible-juggler не рабаотет под ansible2)
  - добавить в/отредактировать файл direct-utils/dev-juggler-checks/dev.yml, где
    service - как был добавлен в crontab внутри playbook
    в children - перечислить все ноды, записанные в hosts по их основным (!) fqdn
----------------------------------------------------------------------
    - juggler_check: "произвольное название"
      args: "{{ check_template|hash_merge(all_is_ok, skip_unreach) }}"
      with_items:
        - service: ppalex.zookeeper.check
          host: "{{ dev_host }}"
          children:
            - ppalex-zk-iva01.haze.yandex.net
            - ppcdev4.yandex.ru
            - ppcdev6.yandex.ru
          ttl: 600
----------------------------------------------------------------------
  - для haze машин нужно сконфигурировать проверку unreachable чтобы недоступность хоста
    исключала проверку zk на нем, для этого в тот же файл добавить/отредактировать, где
    service - произвольное название
    в children перечислить все ноды на haze-машинах, добавив :UNREACHABLE в конце (обязательно)
----------------------------------------------------------------------
    - juggler_check: 'произвольное название'
      args:
        jcheck_mark: direct_dev
        service: ppalex.haze.UNREACHABLE
        children:
          - ppalex-zk-iva01.haze.yandex.net:UNREACHABLE
        host: "{{ dev_host }}"
        icmpping:
        logic_or:
        ttl: 300
----------------------------------------------------------------------
  - синхронизировать:
    ANSIBLE_LOG_PATH=/dev/null ansible-playbook -i /dev/null dev.yml
  - пойти в powny.yandex-team.ru и подписаться на уведомления о проверке




Подготовка docker-image:
# ссылка будет отличаться для других версий
docker_host$ wget http://www-us.apache.org/dist/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz
docker_host$ wget --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u92-b14/server-jre-8u92-linux-x64.tar.gz
docker_host$ docker run --tty=true --interactive=true --rm=false ubuntu:14.04 /bin/bash
# запоминаем id контейнера (он отображается в bash приглашении), далее по тексту XXX
docker_host$ docker cp server-jre-8u92-linux-x64.tar.gz XXX:/root/

XXX$ cd /root/
XXX$ mkdir -p /opt/jdk
XXX$ tar -zxf server-jre-8u92-linux-x64.tar.gz -C /opt/jdk
XXX$ update-alternatives --install /usr/bin/java java /opt/jdk/jdk1.8.0_92/bin/java 100
XXX$ update-alternatives --install /usr/bin/javac javac /opt/jdk/jdk1.8.0_92/bin/javac 100
XXX$ tar -xvf zookeeper-3.4.8.tar.gz
XXX$ mkdir -p /usr/share/java
XXX$ cp zookeeper-3.4.8/dist-maven/zookeeper-3.4.8.jar /usr/share/java/
XXX$ cp zookeeper-3.4.8/lib/*.jar /usr/share/java/
# check
XXX$ java -version
# cleanup
XXX$ rm server-jre-8u92-linux-x64.tar.gz
XXX$ rm -r zookeeper*

docker_host$ docker commit XXX
# sha256:YYY - получившийся id образа без костылей и посторонних пользователей
docker_host$ docker tag sha256:YYY ppccloud-registry-test.yandex.ru:5000/zookeeper_on_oracle_jre:3.4.8-8u92
docker_host$ docker push ppccloud-registry-test.yandex.ru:5000/zookeeper_on_oracle_jre:3.4.8-8u92

# запустить новый контейнер с получившимся образом
docker_host$ docker run --tty=true --interactive=true --rm=false ppccloud-registry-test.yandex.ru:5000/zookeeper_on_oracle_jre:3.4.8-8u92 /bin/bash
# запоминаем id контейнера (он отображается в bash приглашении), далее по тексту WWW
docker_host$ docker cp zookeeper-3.4.8.tar.gz WWW:/root/

WWW$ addgroup --system --gid 9000 zookeeper
WWW$ adduser --uid 28157 --system --disabled-login --ingroup zookeeper --home /home/zookeeper/ --gecos "User for zookeeper with ppalex UID" --shell /bin/bash zookeeper

docker_host$ docker commit WWW
# sha256:ZZZ - получившийся id образа с подкостыленным пользователем под zk, который имеет "правильные" uid и gid на host-машине 
docker_host$ docker tag sha256:ZZZ ppccloud-registry-test.yandex.ru:5000/ppalex_zookeeper_on_oracle_jre:3.4.8-8u92
docker_host$ docker push ppccloud-registry-test.yandex.ru:5000/ppalex_zookeeper_on_oracle_jre:3.4.8-8u92

XXX$ exit
WWW$ exit
docker_host$ docker stop XXX WWW
docker_host$ docker rm XXX WWW
