Ansible w/ Docker语言 - 显示当前容器状态



我正在做一个小的Ansible项目,我正在使用Docker容器。

我会保持简短的问题:

我想获取正在运行的 Dockercontainer 的状态!

我的意思是,我想获取容器的当前状态,Docker通过使用"docker ps"命令向您显示。

例如:

  1. 向上
  2. 退出
  3. 重新 启动

我想从特定容器中获取其中一个结果。但是不使用命令命令行管理模块

韩国克朗

从 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。详见大卫·帕尔森的回答。

以下是使用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值移动到docker_container任务的failed_when中。

我通过set_fact来保持我在其他地方分叉行为的选项......例如停止,执行任务,然后放回原来的样子。

我包括暂停,因为它通常被遗忘为状态:)

有一个ansible 模块docker_image_facts它为您提供有关图像的信息。您正在寻找docker_container_facts的东西,而这些东西目前不存在。不过是个好主意。

这个问题不清楚,但一般来说,您可以在两种情况下将 ansible 与 docker 一起使用:

  • 通过使用 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

    从 CENTOS7 运行 ansible-playbook -i inventory playbook.yml

你的问题有点不清楚。

我最好的尝试 - 你想要输出"docker ps" - 首先想到的是使用 Ansible 命令模块,但你不想使用它。

然后有几个 docker 模块:

  1. docker- 这是用于管理 Docker 容器生命周期的原始 Ansible 模块。
  2. docker_container- 用于管理 docker 容器生命周期的 ansible 模块。

您可以查看选项 -> 参数以获取您正在寻找的内容。


以下是用于管理/使用 Docker 的 Ansible 模块的完整列表。

相关内容

  • 没有找到相关文章

最新更新