Ansible запускает задачу, основанную на чем-то в выводе

#ansible #yaml #wiki #ansible-template

#ansible #yaml #Вики #ansible-шаблон

Вопрос:

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

сбой: [192.168.1.140] (item= stderr_lines) => {«изменено»: true, «cmd»: [«docker», «run», «-itd», «—name», «h1», «-p», «80:80», «httpd»], «дельта»: «0:00:00.016385″, » конец»: «2021-01-04 03:00:55.403364″, » failed_when_result»: true, «item»: «stderr_lines», «msg»: «ненулевой код возврата», «rc»: 125, «запуск»: «2021-01-04 03:00:55.386979″, » stderr»: «/usr/bin/docker-current: ответ об ошибке от демона: конфликт. Имя контейнера «/h1″ уже используется контейнером bc5cc803a5f4321358992d06097ce271f3a63b8eba19900cfc0d23e321a4e243. Вы должны удалить (или переименовать) этот контейнер, чтобы иметь возможность повторно использовать это имя..nSee ‘/usr/bin/docker-текущий запуск —help’.», «stderr_lines»: [«/usr/bin/docker-current: ответ об ошибке от демона: конфликт. Имя контейнера «/h1″ уже используется контейнером bc5cc803a5f4321358992d06097ce271f3a63b8eba19900cfc0d23e321a4e243. Вы должны удалить (или переименовать) этот контейнер, чтобы иметь возможность повторно использовать это имя ..», «См. ‘/usr/bin/ docker-текущий запуск —help’.»], «stdout»: «», «stdout_lines»: []}»


Мой план действий выглядит следующим образом, но он не работал правильно. Иногда ошибка в чтении словаря или «Произошла непредвиденная ошибка типа шаблона». Может кто-нибудь подсказать мне, что я должен написать?

 - name: run a container
  vars:
   - run_container: docker run -itd --name h1 -p 80:80 httpd
   - rm_container: docker stop h1 amp;amp; docker rm h1

  hosts: 192.168.x.x
  tasks:
  - name: check docker container
    block:
    - name: run a container httpd
      command: "{{run_container}}"
      register: rss
      with_items:
        - "stderr_lines"
      failed_when: "'Error' in rss.stderr"

    rescue:
     - name: iterate over list
       debug:
         msg: "{{item.value}}"
       loop: "{{rss | dict2items}}"

     - name: remove the exited container
       command: "{{rm_container}}"
       register: rs
       with_items:
        - "{{rss | dict2items}}"
       when: item.value is search("The container name .* is already in use")
 

Комментарии:

1. изучите yaml .

2. Вам нужен docker_container модуль вместо этого? Это будет знать, чтобы не запускать контейнер, если он уже запущен.

3. Спасибо, Дэвид, я об этом не знал.