Модуль Weave + Ansible Docker

Я использую weave для запуска некоторых контейнеров, которые образуют кластер базы данных. Я заставил это работать вручную на двух хостах в EC2, выполнив следующие действия:

$HOST1> weave launch
$HOST2> weave launch $HOST1
$HOST1> eval $(weave env)
$HOST2> eval $(weave env)
$HOST1> docker run --name neo-1 -d -P ... my/neo4j-cluster
$HOST2> docker run --name neo-2 -d -P ... my/neo4j-cluster
$HOST3> docker run --name neo-1 -d -P -e ARBITER=true ... my/neo4j-cluster

Я могу проверить журналы, и все запускается нормально.

При использовании ansible я могу заставить вышеперечисленное работать, используя модуль command: ... и переменную среды:

- name: Start Neo Arbiter
command: 'docker run --name neo-2 -d -P ... my/neo4j-cluster'
environment:
  DOCKER_HOST: 'unix:///var/run/weave/weave.sock' 

Поскольку это в основном все, что делает eval $(weave env).

Но когда я использую модуль docker для ansible, даже с параметром docker_url, установленным на то же, что вы видите выше с DOCKER_HOST, DNS не разрешается между хостами. Вот как это выглядит:

  - name: Start Neo Arbiter
    docker:
      image: "my/neo4j-cluster:{{neo4j_version}}"
      docker_url: unix:///var/run/weave/weave.sock
      name: neo-3
      pull: missing
      state: reloaded
      detach: True
      publish_all_ports: True

OR

  - name: Start Neo Arbiter
    docker:
      image: "my/neo4j-cluster:{{neo4j_version}}"
      docker_url: unix:///var/run/weave/weave.sock
      name: neo-3
      pull: missing
      state: reloaded
      detach: True
      publish_all_ports: True
    environment:
        DOCKER_HOST: 'unix:///var/run/weave/weave.sock'

Ни один из них не работает. DNS не разрешается, поэтому серверы никогда не запускаются. У меня есть другие параметры сервера (например, SERVER_ID для neo4j и т. д., просто не показанные здесь для простоты).

Кто-нибудь сталкивался с этим? Я знаю, что модуль docker для ansible использует docker-py и прочее. Интересно, есть какая-то несовместимость с плетением?

ИЗМЕНИТЬ

Я должен упомянуть, что когда контейнеры запускаются, они фактически появляются в WeaveDNS и кажутся добавленными в систему. Я могу пропинговать локальное имя хоста каждого контейнера, пока он находится на хосте. Однако, когда я перехожу на другой хост, он не может пропинговать те, что на другом хосте. И это несмотря на то, что они регистрируются в WeaveDNS (weave status dns) и weave status, показывая правильное количество пиров и установленных соединений.


person alph486    schedule 07.10.2015    source источник
comment
Тем временем мой обходной путь, который я выбрал, - это использовать модуль command. Я собираюсь оставить это открытым, так как это все еще проблема AFAICT.   -  person alph486    schedule 08.10.2015
comment
Во-первых, интересно, использует ли модуль Ansible Docker клиент Python или вызывает docker? Во-вторых, подтвердите, что запросы проходят через прокси, отметив docker logs weaveproxy?   -  person errordeveloper    schedule 08.10.2015
comment
@errordeveloper да, он использует docker-py, и я не могу вспомнить журналы. Я верну изменения для тестирования в эти выходные, чтобы попробовать предложенные варианты, и опубликую их.   -  person alph486    schedule 09.10.2015
comment
Вы когда-нибудь находили решение этой проблемы выше?   -  person Mate Varga    schedule 23.08.2016
comment
@MateVarga Нет, я использовал модуль command. Я подозреваю, что это как-то связано с тем, как была реализована библиотека python, по сравнению с CLI, но не могу быть уверен.   -  person alph486    schedule 25.08.2016
comment
@ alph486 в моем случае проблема оказалась в отсутствующем хосте - теперь я использую модуль docker_container, и он отлично работает.   -  person Mate Varga    schedule 25.08.2016


Ответы (1)


Это может быть вызвано тем, что клиент отправляет структуру HostConfig в запросе Docker start, что на самом деле не так, как вы должны это делать, но поддерживается Docker "для обратной совместимости".

Weave был исправлен, чтобы справляться, но исправления еще нет в выпущенной версии. Вы можете попробовать последнюю версию моментального снимка, если вы достаточно смелы.

Вероятно, вы можете запутать его, явно установив преобразователь DNS на IP-адрес моста докеров в конфигурации ваших контейнеров — у weave есть недокументированный помощник weave docker-bridge-ip для поиска этого адреса, и он, как правило, не изменится.

person Bryan    schedule 08.10.2015