运行 使用 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 }}"

因为 A​​nsible 2.10 docker_container_execcommunity.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 容器内执行 运行 命令:

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