从Ansible中管理Docker容器

时间:2015-08-19 18:36:54

标签: docker ansible

我正在编写我的第一本Ansible剧本,我需要一点指导。我有一个由3个虚拟机组成的简单网络:

  • ansible01 - 我的Ansible服务器(Ubuntu)
  • db01 - 一个数据库(再次,Ub​​untu)
  • myapp01 - 托管Java应用程序的Ubuntu VM

我已将/etc/ansible/hosts文件配置为:

[databases]
db01.example.com

[app_servers]
myapp01.example.com
myapp02.example.com

我已正确配置SSH,我可以运行ansible all ping -m并且Ansible能够ping数据库和应用服务器节点。到目前为止一切都很好。

我正在尝试编写三(3)个与Docker相关的剧本,以实现以下目标:

  • 确保Docker在所有[databases]个节点以及所有[app_servers]个节点上运行;如果没有安装并运行,则安装Docker引擎并开始运行它。如果已安装但未运行,请重新启动它。
  • 停止/启动/重新启动为特定类型的节点运行的所有容器(“ role "?!?)。例如,我想告诉Ansible我想重新启动所有[app_servers]个节点上运行的所有容器。
  • 停止/启动/重新启动在任意节点上运行的任意容器。例如,myapp01可能有2个容器,fizzbuzz。我希望能够告诉Ansible重启(特别是)myapp01的{​​{1}}容器,但fizz容器,也不能buzz容器1}}容器。

相信这些属于三个独立的剧本(如果我错了或者有更好的方法,请纠正我)。我对他们进行了刺伤。第一个是myapp02

setup_docker.yml

然后在- name: ensure docker engine is installed and running docker: name: * state: started 中重新启动所有[databases]

restart_app_servers.yml

要在单个节点(- name: restart app servers docker: name: app_servers state: restarted )上重新启动任意容器,请执行以下操作:

restart_container.yml

但这里有几个问题:

  1. - name: restart a specific container docker: name: %name_of_container_and node% state: restarted 中,如何指定所有节点类型(setup_docker.yml[databases])都应受到影响?我知道星号(“*”)不正确。
  2. [app_servers]中,restart_app_servers.yml字段的正确值是多少?我如何告诉Ansible重新启动所有name个节点?
  3. app_server中,如何“注入”(作为参数/变量传入)节点和容器的名称?理想情况下,我想对任何节点和任何容器运行此剧本。
  4. 还有什么东西向你跳出来错了吗?
  5. 提前致谢!

1 个答案:

答案 0 :(得分:5)

我认为你的戏剧和剧本在这里意义不一。您在上面指定的三件事,setup_docker.yml,restart_app_servers.yml和restart_container.yml似乎是Plays。我建议创建一个Docker角色,其中包含您在此处详述的任务。

解决您的问题:

  1. 在setup_docker.yml中,如何指定应该影响所有节点类型([databases]和[app_servers])?我知道星号(“*”)不正确。
  2. 这是在Playbook级别完成的。您可以指定要由哪些任务影响的主机,例如:

    #docker.yml
    - hosts: all
      user: {{ privileged_user }} 
      gather_facts: false
      roles: 
        - install_docker
    

    然后在你的install_docker角色中,你会有以下几点:

    - name: Add docker apt keys
      apt_key: keyserver=keyserver.ubuntu.com id=36A1D7869245C8950F966E92D8576A8BA88D21E9
    - name: update apt 
      apt_repository: repo='deb https://get.docker.com/ubuntu docker main' state=present
    - name: Install docker
      apt: pkg=lxc-docker update_cache=yes
    
    1. 在restart_app_servers.yml中,name字段的正确值是什么?我如何告诉Ansible重新启动所有app_server节点?
    2. 我假设你想要重新启动属于app-server组的每个节点上的所有Docker容器? 我会保留每个组的所有容器名称的清单(因为这个例子相对简单)。例如:

      #group_vars/app-server
      all_containers: [ 'container1', 'container2', 'container3',.. 'containern' ]
      

      从这里,您可以在Play中使用此库存重新启动每个容器。在您的Playbook中:

      #restart_app_containers.yml
      - hosts: app_server
        user: {{ privileged_user }}
        gather_facts: false
        roles: 
          - restart_app_servers
      

      然后在Play本身:

      #restart_app_servers.yml
      - name: restart app servers
        docker:
          name: {{ item }}
          state: restarted
        with_items: all_containers
      
      1. 在restart_container.yml中,如何“注入”(作为参数/变量传入)节点和容器的名称?理想情况下,我想对任何节点和任何容器运行此剧本。
      2. 对于此部分,您需要直接引用您需要采取行动的容器。这可以使用动态库存来完成,例如

        #sample.yml
        - hosts: Tag_name_{{ public_name }}
          user: {{ privileged_user }}
          gather_facts: false
          roles:
            - example
        

        如果您在AWS上。主机词典因基础设施而异。 然后在你列出的实际游戏中,你可以传入特定的变量。由于它是单个主机上的单个容器,因此可以通过命令行执行此操作:

        ansible-playbook -i $INVENTORY_FILE -e container_name=$CONTAINER_NAME restart_single_container_on_single_host.yml 
        

        您的Play看起来像:

        - name: restart a specific container
          docker:
            name: {{ container_name }}
            state: restarted