我想要完成的是在已经使用 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
在 ansible github 项目上与一些非常有帮助的开发人员讨论后,更好的方法是这样的:
- 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 文档。
docker exec
: 执行脚本(其中包含命令序列)
docker exec container-name bash -l -c /path/to/script > /path/to/log
(另请参阅“为什么我必须在容器内使用
bash -l -c
?”)
条件:
docker exec
权限docker exec -u user
如果您需要在容器中使用具有脚本权限的其他用户)/path/to/log
是容器内的路径,可以在卷中共享。您可以使用 command 模块在 docker 容器中运行命令 例如,此代码将在远程计算机上的
my_container中执行
echo "Hello remote machine"
:
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_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
更新:有一种方法可以在不使用我的模块的情况下执行此操作,请参阅我的其他答案
我编写了一个简单的模块来在远程 Docker 主机上运行 exec。我已经将其提交到 ansible 项目,但如果需要,您可以轻松地将其添加到您自己的项目中。该模块只有 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 }}"
最终做了类似的事情:
- name: execute command in docker
shell: |
docker exec container sh -l -c "cat /tmp/secret"
register: hello
- debug: msg="{{ hello.stdout }}"
使用最新版本的 Ansible 在 docker 容器内运行命令:
community.docker
集合使用: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
有关使用集合的更多信息此处
在 Docker 容器内运行任何任务的另一种方法。重点是用容器内的 shell 可执行文件替换默认的 shell 可执行文件。
- name: Your task
# Don't use sudo inside a container to avoid /bin/sh: 1: sudo: not found
become: false
vars:
ansible_shell_executable: "sudo docker exec -i YOUR_CONTAINER_NAME /bin/sh"
community.rabbitmq.rabbitmq_user:
user: test
password: test
permissions:
- vhost: /
configure_priv: .*
read_priv: .*
write_priv: .*
state: present
ansible_shell_executable 设置需要 Ansible 2.1+。