使用 Ansible docker_service 模块将服务部署到 swarm
Using Ansible docker_service module to deploy service to swarm
我正在尝试将 Docker 服务部署到 swarm 中,但总是在我的本地主机上以 运行ning 容器结束(我用作 docker swarm 管理器的那个)没有服务
这是我的设置:
我有 3 个节点 Docker (v. 1.12.1) swarm,其中包括一个主机 运行ning 作为管理器和两个工作节点,所有 运行ning 在 CentOS 7 上。管理器节点(本地主机)我 运行 Ansible (v. 2.1.1.0) playbook 和 swarm 已经配置好 运行ning
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 }
哪个调用这个角色:
- 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
我最终得到一个 运行ning 容器。执行 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
显示没有服务 运行ning 所以看起来 docker_service
将我的图像部署为本地容器而不是集群上的服务
所以我的假设是,如果我在作为群管理器的机器上有一个活跃的群,并且我使用 Ansible docker_service
模块,那么它会自动识别该群并将服务部署到它.看起来我的假设是错误的,我找不到任何可以提示我该做什么以及我缺少什么的文档、博客文章等。 Ansible高手请帮忙!
此解决方案不适用于 docker 1.12 中引入的 swarm 模式,docker-compose 然后 docker-service ansible 模块必须先升级。但是,如果您使用按此处所述构建的 'old' swarm 集群,它会起作用:https://docs.docker.com/swarm/install-w-machine/ (Nota: I prefer to use a 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
returns 是什么?)。
然后,在你的剧本中,你需要设置需要的环境变量(你可以使用变量):
- 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
If you need to use DOCKER_CERT_PATH, related module parameter names are: tls_ca_cert, tls_client_cert and tls_client_key
Ansible module uses Docker Compose 目前不适用于 Swarm 模式。如果你 运行 docker-compose
在 Swarm 的一个节点上,它只会发出 docker run
命令——这就是为什么你在单个主机上有容器 运行ning 而不是服务 运行宁在蜂群中。
您可以使用 issue 3656 跟踪 Compose 中的群模式支持,但当确实发生这种情况时,很可能也需要对 Ansible 模块进行更改(除非将 Compose 更改为具有群模式检测逻辑) .
我创建了一个 common task 来解锁自己,直到 swarm 服务模块在 Ansible 中实现。我知道它不是 100% 幂等的,但它涵盖了我的大部分用例。它允许您从注册表或带有 Dockerfile 的 git 存储库部署任何服务。它还处理 docker 网络。
我能够部署容器,从主机复制 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
我正在尝试将 Docker 服务部署到 swarm 中,但总是在我的本地主机上以 运行ning 容器结束(我用作 docker swarm 管理器的那个)没有服务
这是我的设置:
我有 3 个节点 Docker (v. 1.12.1) swarm,其中包括一个主机 运行ning 作为管理器和两个工作节点,所有 运行ning 在 CentOS 7 上。管理器节点(本地主机)我 运行 Ansible (v. 2.1.1.0) playbook 和 swarm 已经配置好 运行ning
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 }
哪个调用这个角色:
- 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
我最终得到一个 运行ning 容器。执行 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
显示没有服务 运行ning 所以看起来 docker_service
将我的图像部署为本地容器而不是集群上的服务
所以我的假设是,如果我在作为群管理器的机器上有一个活跃的群,并且我使用 Ansible docker_service
模块,那么它会自动识别该群并将服务部署到它.看起来我的假设是错误的,我找不到任何可以提示我该做什么以及我缺少什么的文档、博客文章等。 Ansible高手请帮忙!
此解决方案不适用于 docker 1.12 中引入的 swarm 模式,docker-compose 然后 docker-service ansible 模块必须先升级。但是,如果您使用按此处所述构建的 'old' swarm 集群,它会起作用:https://docs.docker.com/swarm/install-w-machine/ (Nota: I prefer to use a 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
returns 是什么?)。
然后,在你的剧本中,你需要设置需要的环境变量(你可以使用变量):
- 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
If you need to use DOCKER_CERT_PATH, related module parameter names are: tls_ca_cert, tls_client_cert and tls_client_key
Ansible module uses Docker Compose 目前不适用于 Swarm 模式。如果你 运行 docker-compose
在 Swarm 的一个节点上,它只会发出 docker run
命令——这就是为什么你在单个主机上有容器 运行ning 而不是服务 运行宁在蜂群中。
您可以使用 issue 3656 跟踪 Compose 中的群模式支持,但当确实发生这种情况时,很可能也需要对 Ansible 模块进行更改(除非将 Compose 更改为具有群模式检测逻辑) .
我创建了一个 common task 来解锁自己,直到 swarm 服务模块在 Ansible 中实现。我知道它不是 100% 幂等的,但它涵盖了我的大部分用例。它允许您从注册表或带有 Dockerfile 的 git 存储库部署任何服务。它还处理 docker 网络。
我能够部署容器,从主机复制 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