it-swarm.com.ru

Выполнить команду внутри контейнера Docker с помощью 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
31
Nigel Earle

Вы должны быть в состоянии выполнить скрипт (с вашей последовательностью команд в нем) с помощью docker exec :

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

(Смотрите также " Почему я должен использовать bash -l -c внутри моего контейнера? ")

  • /path/to/script должен быть доступен вашему процессу Ansible.
  • /path/to/log - это путь внутри контейнера, который может использоваться совместно в томе.
17
VonC

После обсуждения с некоторыми очень полезными разработчиками 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), вы можете использовать командный модуль или любой другой модуль вместо raw.

Если вы хотите сделать это на удаленном хосте докера, добавьте:

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

в блок add_Host.

Смотрите Ansible документация для более полного примера.

35
Bernie

Вы можете запускать команды в Docker-контейнерах, используя командный модуль Например, этот код будет выполнять echo "Hello1" а также echo "Hello2" in my_container :

   tasks:
        - name: Execute commands in docker container
          command: docker exec -it my_container bash -c 'echo "Hello1"; echo "Hello2"'
7
Ander

Обновление: есть способ сделать это без использования моего модуля, см. Мой другой ответ

Я написал простой модуль для запуска exec на удаленном Docker Host. Я отправил это в ANSIBLE проект , но вы можете легко добавить его в свои собственные проекты, если вам нужно. Модуль имеет длину всего 23 строки, возьмите его из моего запроса на извлечение и добавьте его в каталог ./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
Bernie