我正在做一个使用 Docker 容器的小Ansible项目。
我会简短地提出我的问题:
我想获得一个正在运行的 Dockercontainer 的状态!
我的意思是,我想获取容器的当前状态,Docker 通过使用“docker ps”命令向您显示。
例子是:
- 向上
- 退出
- 重启
我想从特定容器中获得其中一个结果。但不使用Command或Shell 模块!
韩国
我正在做一个使用 Docker 容器的小Ansible项目。
我会简短地提出我的问题:
我想获得一个正在运行的 Dockercontainer 的状态!
我的意思是,我想获取容器的当前状态,Docker 通过使用“docker ps”命令向您显示。
例子是:
我想从特定容器中获得其中一个结果。但不使用Command或Shell 模块!
韩国
从 Ansible 2.8 开始,您可以使用docker_container_info
,它基本上返回来自 的输入docker inspect <container>
:
- name: Get infos on container
docker_container_info:
name: my_container
register: result
- name: Does container exist?
debug:
msg: "The container {{ 'exists' if result.exists else 'does not exist' }}"
- name: Print the status of the container
debug:
msg: "The container status is {{ result.container['State']['Status'] }}"
when: result.exists
使用我的 Docker 版本,State
包含以下内容:
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 8235,
"ExitCode": 0,
"Error": "",
"StartedAt": "2019-01-25T14:10:08.3206714Z",
"FinishedAt": "0001-01-01T00:00:00Z"
}
有关更多详细信息,请参阅https://docs.ansible.com/ansible/2.8/modules/docker_container_info_module.html。
不幸的是,docker 周围的所有模块目前都不能“列出容器”。我做了以下工作来获取状态:
- name: get container status
shell: docker ps -a -f name={{ container }} --format {%raw%}"table {{.Status}}"{%endraw%} | awk 'FNR == 2 {print}' | awk '{print $1}'
register: status
结果将在状态变量中可用
这对我有用:
- name: Get container status
shell: docker inspect --format={{ '{{.State.Running}}' }} {{ container_name }}
register: status
#Start the container if it is not running
- name: Start the container if it is in stopeed state.
shell: docker start heuristic_mestorf
when: status.stdout != "true"
编辑:如果您正在运行 Ansible 2.8+,您可以使用
docker_container_info
. 有关详细信息,请参阅David Pärsson 的答案。
这是使用docker_container
模块制作它的一种方法(请注意,如果容器不存在,它将创建容器):
- name: "Check if container is running"
docker_container:
name: "{{ container_name }}"
state: present
register: container_test_started
ignore_errors: yes
- set_fact:
container_exists: "{{ container_test_started.ansible_facts is defined }}"
- set_fact:
container_is_running: "{{ container_test_started.ansible_facts is defined and container_test_started.ansible_facts.docker_container.State.Status == 'running' }}"
container_is_paused: "{{ container_test_started.ansible_facts is defined and container_test_started.ansible_facts.docker_container.State.Status == 'paused' }}"
对我来说,问题是如果容器不存在,则 ansible_facts 没有定义。如果确实如此,那么它基本上包含了整个docker inspect <container>
输出,所以我导航它的状态。
如果您只需要短路,更简单的替代方法是将所需的 set_fact'd 值移动到 docker_container 任务上的 failed_when 中。
我通过 set_fact 来保持我的选项开放,以便在其他地方进行分叉行为。例如,停止,执行任务,然后恢复原状。
我包括暂停,因为它通常被遗忘为一种状态:)
有一个 ansible 模块 docker_image_facts 可以为您提供有关图像的信息。您正在寻找的东西是 docker_container_facts,目前不存在。不过好主意。
问题不清楚,但一般来说,你可以在两种情况下将 ansible 与 docker 一起使用:
http://docs.ansible.com/ansible/latest/docker_module.html
- name: data container
docker:
name: mydata
image: busybox
state: present
volumes:
- /data
通过在 Dockerfile 中调用 ansible
FROM centos7 运行 ansible-playbook -i 库存 playbook.yml
你的问题有点不清楚。
我最好的尝试——你想要输出“docker ps”——首先想到的是使用 Ansible 命令模块,但你不想使用它。
然后是几个 docker 模块:
您可以查看选项 -> 参数以获取您正在寻找的内容。
这是用于管理/使用Docker的 Ansible 模块的完整列表。