运行 使用 Ansible 在 Docker 容器内部命令
Run Command Inside of Docker Container Using Ansible
我想要完成的是 运行 在 Docker 容器中执行命令,该容器已经在 Digital Ocean Ubuntu/Docker Droplet 上使用 Ansible 创建。
似乎在这方面找不到任何东西,或者我主要遗漏了一些东西。这是我剧本中的 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
:
执行脚本(其中包含您的命令序列)
docker exec container-name bash -l -c /path/to/script > /path/to/log
(另见“Why do I have to use bash -l -c
inside my container?”)
/path/to/script
应该可以被你的 Ansible 进程访问。
/path/to/log
是容器内的路径,可以在卷中共享。
您可以使用 command module 在 docker 容器中 运行 命令例如,此代码将在 my_container[ 中执行 echo "Hello remote machine"
=20=] 在远程机器上:
tasks:
- name: Execute commands in docker container
command: docker exec -it my_container bash -c 'echo "Hello remote machine"'
对于 运行在本地机器中使用相同的命令,只需使用 local_action
标志:
tasks:
- name: Execute commands in docker container
local_action: command docker exec -it my_container bash -c 'echo "Hello local machine"'
更新:有一种方法可以不使用我的模块来做到这一点,请参阅我的其他答案
我在远程 Docker 主机上为 运行 exec 写了一个简单的模块。我有 submitted it to the ansible project,但如果需要,您可以轻松地将它添加到您自己的项目中。该模块只有 23 行长,从我的 pull request 中获取它并将其添加到您的 ./library 目录,然后您可以像这样在您的 playbook 中添加一个任务:
- 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 }}"
在 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,您可以使用命令模块或任何其他模块来代替原始模块。
如果您想在远程 docker 主机上执行此操作,请添加:
ansible_docker_extra_args: "-H=tcp://[docker-host]:[api port]"
到add_host块。
有关更完整的示例,请参阅 Ansible documentation。
最后做了类似的事情:
- name: execute command in docker
shell: |
docker exec container sh -l -c "cat /tmp/secret"
register: hello
- debug: msg="{{ hello.stdout }}"
因为 Ansible 2.10 docker_container_exec
是 community.docker
集合的一部分:
- name: Run a simple command (command)
community.docker.docker_container_exec:
container: foo
command: /bin/bash -c "ls -lah"
chdir: /root
register: result
- name: Print stdout
debug:
var: result.stdout
使用最新版本的 Ansible 在 docker 容器内执行 运行 命令:
- 安装
community.docker
collection 使用:
ansible-galaxy collection install community.docker
或在项目中创建文件 requirements.yml
更好,内容为:
---
collections:
- community.docker
和运行宁ansible-galaxy install -r requirements.yml
(类似于pip install -r requirements.txt
)
- 按以下方式使用集合:
---
- name: local actions
hosts: localhost
gather_facts: false
tasks:
- name: task
community.docker.docker_container_exec:
container: container_name
command: ls /tmp
更多关于使用集合的信息here
我想要完成的是 运行 在 Docker 容器中执行命令,该容器已经在 Digital Ocean Ubuntu/Docker Droplet 上使用 Ansible 创建。
似乎在这方面找不到任何东西,或者我主要遗漏了一些东西。这是我剧本中的 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
:
docker exec container-name bash -l -c /path/to/script > /path/to/log
(另见“Why do I have to use bash -l -c
inside my container?”)
/path/to/script
应该可以被你的 Ansible 进程访问。/path/to/log
是容器内的路径,可以在卷中共享。
您可以使用 command module 在 docker 容器中 运行 命令例如,此代码将在 my_container[ 中执行 echo "Hello remote machine"
=20=] 在远程机器上:
tasks:
- name: Execute commands in docker container
command: docker exec -it my_container bash -c 'echo "Hello remote machine"'
对于 运行在本地机器中使用相同的命令,只需使用 local_action
标志:
tasks:
- name: Execute commands in docker container
local_action: command docker exec -it my_container bash -c 'echo "Hello local machine"'
更新:有一种方法可以不使用我的模块来做到这一点,请参阅我的其他答案
我在远程 Docker 主机上为 运行 exec 写了一个简单的模块。我有 submitted it to the ansible project,但如果需要,您可以轻松地将它添加到您自己的项目中。该模块只有 23 行长,从我的 pull request 中获取它并将其添加到您的 ./library 目录,然后您可以像这样在您的 playbook 中添加一个任务:
- 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 }}"
在 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,您可以使用命令模块或任何其他模块来代替原始模块。
如果您想在远程 docker 主机上执行此操作,请添加:
ansible_docker_extra_args: "-H=tcp://[docker-host]:[api port]"
到add_host块。
有关更完整的示例,请参阅 Ansible documentation。
最后做了类似的事情:
- name: execute command in docker
shell: |
docker exec container sh -l -c "cat /tmp/secret"
register: hello
- debug: msg="{{ hello.stdout }}"
因为 Ansible 2.10 docker_container_exec
是 community.docker
集合的一部分:
- name: Run a simple command (command)
community.docker.docker_container_exec:
container: foo
command: /bin/bash -c "ls -lah"
chdir: /root
register: result
- name: Print stdout
debug:
var: result.stdout
使用最新版本的 Ansible 在 docker 容器内执行 运行 命令:
- 安装
community.docker
collection 使用:
ansible-galaxy collection install community.docker
或在项目中创建文件 requirements.yml
更好,内容为:
---
collections:
- community.docker
和运行宁ansible-galaxy install -r requirements.yml
(类似于pip install -r requirements.txt
)
- 按以下方式使用集合:
---
- name: local actions
hosts: localhost
gather_facts: false
tasks:
- name: task
community.docker.docker_container_exec:
container: container_name
command: ls /tmp
更多关于使用集合的信息here