gpt4 book ai didi

docker - 通过 Ansible 管理 Docker 容器

转载 作者:行者123 更新时间:2023-12-05 00:58:43 27 4
gpt4 key购买 nike

我正在编写我的第一本 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 引擎并开始运行它。如果已安装但未运行,请重新启动它。
  • 停止/启动/重新启动为特定类型节点(“角色”?!?)运行的所有容器。例如,我想告诉 Ansible 我想重新启动在所有 [app_servers] 节点上运行的所有容器。
  • 停止/启动/重新启动在任意节点上运行的任意容器。例如,也许 myapp01 有 2 个容器在其上运行, fizzbuzz 。我希望能够告诉 Ansible 重新启动(特别是) myapp01fizz 容器,但 不是 它的 buzz 容器,也不是任何 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 )上重新启动任意容器:
    - name: restart a specific container
    docker:
    name: %name_of_container_and node%
    state: restarted

    但这里有几个问题:
  • setup_docker.yml 中,如何指定所有节点类型( [databases][app_servers] )都应该受到影响?我知道星号(“*”)不正确。
  • restart_app_servers.yml 中,name 字段的正确值是多少?我实际上如何告诉 Ansible 重新启动所有 app_server 节点?
  • restart_container.yml 中,我如何“注入(inject)”(作为参数/变量传入)节点和容器的名称?理想情况下,我想在任何节点和任何容器上运行这个剧本。
  • 还有什么不对劲的吗?

  • 提前致谢!

    最佳答案

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

    为了解决您的问题:

  • 在 setup_docker.yml 中,如何指定所有节点类型([databases] 和 [app_servers])都应该受到影响?我知道星号(“*”)不正确。

  • 这是在剧本级别完成的。您可以指定要受哪些任务影响的主机,例如:
    #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
  • 在 restart_app_servers.yml 中,名称字段的正确值是多少?我实际上如何告诉 Ansible 重新启动所有 app_server 节点?

  • 我假设您的意思是您希望在属于 app-server 组的每个节点上重新启动所有 Docker 容器?
    我会为每个组保留所有容器名称的 list (因为这个示例相对简单)。例如:
    #group_vars/app-server
    all_containers: [ 'container1', 'container2', 'container3',.. 'containern' ]

    从这里您可以在 Play 中使用此库存来重新启动每个容器。在您的剧本中:
    #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
  • 在 restart_container.yml 中,我如何“注入(inject)”(作为参数/变量传入)节点和容器的名称?理想情况下,我想在任何节点和任何容器上运行这个剧本。

  • 对于这一部分,您需要直接引用您需要采取行动的容器。这可以通过动态库存来完成,例如
    #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

    关于docker - 通过 Ansible 管理 Docker 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32103149/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com