Как остановить все контейнеры с Ansible - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь остановить все запущенные контейнеры в качестве первого шага, а затем удалить их.

Я знаю, что могу сделать это с помощью пакета оболочки Anslible и выполнить эту команду:

docker container stop $(docker container ls -aq)

В качестве второго шага я могу сделать то же самое с пакетом оболочки и очистить мертвые контейнеры / изображения / тома:

docker system prune -a -f --volumes

Я пробовал что-то вроде этого (пример кода):

- name: Stop all containers:
  shell: "docker container stop $(docker container ls -aq)"
  ignore_errors: yes

К сожалению, когда контейнеры равны 0, это выдает ошибку, которую я хотел бы обработать.

Я мог бы улучшить ее, добавив следующее:

- name: Get info on docker host and list images
  docker_host_info:
    containers: yes
  register: result

- name: Stop all containers
  shell: "docker container stop $(docker container ls -aq)"
  when: result.host_info.Containers != 0

Я хотел бы сделать это сиспользуя только пакет Ansible, например ( docker_host_info ). Я могу извлечь сложный список с контейнерами, которые включают всю информацию, но я не могу найти способ получить ни Id, ни имя контейнеров.

Я планирую сделать цикл после сИдентификаторы или имена и их остановка по одному.

Мне удалось извлечь количество контейнеров (строковый формат), но я не могу найти способ преобразовать его в индекс, чтобы выполнить цикл.

Образец кода:

- name: Get info on docker host and list images
  docker_host_info:
    containers: yes
  register: result

- name: Debug dockerInfo
  debug:
    var: result.containers 
    # var: result.host_info.Containers
    # loop: "{{ result.host_info.Containers }}"
    # loop: "{{ range(0, 4)|list }}"
  when: result.host_info.Containers != 0

Можно ли преобразовать возвращенную строку в индекс и выполнить итерацию по этому индексу, например (поддельный образец кода):

- name: Debug dockerInfo
  debug:
    var: "{{ result.containers[item].Id }}
  loop: result.host_info.Containers
  when: result.host_info.Containers != 0

1 Ответ

1 голос
/ 19 октября 2019

result.containers - это список, поэтому вы можете выполнять итерации непосредственно по нему:

- name: Debug dockerInfo
  debug:
    var: item
  loop: "{{ result.containers }}"
  when: result.containers | length != 0

Кстати, var из debug принимает только имя переменной для отладки выражения, которое вы должны использоватьmsg вместо. Кстати, для ключевого слова loop вы должны использовать фигурные скобки для оценки выражения.

...