使用 Ansible 在 Docker 容器内运行命令

问题描述 投票:0回答:8

我想要完成的是在已经使用 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 ansible
8个回答
76
投票

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 文档


17
投票

您应该能够使用

docker exec
:

执行脚本(其中包含命令序列)
docker exec container-name bash -l -c /path/to/script > /path/to/log

(另请参阅“为什么我必须在容器内使用

bash -l -c
”)

条件:

  • Ansible SSH 用户拥有
    docker exec
    权限
  • 在容器中,默认用户拥有该脚本的权限(或者
    docker exec -u user
    如果您需要在容器中使用具有脚本权限的其他用户)
  • /path/to/log
    是容器内的路径,可以在卷中共享。

15
投票

您可以使用 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"'

9
投票

自从 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

0
投票

更新:有一种方法可以在不使用我的模块的情况下执行此操作,请参阅我的其他答案

我编写了一个简单的模块来在远程 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 }}"

0
投票

最终做了类似的事情:

- name: execute command in docker
  shell: |
    docker exec container sh -l -c "cat /tmp/secret"
  register: hello

- debug: msg="{{ hello.stdout }}"

0
投票

使用最新版本的 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

有关使用集合的更多信息此处


0
投票

在 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+。

© www.soinside.com 2019 - 2024. All rights reserved.