我正在创建一个 ansible 角色来在我托管不同 docker 容器的 VM 上执行操作系统和配置更新。
在角色开始时,我想停止所有 docker 容器(如果有的话)。我发现这个线程在这里输入链接描述,但它有点旧,所以我试图打开一个新问题。希望没关系。
最简单的方法是这样的:
- name: Stop docker containers
shell: |
docker stop $(docker ps -aq)
Run Code Online (Sandbox Code Playgroud)
不幸的是,当主机没有 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
Run Code Online (Sandbox Code Playgroud)
但还是和第一部分一样。当主机没有 docker 容器时出现错误。
因此,在链接线程中,我尝试使用“docker_container”模块,如下所示:
- name: Get info on docker host and list images
docker_host_info:
containers: yes
register: containers_to_stop
- name: …Run Code Online (Sandbox Code Playgroud) 实际上,我遇到了一个问题,将 Ansible 中的两个列表合并为一个新列表,以防其中一个列表为空或不为空。
编辑:
默认定义了一个列表
standardvolumes: '/usr/share/zoneinfo:/usr/share/zoneinfo:ro'
Run Code Online (Sandbox Code Playgroud)
另一个列表可以在主机组的 group_vars.yml 中定义。
volumes:
- '/usr/data:/data'
- '/usr/data2:/data2'
- '/usr/data3:/data3'
Run Code Online (Sandbox Code Playgroud)
在任务中我列出了列表:
- name: Combine volume lists
set_fact:
volumestostart: '{{ standardvolumes|default([]) + volumes|default([]) }}'
Run Code Online (Sandbox Code Playgroud)
在玩时我收到此错误:
TASK [do-docker-deployment : Combine volume lists] *****************************
fatal: [shs_de_postd_server1]: FAILED! => {"msg": "Unexpected templating type error occurred on ({{ standardvolumes|default([]) + volumes|default([]) }}): coercing to Unicode: need string or buffer, list found"}
Run Code Online (Sandbox Code Playgroud)
所以我尝试重新定义我的默认列表:
standardvolumes:
- '/usr/share/zoneinfo:/usr/share/zoneinfo:ro'
Run Code Online (Sandbox Code Playgroud)
但后来我收到了 docker 格式错误:
failed: [shs_de_postd_server1] (item={u'key': u'qit', u'value': {u'cgrouptype': u'blech', u'nexususer': u'cbs-qit-user', u'notstartable': …Run Code Online (Sandbox Code Playgroud)