Я создаю роль ansible для обновления ОС и конфигурации виртуальных машин, на которых я размещаю различные docker контейнеры.
В начале роли я хочу остановить все docker контейнеров, если есть. Я нашел эту ветку введите здесь описание ссылки , но она немного старше, поэтому я пытаюсь открыть новый вопрос. Надеюсь, что все в порядке.
Самый простой способ - это:
- name: Stop docker containers
shell: |
docker stop $(docker ps -aq)
К сожалению, я получаю сообщение об ошибке, если на хосте нет контейнера docker. А работать с ignore_errors: yes, я думаю, было бы не лучшим решением. Я попробовал этот способ
- name: Get info on docker host and list images
docker_host_info:
containers: yes
register: containers_to_stop
- name: Stop docker containers
shell: |
docker stop $(docker ps -aq)
when: containers_to_stop.containers != 0
, но все тот же, что и в первой части. Я получаю сообщение об ошибке, если на хосте нет контейнера docker.
Так же, как и в связанном потоке, я пытаюсь использовать модуль docker_container следующим образом:
- name: Get info on docker host and list images
docker_host_info:
containers: yes
register: containers_to_stop
- name: Stop running docker containers
docker_container:
name: '{{ item.Names }}'
image: '{{ item.Image }}'
state: stopped
loop: '{{ containers_to_stop.containers }}'
К сожалению, модуль «docker_host_info» не работает нормально, потому что все мои docker имена контейнеров начинаются с «/». Я отладил это для всех вас:
failed: [app01] (item={u'Status': u'Up 12 minutes', u'Command': u'./replace_props_and_start.sh', u'Names': [u'/image-name'], u'Created': 1588071879, u'Image': u'image-name', u'Ports': [{u'IP': u'0.0.0.0', u'Type': u'tcp', u'PublicPort': 8091, u'PrivatePort': 80}], u'Id': u'ad5b0b3d6d623e2ac1d0a2ead9fbbf8a5ce5bca58492410a31035fd160de149a'}) => {"ansible_loop_var": "item", "changed": false, "item": {"Command": "./replace_props_and_start.sh", "Created": 1588071879, "Id": "ad5b0b3d6d623e2ac1d0a2ead9fbbf8a5ce5bca58492410a31035fd160de149a", "Image": "image-name", "Names": ["/image-name"], "Ports": [{"IP": "0.0.0.0", "PrivatePort": 80, "PublicPort": 8091, "Type": "tcp"}], "Status": "Up 12 minutes"}, "msg": "Error creating container: 400 Client Error: Bad Request (\"Invalid container name (['/image-name']), only [a-zA-Z0-9][a-zA-Z0-9_.-] are allowed\")"}
Итак, мой контейнер называется / image-name, а не image-name в каталоге, который ansible создает для меня. Итак, ошибка очевидна, но как я могу ее исправить?
Может быть, это проблема модуля, и мне нужно от go до ansible разработчиков?
С уважением, Дэвид