Как я могу использовать Ansible для выполнения задач в контейнерах lxc на удаленном сервере?
Мы используем Ansible для развертывания нашего кода на нескольких серверах (физических и виртуальных машинах).
До сих пор каждый экземпляр имел общедоступный IP-адрес и работающий ssh-сервер, так что все работало как шарм. Но недавно нам пришлось выполнить развертывание на двух контейнерах lxc на удаленном сервере.
Эти два контейнера привязаны к серверу и не запускают ssh-сервер (и мы хотели бы оставить его таким). Я могу подключиться к ним только с помощью ssh, чтобы связаться с физическим хостом, а затем подключиться к ним lxc.
Единственный способ, который я нашел, - это настраиваемый плагин, который никогда не обновлялся для последней версии Ansible 2.0 . Я также обратился к списку рассылки безрезультатно.
Кому-нибудь удавалось использовать Ansible в такой конфигурации?
Ну, так как я не мог найти решение, в итоге я запустил ssh-сервер на каждом контейнере lxc.
Вот мой пример .ssh / config
:
Host main_server
HostName server_address
User root
Port 2022
ForwardAgent yes
Host lxc_container
User root
Port 22
ProxyCommand ssh main_server nc lxc_container 22
ForwardAgent yes
Попробуйте asible-lxc-ssh соединительный плагин от Пьера Шиффлье, который работает с Ansible 2.x. Я поместил плагин в место по умолчанию, определенное в ansible.cfg, /usr/share/ansible_plugins/connection_plugins/
В файле инвентарных хостов, /etc/ansible/hosts, я поместил следующее
[containers]
container_01 ansible_host=lxc_server ansible_connection=lxc_ssh ansible_ssh_extra_args=container_01
Обратите внимание, что вы должны передать имя контейнера в виде ssh extra arg. Обязательно замените lxc_server на имя вашего lxc host'а.
.Я нашел простой способ, который не требует плагинов или настройки ssh. Это кажется глупым, но в моих тестах это работает очень хорошо. Все, что нужно, это изменить переменную ansible_python_interpreter
, чтобы запустить все внутри контейнера lxc. Измените name_of_lxc_container
ниже на имя вашего контейнера.
<<< tasks to run on the remote host >>>
- name: BEGIN lxc exec ...
set_fact:
ansible_python_interpreter: lxc exec name_of_lxc_container -- /usr/bin/python3
<<< tasks to run in the lxc container >>>
- name: END lxc exec ...
set_fact:
ansible_python_interpreter: /usr/bin/python3
<<< more tasks to run on the remote host >>>
Обновление: этот трюк не работает с модулями copy
или unarchive
при копировании с контроллера на удаленный. Вместо этого вне блока BEGIN.. END используйте Ansible copy
в /tmp
, а затем lxc file push...
.