Команда запуска внутри контейнера 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 }}"