使用Ansible docker_service模块将服务部署到swarm

时间:2016-10-07 20:17:48

标签: docker ansible docker-swarm

我正在尝试将一个Docker服务部署到swarm中但最终总是在我的localhost上运行容器(我用作docker swarm管理器的那个)并且没有服务

这是我的设置:

我有3个节点Docker(v.1.12.2)swarm,其中包括一个作为管理器运行的主机和两个全部运行在CentOS 7上的工作节点。在管理器节点(localhost)上运行Ansible(v.2.1.1.0) playbook和swarm已经配置并正在运行

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显示

[pdo@sdl02133 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将我的图像部署为本地容器​​,而不是作为群上的服务

所以我的假设是,如果我在机器上有一个活跃的swarm是一个swarm管理器并且我使用Ansible docker_service模块,那么它将自动知道swarm并将服务部署到它。看起来我的假设是错误的,我找不到任何文件,博客文章等会暗示我该做什么以及我缺少什么。 Ansible专家请帮忙!

4 个答案:

答案 0 :(得分:3)

目前不适用于Swarm模式的Ansible module uses Docker Compose。如果在Swarm中的某个节点上运行docker-compose,它只会发出docker run个命令 - 这就是为什么在单个主机上运行容器而不是在Swarm中运行的服务的原因。

您可以使用issue 3656跟踪Compose中的群集模式支持,但是当发生这种情况时,也可能需要更改Ansible模块(除非将Compose更改为具有群模式检测逻辑)。 / p>

答案 1 :(得分:2)

我创建了一个common task来取消阻止自己,直到在Ansible中实现swarm服务模块。我知道它不是100%幂等,但它涵盖了我的大部分用例。它允许您从注册表或使用Dockerfile的git存储库部署任何服务。它还处理docker网络。

答案 2 :(得分:0)

此解决方案不适用于docker 1.12中引入的swarm模式,docker-compose之前必须升级docker-service ansible模块。但是,如果您使用的是旧版本,则可以使用它。如下所述构建的群集群:https://docs.docker.com/swarm/install-w-machine/(注意:我更喜欢使用consul discovery service

docker-service模块期望一些环境变量能够到达一个群:DOCKER_HOST,DOCKER_TLS_VERIFY,DOCKER_CERT_PATH,......

如果您未设置它们,则使用默认配置来使用主机本地docker。

如果您使用docker-machine创建并访问您的swarm群集,则可以键入以下命令来检索它们:

  docker-machine env --swarm <swarm_marster>

否则,如果你成功到达你的swarm群集,你必须拥有它们(命令echo $DOCKER_HOST是否返回了什么?)。

然后,在你的剧本中,你需要设置所需的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

答案 3 :(得分:0)

我能够部署从主机复制Docker Compose文件并在shell命令上运行堆栈部署的容器:

---
- hosts: leader
  become: true

  tasks:
    - name: Join Docker Network
      docker_network:
        name: traefik-public
        driver: overlay

    - name: Create Build Directory
      file:
        path: /home/ubuntu/container1
        state: directory
        owner: ubuntu
        group: ubuntu
        mode: '0755'

    - name: Copy Dockerfile
      copy:
        src: ./docker-compose.yml
        dest: /home/ubuntu/container1
        owner: root
        group: root
        mode: '0644'

    - name: Docker Stack
      shell: docker stack deploy -c /home/ubuntu/container1/docker-compose.yml traefik