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

Ansible w/ Docker - Show current Container state

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

我的问题会尽量简短:

我想获取 运行 Docker容器的状态!

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

示例为:

  1. 向上
  2. 退出
  3. 正在重启

我想从特定容器中获取其中一个结果。但是 没有 使用 CommandShell module!

韩国

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

  • 通过使用ansibledocker模块

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

有一个 ansible 模块 docker_image_facts 可以为您提供有关图像的信息。您正在寻找 docker_container_facts 目前不存在的内容。好主意。

你的问题有点不清楚。

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

然后docker个模块:

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

您可以查看选项 -> 参数以准确找到您要查找的内容。


这是 managing/using Docker 的 Ansible 模块的完整列表。

不幸的是,docker 周围的 none 个模块目前可以 "List containers"。 我做了以下工作来获取状态:

- name: get container status
  shell: docker ps -a -f name={{ container }} --format {%raw%}"table {{.Status}}"{%endraw%} | awk 'FNR == 2 {print}' | awk '{print }'
  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"

Edit: If you are running Ansible 2.8+ you can use docker_container_info. See for details.

这是使用 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 2.8 开始,您可以使用 docker_container_info,它本质上是 returns 来自 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