2016-10-07 3 views
4

Я пытаюсь развернуть службу Docker в роем, но всегда в конечном итоге с запуском контейнера на моем локальном хосте (тот, который я использую в качестве менеджера докер роя) и без обслуживанияИспользование модуля docker_service анзибль развернуть службу роиться

Вот моя настройка:

У меня есть 3 узла Docker (v.1.12.1), который включает в себя один хост, работающий как менеджер, и два рабочих узла, все запущенные на CentOS 7. На узле менеджера (localhost) запускаю Ansible (v. 2.1.1.0) playbook, а рой уже сконфигурирован и работает

Swarm: active 
NodeID: d9h5xa832ax7wzeq8q44fjld3 
Is Manager: true 
ClusterID: 9cztoin3gy2ntbwehsmrkjuxi 
Managers: 1 
Nodes: 3 
Orchestration: 
    Task History Retention Limit: 5 
Raft: 
    Snapshot Interval: 10000 
    Heartbeat Tick: 1 
    Election Tick: 3 
Dispatcher: 
    Heartbeat Period: 5 seconds 
CA Configuration: 
    Expiry Duration: 3 months 
Node Address: 10.25.190.209 

Начиная с PlayBook, который имеет этот код

- hosts: localhost 
    name: Run JMeter test 
    vars_files: 
    - user.config.yml 
    vars: 
    execute_tpcds_test : "{{ run_tpcds_test }}"  
    roles: 
    - { role: run_jmeter, when: execute_tpcds_test is defined and execute_tpcds_test ==1 } 

Который называет эту роль:

- name: Deploy tpcds_tpg service to swarm 
    docker_service: 
    project_name: tpcds-tpg 
    definition: 
     version: '2' 
     services: 
     run_tests: 
      image: 'pbench/tpcds_tpg' 
      volumes: 
      - /opt/pbench/run_output/ 
      command: ./run_jmeter.sh "{{jmeter_output_dir}}" 
    register: output 
- debug: var=output 

Когда я бегу ansible-playbook ./site.yml я в конечном итоге с запущенным контейнера. Ведение docker ps -a дисплеи

[[email protected] tpcds-tpg]$ docker ps -a 
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS    NAMES 
fef245b41365  pbench/tpcds_tpg "./run_jmeter.sh /opt" 21 seconds ago  Up 20 seconds       tpcdstpg_run_tests_1 

И делать docker service ls не показывает услуг работает, так это выглядит, как docker_service развертывает свое изображение в качестве локального контейнера, а не в качестве службы на роя

Так что мое предположение было то, что если у меня есть активный рой на машине, которая является менеджером рой, и я использую модуль Ansible docker_service, тогда он автоматически узнает о рое и развернет службу к нему. Похоже, мое предположение неверно, и я не могу найти никаких документов, сообщений в блогах и т. Д., Которые подскажут мне, что делать и чего мне не хватает. Несчастные эксперты, пожалуйста, помогите!

+1

Не знаете, почему мой вопрос был опущен. Если что-то еще у меня пропало, скажите, пожалуйста, так, и я с удовольствием добавлю дополнительные сведения. – Bostone

+0

Это не особенно связано с разработкой программного обеспечения. Это, по-видимому, в первую очередь касается системного администрирования и сетевого взаимодействия, и для этих вопросов есть лучшие сайты StackExchange. – larsks

ответ

2

Ansible module uses Docker Compose, который не работает с режимом Роя на данный момент.Если вы запустили docker-compose на узле роя, он просто выдает команды docker run - вот почему у вас есть контейнеры, работающие на одном хосте, а не на сервисах, запущенных в Swarm.

Вы можете отслеживать поддержку режима роя в Compose с issue 3656, но когда это произойдет, может потребоваться также изменение в модуль Ansible (если только Compose не изменит свою логику обнаружения режима роя).

+0

Да, это, к сожалению, так. Спасибо и наслаждайтесь щедростью! – Bostone

0

Это решение не работает с режимом роя, представленным в докере 1.12, докере-компоном, после чего доклер-сервисный модуль должен быть обновлен до этого. Однако это работает, если вы используете «старого» роя кластера, построенный, как описано здесь: https://docs.docker.com/swarm/install-w-machine/ (Nota: Я предпочитаю использовать consul discovery service)

docker-service модуля ожидает некоторые переменные окружений, чтобы быть в состоянии достигнуть роем: DOCKER_HOST, DOCKER_TLS_VERIFY, DOCKER_CERT_PATH, ...

Если вы их не установили, для настройки хост-локальной докеры используется настройка по умолчанию.

Если вы использовали Докер-машину, чтобы создать и достичь роя кластера, можно ввести следующие команды для их извлечения:

docker-machine env --swarm <swarm_marster> 

В противном случае, если вам удалось достичь вашего роя кластера, вы должны их все равно (команда echo $DOCKER_HOST что-то возвращает?).

Тогда в вашем PlayBook, вам необходимо установить необходимые переменные enrivonment (вы можете использовать переменные):

- name: Deploy tpcds_tpg service to swarm 
    docker_service: 
     project_name: tpcds-tpg 
     definition: 
     version: '2' 
     services: 
      run_tests: 
      image: 'pbench/tpcds_tpg' 
      volumes: 
       - /opt/pbench/run_output/ 
      command: ./run_jmeter.sh "{{jmeter_output_dir}}" 
     docker_host: tcp://192.168.1.1:2376 
     tls_verify: 1 

    register: output 
    - debug: var=output 

Если вам нужно использовать DOCKER_CERT_PATH, связанные имена параметров модуля являются: tls_ca_cert, tls_client_cert и tls_client_key

+0

Согласно этой проблеме, https://github.com/docker/compose/issues/3656 compose еще не интегрирован с рой. Предоставляет ли docker-сервис больше, чем просто обертка поверх композиции? – Bostone

+0

Я не бегаю докер-машиной, есть ли способ получить <рой-мастер> без него? Или мне нужно установить докер-машину? – Bostone

+0

@Bostone: Тем не менее, мне удалось выполнить масштаб докер-компоновки на кластере рой в прошлом месяце во время додзё. Docker-compose использовать докер для выполнения действий. Если докер сконфигурирован для доступа к вашему ройному кластеру, он прозрачен для компоновки докеров. –

2

Я создал common task, чтобы разблокировать себя до тех пор, пока модуль сервисов роуминга не будет реализован в Ansible. Я знаю, что это не 100% идемпотент, но он охватывает большинство моих случаев использования. Он позволяет развернуть любую службу из реестра или из репозитория git с помощью файла Docker. Он также обрабатывает сети докеров.

Смежные вопросы