web-dev-qa-db-ja.com

Ansibleを使用してDockerコンテナー内でコマンドを実行する

私が達成しようとしているのは、Ansibleを使用してDigital Ocean Ubuntu/Docker Dropletで既に作成されているDockerコンテナー内でコマンドを実行することです。

これで何かを見つけることができない、または私は主に何かを見逃しています。これは私のプレイブックの私のAnsibleタスクです。私はAnsibleが初めてなので、アドバイスや知恵をいただければ幸いです。

- name: Test Deploy
    hosts: [my-cluster-of-servers]

tasks: 
  - name: Go Into Docker Container And Run Multiple Commands
    docker:
      name: [container-name]
      image: [image-ive-created-container-with-on-server]
      state: present
      command: docker exec -it [container-name] bash
31
Nigel Earle

docker exec

docker exec container-name bash -l -c /path/to/script > /path/to/log

(「 なぜbash -l -cコンテナ内? ")

  • /path/to/scriptは、Ansibleプロセスからアクセスできる必要があります。
  • /path/to/logはコンテナ内のパスであり、ボリュームで共有できます。
17
VonC

ansible github project で非常に役立つ開発者と議論した後、これを行うより良い方法は次のようになります。

- name: add container to inventory
  add_Host:
    name: [container-name]
    ansible_connection: docker
  changed_when: false

- name: run command in container
  delegate_to: [container-name]
  raw: bash

イメージにpythonがインストールされている場合、rawの代わりにコマンドモジュールまたはその他のモジュールを使用できます。

リモートDockerホストでこれを行うには、次を追加します。

ansible_docker_extra_args: "-H=tcp://[docker-Host]:[api port]"

add_Hostブロックに。

より完全な例については、 Ansible documentation を参照してください。

35
Bernie

command module を使用して、Dockerコンテナ内でコマンドを実行できます。たとえば、このコードはecho "Hello1"およびecho "Hello2" inmy_container

   tasks:
        - name: Execute commands in docker container
          command: docker exec -it my_container bash -c 'echo "Hello1"; echo "Hello2"'
7
Ander

更新:モジュールを使用せずにこれを行う方法があります。他の回答を参照してください

リモートDockerホストでexecを実行する簡単なモジュールを作成しました。 ansibleプロジェクトに提出した ですが、必要に応じて自分のプロジェクトに簡単に追加できます。モジュールの長さはわずか23行で、プルリクエストから取得して./libraryディレクトリに追加すると、次のようにプレイブックにタスクを追加できます。

  - name: Run docker exec command
    docker_exec: 
      command: <some command>
      docker_Host: <docker Host>
      name: <container name>
    register: exec_output

  - name: Show exec output
    debug: msg="{{ exec_output.result }}"
0
Bernie