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

qaxu7uf2  于 2023-01-12  发布在  Docker
关注(0)|答案(7)|浏览(254)

我尝试完成的是在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
ql3eal8s

ql3eal8s1#

在与一些非常有帮助的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,您可以使用command模块或任何其他模块来代替raw。
如果要在远程Docker主机上执行此操作,请添加:

ansible_docker_extra_args: "-H=tcp://[docker-host]:[api port]"

添加到add_host块。
有关更完整的示例,请参阅Ansible文档。

sy5wg1nm

sy5wg1nm2#

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

docker exec container-name bash -l -c /path/to/script > /path/to/log

(See也称为"Why do I have to use bash -l -c inside my container?")
条件:

  • 可疑SSH用户具有docker exec权限
  • 在容器中,默认用户具有该脚本的权限(如果需要使用容器中具有脚本权限的另一个用户,则为docker exec -u user
  • /path/to/log是容器内的路径,可以在卷中共享。
cbeh67ev

cbeh67ev3#

您可以使用command module在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"'
u4dcyp6a

u4dcyp6a4#

由于Ansible 2.10docker_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
dojqjjoe

dojqjjoe5#

更新:有一种方法可以做到这一点,而不使用我的模块,请参阅我的其他答案

我写了一个简单的模块来在远程Docker主机上运行exec。我有submitted it to the ansible project,但是如果需要的话,你可以很容易地将它添加到你自己的项目中。这个模块只有23行长,从我的pull请求中提取它,并将它添加到你的./library目录中,然后你可以在你的剧本中添加一个任务,如下所示:

- 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 }}"
qgzx9mmu

qgzx9mmu6#

最后做了这样的事:

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

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

kpbwa7wx7#

要使用最新版本的Ansible在Docker容器内运行命令:

  • 使用以下命令安装community.dockercollection

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

有关使用集合的详细信息,请单击此处

相关问题