【问题标题】:Ansible w/ Docker - Show current Container stateAnsible w/ Docker - 显示当前容器状态
【发布时间】:2017-07-21 12:24:31
【问题描述】:

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

我的问题会简短:

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

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

例如:

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

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

韩国

【问题讨论】:

    标签: docker ansible docker-compose ansible-template


    【解决方案1】:

    从 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

    【讨论】:

    【解决方案2】:

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

    结果将在状态变量中可用

    【讨论】:

      【解决方案3】:

      这对我有用:

          - 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"
      

      【讨论】:

        【解决方案4】:

        编辑:如果您运行的是 Ansible 2.8+,则可以使用 docker_container_info。详情请见David Pärsson's answer

        这是使用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 来保持我的选项对其他地方的分叉行为保持开放......例如停下来,做任务,然后恢复原状。

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

        【讨论】:

        • 如果容器存在但被停止,这实际上将启动容器,这不是 OP 要求的。
        • 天哪,好收获!我认为在“docker_container”操作中添加“state: present”会有所帮助
        • 会,但如果容器不存在,它仍会创建容器。这可能没问题,但这是用户应该注意的副作用。
        • 没错,我将添加一条注释以澄清这一点,并提供参考以查看您的答案。谢谢!
        • 这不起作用。如果未指定 state=presentimage 属性,docker_container 模块会报错。
        【解决方案5】:

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

        【讨论】:

        【解决方案6】:

        这个问题不清楚,但一般来说你可以在两种情况下使用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 模块已经被弃用了一段时间。
        【解决方案7】:

        你的问题有点不清楚。

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

        然后有几个docker模块:

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

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


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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-02-05
          • 2021-07-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-05
          相关资源
          最近更新 更多