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

我正在尝试将Docker服务部署到swarm中,但总是以本地主机上运行的容器(我用作Docker Swarmpipe理器的容器)结束,而且没有服务

这是我的设置:

我有3个节点的Docker(1.12.1)群,其中包括一个作为pipe理器运行的主机和两个全部运行在CentOS 7上的工作节点。在pipe理器节点(本地主机)上运行Ansible(v。2.1.1.0) swarm已经configuration并正在运行

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 

从有这个代码的剧本开始

 - 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 } 

哪个叫这个angular色:

 - 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部署我的形象作为本地容器​​,而不是作为服务群

所以我的假设是,如果我在swarmpipe理器的机器上有一个主动群体,并使用Ansible docker_service模块,那么它会自动意识到群体并将服务部署到它。 看起来像我的假设是错误的,我找不到任何文档,博客post等,这将暗示我该怎么做,我失踪。 Ansible高手请帮忙!

Ansible模块使用Docker Compose ,目前它不适用于Swarm模式。 如果在Swarm的一个节点上运行docker-compose ,它只会发出docker run命令 – 这就是为什么你的容器运行在一台主机上,而不是运行在Swarm上的服务。

您可以在撰写问题3656时跟踪群集模式支持,但是如果发生这种情况,也可能需要对Ansible模块进行更改(除非将Compose更改为具有群集模式检测逻辑)。

我创build了一个通用任务来解锁自己,直到在Ansible中实现了swarm服务模块。 我知道这不是一个100%幂等,但它涵盖了我的大部分用例。 它允许你从registry或从一个Dockerfile的git仓库部署任何服务。 它也处理dockernetworking。

此解决scheme不适用于docker 1.12中引入的swarm模式,docker-compose则必须先升级docker-service ansible模块。 但是,如果您使用按照此处所述构build的“旧”群集,它就可以工作: https : //docs.docker.com/swarm/install-w-machine/ (注意:我更喜欢使用领事发现服务 )

docker服务模块期望一些环境variables能够达到群:DOCKER_HOST,DOCKER_TLS_VERIFY,DOCKER_CERT_PATH,…

如果您没有设置它们,则使用默认configuration来使用主机本地泊坞窗。

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

  docker-machine env --swarm <swarm_marster> 

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

然后,在你的手册中,你需要设置所需的variables(你可以使用variables):

  - 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