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