私が達成しようとしているのは、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
docker exec container-name bash -l -c /path/to/script > /path/to/log
(「 なぜbash -l -c
コンテナ内? ")
/path/to/script
は、Ansibleプロセスからアクセスできる必要があります。/path/to/log
はコンテナ内のパスであり、ボリュームで共有できます。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 を参照してください。
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"'
更新:モジュールを使用せずにこれを行う方法があります。他の回答を参照してください
リモート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 }}"