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

Как я могу использовать Ansible для выполнения задач в контейнерах lxc на удаленном сервере?

Мы используем Ansible для развертывания нашего кода на нескольких серверах (физических и виртуальных машинах).

До сих пор каждый экземпляр имел общедоступный IP-адрес и работающий ssh-сервер, так что все работало как шарм. Но недавно нам пришлось выполнить развертывание на двух контейнерах lxc на удаленном сервере.

Эти два контейнера привязаны к серверу и не запускают ssh-сервер (и мы хотели бы оставить его таким). Я могу подключиться к ним только с помощью ssh, чтобы связаться с физическим хостом, а затем подключиться к ним lxc.

Единственный способ, который я нашел, - это настраиваемый плагин, который никогда не обновлялся для последней версии Ansible 2.0 . Я также обратился к списку рассылки безрезультатно.

Кому-нибудь удавалось использовать Ansible в такой конфигурации?

3
задан 20 January 2016 в 12:04
3 ответа

Ну, так как я не мог найти решение, в итоге я запустил 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
0
ответ дан 3 December 2019 в 07:25

Попробуйте 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'а.

.
1
ответ дан 3 December 2019 в 07:25

Я нашел простой способ, который не требует плагинов или настройки 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... .

0
ответ дан 23 October 2020 в 20:47

Теги

Похожие вопросы