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

Nig*_*rle 32 ansible docker ansible-playbook

我想要完成的是在Docker容器中运行命令,该容器已经使用Ansible在Digital Ocean Ubuntu/Docker Droplet上创建.

似乎无法找到任何东西,或者我主要缺少一些东西.这是我的剧本中的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
Run Code Online (Sandbox Code Playgroud)

Ber*_*nie 40

在与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
Run Code Online (Sandbox Code Playgroud)

如果在映像中安装了python,则可以使用命令模块或任何其他模块而不是raw.

如果要在远程docker主机上执行此操作,请添加:

ansible_docker_extra_args: "-H=tcp://[docker-host]:[api port]"
Run Code Online (Sandbox Code Playgroud)

到add_host块.

有关更完整的示例,请参阅Ansible文档.

  • 有趣,比我的答案更准确。+1 (2认同)
  • 这确实需要Docker API访问带有Docker Engine的主机(如果不是localhost) - 如果防火墙规则阻止了这一点,你可能需要使用`docker exec ... bash -c ...`方法.我没有看到你如何使用delegate_to作为远程主机,因为它已经被用于docker连接到容器. (2认同)
  • @Ayra - 这不是绝对必要的.它只会让播放反馈显示:`ok:[127.0.0.1]`,而不是:`更改:[127.0.0.1]` - 它可以说是对正在发生的事情更具描述性,因为已经添加了主机,而不是改变(无论如何用英语谈论它). (2认同)
  • 有没有办法使用它在远程主机的 docker 容器内运行命令? (2认同)

Von*_*onC 17

您应该能够使用以下命令执行脚本(包含您的命令序列)docker exec:

docker exec container-name bash -l -c /path/to/script > /path/to/log
Run Code Online (Sandbox Code Playgroud)

(另请参阅" 为什么我必须bash -l -c在容器内使用? ")

  • /path/to/script 应该可以通过Ansible流程访问.
  • /path/to/log 是容器内部的路径,可以在卷中共享.


Fre*_*ric 10

由于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
Run Code Online (Sandbox Code Playgroud)


And*_*der 8

可以运行使用Docker容器内的命令的命令模块.例如这个代码将执行echo "Hello1"echo "Hello2"my_container:

   tasks:
        - name: Execute commands in docker container
          command: docker exec -it my_container bash -c 'echo "Hello1"; echo "Hello2"'
Run Code Online (Sandbox Code Playgroud)

  • 我不得不使用`docker exec -i <my_container>`来避免这个错误`输入设备不是TTY` (4认同)