如何使用ansible删除过时的容器?

问题描述 投票:-2回答:1

我正在使用with_sequence使用ansible在单个节点上迭代地创建容器的副本。容器数量由部署时设置的变量确定。这适用于增加扩展容器的数量,但是当我减少部署较少容器的数量时,旧容器将保持运行。有没有办法阻止旧容器?由于旧容器未停止,因此修剪似乎无法正常工作。

docker ansible ansible-template
1个回答
0
投票

一种选择是从Ansible转移到docker-compose,它知道如何扩展和缩小(并诚实地为管理复杂的Docker配置提供更好的使用体验)。

另一个想法是包含一个用于启动容器的循环,然后是第二个循环尝试将容器移除到某个最大数量,如下所示(假设您要启动的容器数量在ansible变量container_count中):

---
- hosts: localhost
  gather_facts: false
  vars:
    container_count: 4
    maximum_containers: 20
  tasks:
    - name: Start containers
      docker_container:
        state: present
        name: "service-{{ item }}"
        image: fedora
        command: "sleep inf"
      loop: "{{ range(container_count|int)|list }}"

    - name: Stop containers
      docker_container:
        state: absent
        name: "service-{{ item }}"
      loop: "{{ range(container_count|int, maximum_containers|int)|list }}"

使用playbook中定义的默认值调用,它将创建4个容器,然后尝试删除16个容器。这将会有点慢,因为Ansible没有提供过早退出循环的任何方法,但它会起作用。

第三个选项是用shell脚本替换“停止容器”任务,该脚本可能稍微快一点,但不像“类似ansible”:

---
- hosts: localhost
  gather_facts: false
  vars:
    container_count: 4
  tasks:
    - name: Start containers
      docker_container:
        state: present
        name: "service-{{ item }}"
        image: fedora
        command: "sleep inf"
      loop: "{{ range(container_count|int)|list }}"

    - name: Stop containers
      shell: |
        let i={{ container_count }}
        while :; do
          name="service-$i"
          docker rm -f $name || break
          echo "removed $name"
          let i++
        done
        echo "all done."

同样的想法,但有点快,它不需要您定义最大容器数。

© www.soinside.com 2019 - 2024. All rights reserved.