2016-10-07 32 views
4

我想部署一個碼頭工人服務爲羣,但總是在我的本地(我作爲一個碼頭工人羣管理者使用的),並沒有服務運行容器結束了使用Ansible docker_service模塊部署服務一窩蜂

這裏是我的設置:

我有3個節點的Docker(v。1.12.1)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 

與具有此代碼

- 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部署我的形象作爲本地的容器,而不是作爲對羣服務

所以我的假設是,如果我有一個在swarm管理器上使用Ansible docker_service模塊的機器上的主動羣,那麼它將自動意識到羣並將服務部署到它。看起來像我的假設是錯誤的,我找不到任何文檔,博客帖子等,這將暗示我該怎麼做,我失蹤了。 Ansible高手請幫忙!

+1

不知道爲什麼我的問題是downvoted。如果還有其他遺漏,請告訴我,我很樂意添加更多詳細信息 – Bostone

+0

這與軟件開發沒有特別的關係。這似乎主要是關於系統管理和網絡,並且針對這些問題有更好的StackExchange站點。 – larsks

回答

2

Ansible module uses Docker Compose目前不適用於Swarm模式。如果您在Swarm的某個節點上運行docker-compose,它只會發出docker run命令 - 這就是爲什麼您的容器在一個主機上運行,​​而不是在Swarm中運行的服務。

您可以使用issue 3656跟蹤Compose中的羣集模式支持,但是如果發生這種情況,可能也需要對Ansible模塊進行更改(除非將Compose更改爲具有羣模式檢測邏輯)。

+0

是的,不幸的是,情況似乎如此。感謝並享受賞金! – Bostone

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-machine env --swarm <swarm_marster> 

否則,如果你成功地達到你的羣簇,你必須讓他們無論如何(命令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

+0

根據這個問題https://github.com/docker/compose/issues/3656撰寫尚未與swarm集成。碼頭服務提供的不僅僅是一個包裝上的包裝? – Bostone

+0

我沒有運行docker-machine有沒有辦法讓沒有它?或者我需要安裝碼頭機器? – Bostone

+0

@Bostone:不過,我上個月在一個道場中成功地在一個羣集上執行了一個碼頭構成比例。 Docker-compose使用docker來執行操作。如果將docker配置爲訪問swarm羣集,則對docker-compose透明。 –

2

我創建了一個common task來解鎖自己,直到在Ansible中實現swarm服務模塊。我知道它不是100%冪等的,但它涵蓋了我的大部分用例。它允許你從一個註冊表或從一個Dockerfile的git倉庫部署任何服務。它也處理碼頭網絡。