我正在创建一个角色来对要托管不同docker容器的VM进行操作系统和配置更新。
在角色开始时,我想停止所有泊坞窗容器(如果有的话)。我在这里找到了该线程输入链接描述,但是它有点旧,所以我尝试打开一个新问题。希望没事。
最简单的方法是这样的:
- 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\")"}
因此,在ansible为我创建的目录中,我的容器名为/ image-name,而不是image-name。因此错误很明显,但是我该如何解决?
也许这是一个模块问题,我需要去烦恼的开发人员吗?
谢谢和问候大卫
以下在我的家用计算机上做得很好。如docker_container
模块文档中所述,您可以使用短或长id字符串作为标识正在运行的容器name
。长Id
(大写我)是的输出可docker_host_info
在containers
列表中。
---
- hosts: localhost
gather_facts: false
tasks:
- name: Get running containers
docker_host_info:
containers: yes
register: docker_info
- name: Stop running containers
docker_container:
name: "{{ item }}"
state: stopped
loop: "{{ docker_info.containers | map(attribute='Id') | list }}"
演示运行:
# Show we have no running containers
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# Spawn some test containers for demo
$ for i in $(seq 1 5); do docker run -d --rm centos:8 bash -c "while true; do sleep 1; done"; done
a492efab9ec7dace786b610f3b93c335fbb84f041f7954557e971a5cbb0905a0
8cd55145c7cb267b37d2af346571797e283cac75777c531caeb88df7ec2e57d6
f009140260f5daee6efc6fba8dd8f73f9c83e31e7f1e09d48681b0738bc86f50
e7af30b1ade41fbc65b3db8e4146497ee736065103af769331d9df4e8e39b131
643e6831b958e0410bb148aeaec29dfeec6fa2773af5fb286ad74ab0368f2e50
# Make sure containers are running
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
643e6831b958 centos:8 "bash -c 'while true…" 9 seconds ago Up 7 seconds quizzical_allen
e7af30b1ade4 centos:8 "bash -c 'while true…" 10 seconds ago Up 9 seconds frosty_khayyam
f009140260f5 centos:8 "bash -c 'while true…" 12 seconds ago Up 10 seconds ecstatic_ramanujan
8cd55145c7cb centos:8 "bash -c 'while true…" 14 seconds ago Up 12 seconds focused_sammet
a492efab9ec7 centos:8 "bash -c 'while true…" 15 seconds ago Up 13 seconds agitated_jones
# Stop containers with playbook
$ ansible-playbook test.yml
PLAY [localhost] **************************************************************************************************************************************************************************************************
TASK [Get running containers] *************************************************************************************************************************************************************************************
ok: [localhost]
TASK [Stop running containers] ************************************************************************************************************************************************************************************
changed: [localhost] => (item=643e6831b958e0410bb148aeaec29dfeec6fa2773af5fb286ad74ab0368f2e50)
changed: [localhost] => (item=e7af30b1ade41fbc65b3db8e4146497ee736065103af769331d9df4e8e39b131)
changed: [localhost] => (item=f009140260f5daee6efc6fba8dd8f73f9c83e31e7f1e09d48681b0738bc86f50)
changed: [localhost] => (item=8cd55145c7cb267b37d2af346571797e283cac75777c531caeb88df7ec2e57d6)
changed: [localhost] => (item=a492efab9ec7dace786b610f3b93c335fbb84f041f7954557e971a5cbb0905a0)
PLAY RECAP ********************************************************************************************************************************************************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
# Verify containers are stopped
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# Check that playbook succeeds without containers running
$ ansible-playbook test.yml
PLAY [localhost] **************************************************************************************************************************************************************************************************
TASK [Get running containers] *************************************************************************************************************************************************************************************
ok: [localhost]
TASK [Stop running containers] ************************************************************************************************************************************************************************************
PLAY RECAP ********************************************************************************************************************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句