Вопрос или проблема
Я пытаюсь загрузить статический сайт в контейнер LXD. Я мог бы использовать lxc file push
для каждого файла, но решил загрузить один архив, а затем разобраться с ним. Я могу выполнить команду tar -xvf /home/ubuntu/public.tar.gz
, когда вошел в контейнер. Я успешно загружаю архив, но следующие задачи ansible не создают /home/ubuntu/public
:
- name: Загрузить {{ app_dir }}/public.tar.gz в контейнер
ansible.builtin.shell:
cmd: lxc file push {{app_dir}}/public.tar.gz {{ lxc_name }}{{ deploy_dir }}/public.tar.gz
- name: Извлечь /home/ubuntu/public.tar.gz в контейнере
ansible.builtin.shell:
cmd: lxc exec {{ lxc_name }} -- sh -c "tar -xvf /home/{{ lxc_user }}/public.tar.gz"
Я заметил, что извлеченные файлы находятся в /root/public
. Проведя немного времени с документацией LXD, я получил желаемые результаты с несколькими дополнительными флагами:
- name: Извлечь /home/ubuntu/public.tar.gz в контейнере
ansible.builtin.shell:
cmd: lxc exec {{ lxc_name }} --user 1000 --group 1000 --cwd /home/ubuntu -- sh -c "tar -xzvf public.tar.gz"
Ответ или решение
Как использовать Ansible для извлечения tarball в контейнере LXD
Вопрос о том, как оптимально передать статический веб-сайт в контейнер LXD, сопровождается необходимостью упаковать файлы в архив. Вместо того чтобы загружать каждую отдельную часть файла с помощью lxc file push
, целесообразно воспользоваться архивами. Ниже приведены улучшенные задачи Ansible, которые помогут вам это сделать.
Проблема
На первом этапе вы успешно загрузили архив в контейнер, но при извлечении возникли сложности с тем, куда помещаются распакованные файлы. Это связано с тем, что команда tar
выполняется в контексте пользователя root, что приводит к тому, что файлы извлекаются в /root/public
, а не в требуемую директорию пользователя.
Решение
Вы смогли решить эту проблему, добавив несколько флагов к команде lxc exec
. Это правильный путь для достижения желаемого результата, и я бы рекомендовал следующие шаги для оптимизации:
- Передача файла в контейнер
- Извлечение архива с указанием пользовательских прав
Код Ansible
Вот как должны выглядеть ваши задачи Ansible:
- name: Push {{ app_dir }}/public.tar.gz to container
ansible.builtin.shell:
cmd: lxc file push {{ app_dir }}/public.tar.gz {{ lxc_name }}{{ deploy_dir }}/public.tar.gz
- name: Extract /home/ubuntu/public.tar.gz in container
ansible.builtin.shell:
cmd: lxc exec {{ lxc_name }} --user 1000 --group 1000 --cwd /home/ubuntu -- sh -c "tar -xzvf public.tar.gz"
Пояснения к командам
-
Передача файла:
- Используется модуль
ansible.builtin.shell
для выполнения командыlxc file push
. Убедитесь, что указанные переменные (app_dir
,lxc_name
,deploy_dir
) корректны и соответствуют вашим настройкам окружения.
- Используется модуль
-
Извлечение файла:
--user 1000 --group 1000
— эти параметры определяют пользователя и группу для выполнения команды. Обычно UID и GID 1000 сопоставляются с первым созданным пользователем в системе, что гарантирует доступ к нужным директориям.--cwd /home/ubuntu
— устанавливает рабочий каталог перед выполнением команды, тем самым упрощая путь к архиву.
Вывод
Данная настройка позволяет вам эффективно управлять жизненным циклом ваших приложений и агрегацией файлов в контейнерах LXD с использованием Ansible. Как специалист в информационных технологиях, важно помнить о правам доступа и контексте выполнения команд, чтобы избежать неожиданных ситуаций. Следуя предоставленным рекомендациям, вы сможете без проблем развернуть ваш статический веб-сайт в контейнере LXD.