8

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

我会简短地提出我的问题:

我想获得一个正在运行的 Dockercontainer 的状态!

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

例子是:

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

我想从特定容器中获得其中一个结果。但使用CommandShell 模块

韩国

4

7 回答 7

18

从 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

于 2019-01-25T14:21:46.487 回答
7

不幸的是,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

结果将在状态变量中可用

于 2017-08-10T21:26:55.590 回答
2

这对我有用:

    - 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"
于 2018-10-30T10:57:36.503 回答
2

编辑:如果您正在运行 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 来保持我的选项开放,以便在其他地方进行分叉行为。例如,停止,执行任务,然后恢复原状。

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

于 2018-12-24T06:10:16.257 回答
1

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

于 2017-07-21T13:11:49.003 回答
0

问题不清楚,但一般来说,你可以在两种情况下将 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

    FROM centos7 运行 ansible-playbook -i 库存 playbook.yml

于 2017-07-21T12:48:17.327 回答
0

你的问题有点不清楚。

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

然后是几个 docker 模块:

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

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


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

于 2017-07-21T13:14:52.127 回答