Ansible не выполняет "command:" в docker
host: ubuntu 18.04
ansible: 2.9.20
docker-ce: 5:20.10.6~3-0~ubuntu-bionic
- name: test container
when:
- ansible_system == 'Linux'
- ansible_architecture == 'x86_64'
become: yes
docker_container:
name: test-01
hostname: ansible-ubuntu-20-04
image: diodonfrost/ansible-ubuntu:20.04
volumes:
- /tmp/roles:/root/.ansible/roles
output_logs: yes
state: started
command: touch /tmp/1
interactive: yes
tty: yes
Виртуалка с убунтой, в ней докер, в контейнерах планируется тестить код (абсолютная песочница). Всё создаётся и даже запускается, но результата как-то не вижу. Т.е. touch /tmp/1 висит, но не выполняется:
root@docker-test-01:~# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc82da6238a4 diodonfrost/ansible-ubuntu:20.04 "/sbin/init touch /tmp/1…" 6 seconds ago Up 4 seconds test-01
root@docker-test-01:~# docker container exec test-01 ls /tmp/
hsperfdata_root
root@docker-test-01:~#
Запуск из хоста - всё прекрасно отрабатывает:
root@docker-test-01:~# docker container exec -i -t test-01 touch /tmp/1
root@docker-test-01:~# docker container exec test-01 ls /tmp/
1
hsperfdata_root
root@docker-test-01:~#
Куда копать?
UPD. В ответ на комент:
root@docker-test-01:~# docker container ps -a --format "{{ .Command }}"
"/sbin/init w"
Не, после - тишина.
Ответы (1 шт):
Спасибо @aleksandr barakin за пинок в нужную сторону.
Т.к. стоит задача не просто запускать какой-то код, а запускать именно с целью посмотреть работает он или нет, то было бы неплохо, чтобы нам возвращался именно тот exit, который есть на самом деле. Вот комбинация параметров, которая делает то, что надо:
Тут идёт перезапись ENTRYPOINT ["/sbin/init"] из оригинального файла нашей командой curl. В command, который является обёрткой над CMD передаём параметры к curl и обязательно не забываем про detach: no. Без него ничего работать не будет:
- name: Create test container
when:
- ansible_system == 'Linux'
- ansible_architecture == 'x86_64'
become: yes
docker_container:
name: test-01
hostname: ansible-ubuntu-20-04
image: diodonfrost/ansible-ubuntu:20.04
volumes:
- /tmp/roles:/root/.ansible/roles
state: started
entrypoint: curl
command: --fail --head "http://example.com/123"
detach: no
Т.к. файла\каталога 123 нет - сервер нам вернёт 404, --fail скажет curl'у НЕ возвращать exit 0, а вернуть exit 22, а detach: no не будет превращать любой exit от команды в exit 0 самого ансибла. Получаем:
"msg": " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (22) The requested URL returned error: 404 Not Found\n",
"status": 22
}
PLAY RECAP *******************************************************************************************************
docker-test-01.local : ok=4 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
А вот если поменять command: --fail --head "http://example.com/123 на command: --fail --head "http://example.com/, то index.html на сервере будет, нам везде вернут exit 0 и выхлоп ансибла будет соответствующий:
"volumes_from": null,
"working_dir": null
}
}
}
META: ran handlers
META: ran handlers
PLAY RECAP *******************************************************************************************************
docker-test-01.local : ok=5 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0