Команда запуска внутри контейнера Docker с использованием Ansible

Я пытаюсь выполнить команды внутри контейнера Docker, который уже был создан в Droplet с помощью Digital Ocean Ubuntu/Docker, используя 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

Ответы

Ответ 1

Вы должны иметь возможность выполнить script (с вашей последовательностью команд в нем) с 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 - это путь внутри контейнера, который может быть разделен в томе.

Ответ 2

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

Ответ 3

Вы можете запускать команды в контейнерах докеров, используя командный модуль. Например, этот код выполнит 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"'

Ответ 4

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

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