web-dev-qa-db-ja.com

Ansible with / Docker-現在のコンテナの状態を表示する

私は少しAnsibleプロジェクトに取り組んでいます。そこではDockerコンテナを使用しています。

質問は短くしておきます。

実行中のDockercontainerの状態を取得したい!

つまり、コンテナの現在の状態を取得したいので、Dockerは「dockerps」コマンドを使用して表示します。

例は次のとおりです。

  1. アップ
  2. 終了しました
  3. 再起動

特定のコンテナからこれらの結果の1つを取得したいと思います。しかしなしコマンドまたはシェルモジュールを使用して!

KR

5
Shai Shvili

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.docker_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/devel/modules/docker_container_info_module.html を参照してください。

8
David Pärsson

残念ながら、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

結果はステータス変数で利用可能になります

5
KVS

編集:Ansible 2.8以降を実行している場合は、docker_container_infoを使用できます。詳細については、 DavidPärssonの回答 を参照してください。

docker_containerモジュールを使用して作成する1つの方法を次に示します(コンテナが存在しない場合はコンテナを作成することに注意してください)。

- 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>出力全体を含んでいるので、ステータスのためにそれをナビゲートします。

短絡する必要がある場合は、docker_containerタスクで目的のset_fact'd値をfailed_whenに移動するのがより簡単な方法です。

Set_factを使用して、他の場所で動作をフォークするためのオプションを開いたままにします。停止し、タスクを実行してから、元に戻します。

状態として忘れられがちなので、一時停止を含めました:)

2
Jasmine Hegman

画像に関する情報を提供するansibleモジュールdocker_image_factsがあります。現在存在しないdocker_container_factsになるものを探しています。でもいい考えです。

1
Mark Chassy

質問は明確ではありませんが、一般的に言えば、2つのケースでdockerでansibleを使用できます。

  • 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 RUN ansible-playbook -i Inventory playbook.yml

0
itiic

あなたの質問は少し不明確です。

私の最善の試み-「dockerps」の出力が必要です-最初に頭に浮かぶのは、Ansibleコマンドモジュールを使用することですが、使用したくありません。

次に、いくつかのDockerモジュールがあります。

  1. docker -これは、Dockerコンテナのライフサイクルを管理するための元のAnsibleモジュールです。
  2. docker_container -dockerコンテナのライフサイクルを管理するためのansibleモジュール。

オプション->パラメータを調べて、探しているものを正確に取得できます。


これは、管理/使用するためのAnsibleモジュールの完全なリストです Docker

0
Nabeel Ahmed

これは私のために働いた:

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