Как удалить устаревшие контейнеры с помощью ansible? - PullRequest
0 голосов
/ 19 апреля 2019

Я использую with_sequence, чтобы итеративно создавать копии контейнера на одном узле, используя ansible.Количество контейнеров определяется переменной, установленной во время развертывания.Это хорошо работает для увеличения числа контейнеров для увеличения, но когда я уменьшаю количество для развертывания меньшего количества контейнеров, старые контейнеры остаются запущенными.Есть ли способ остановить старые контейнеры?Чернослив не будет работать правильно, так как старые контейнеры не остановлены.

1 Ответ

0 голосов
/ 19 апреля 2019

Один из вариантов - перейти от 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 не предоставляет способа преждевременного выхода из цикла, но он будет работать.

Третий вариант - заменить задачу «Остановить контейнеры» сценарием оболочки, который может быть немного быстрее, но менее похож на 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."

Та же идея, но несколько быстрее и не требует определения максимального количества контейнеров.

...