如何使用ansible删除过时的容器?
How to remove outdated containers using ansible?
我正在使用 with_sequence 使用 ansible 在单个节点上迭代创建容器的副本。容器的数量由部署时设置的变量决定。这对于增加要扩展的容器数量很有效,但是当我减少数量以部署更少的容器时,旧容器就剩下 运行。有没有办法停止旧容器?修剪似乎无法正常工作,因为旧容器没有停止。
一个选择是从 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 }}"
使用剧本中定义的默认值调用,它将创建 4 个容器,然后尝试再删除 16 个。这会有点慢,因为 Ansible 不提供任何提前退出循环的方法,但它会起作用。
第三种选择是用 shell 脚本替换 "Stop containers" 任务,这可能会稍微快一些但更少 "ansible-like":
---
- 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."
相同的想法,但速度更快,并且不需要您定义最大容器数。
我正在使用 with_sequence 使用 ansible 在单个节点上迭代创建容器的副本。容器的数量由部署时设置的变量决定。这对于增加要扩展的容器数量很有效,但是当我减少数量以部署更少的容器时,旧容器就剩下 运行。有没有办法停止旧容器?修剪似乎无法正常工作,因为旧容器没有停止。
一个选择是从 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 }}"
使用剧本中定义的默认值调用,它将创建 4 个容器,然后尝试再删除 16 个。这会有点慢,因为 Ansible 不提供任何提前退出循环的方法,但它会起作用。
第三种选择是用 shell 脚本替换 "Stop containers" 任务,这可能会稍微快一些但更少 "ansible-like":
---
- 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."
相同的想法,但速度更快,并且不需要您定义最大容器数。