私は少しAnsibleプロジェクトに取り組んでいます。そこではDockerコンテナを使用しています。
質問は短くしておきます。
実行中のDockercontainerの状態を取得したい!
つまり、コンテナの現在の状態を取得したいので、Dockerは「dockerps」コマンドを使用して表示します。
例は次のとおりです。
特定のコンテナからこれらの結果の1つを取得したいと思います。しかしなしコマンドまたはシェルモジュールを使用して!
KR
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 を参照してください。
残念ながら、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
結果はステータス変数で利用可能になります
編集: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を使用して、他の場所で動作をフォークするためのオプションを開いたままにします。停止し、タスクを実行してから、元に戻します。
状態として忘れられがちなので、一時停止を含めました:)
画像に関する情報を提供するansibleモジュールdocker_image_factsがあります。現在存在しないdocker_container_factsになるものを探しています。でもいい考えです。
質問は明確ではありませんが、一般的に言えば、2つのケースでdockerでansibleを使用できます。
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
あなたの質問は少し不明確です。
私の最善の試み-「dockerps」の出力が必要です-最初に頭に浮かぶのは、Ansibleコマンドモジュールを使用することですが、使用したくありません。
次に、いくつかのDockerモジュールがあります。
オプション->パラメータを調べて、探しているものを正確に取得できます。
これは、管理/使用するためのAnsibleモジュールの完全なリストです Docker 。
これは私のために働いた:
- 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"