Допустим, мы хотим поставить Ansible в оффлайне.
Создаём Virtualenv ¶
Создадим виртуальное окружение для того, чтобы скачать все зависимости, но при этом не захватить ненароком лишнего.
Поставим virtualenv.
1
2
| python3 -m pip install --upgrade --user virtualenv
python3 -m pip virtualenv venv
|
Теперь можем активировать его.
Теперь до конца терминальной сессии, мы в изолированном Python virtualenv.
Готовим нужные пакеты ¶
Установив в чистом окружении только то, что нужно, мы заодно подтянем все зависимости, но кроме всего прочего, захватите с собой ещё setuptools и pip.
1
| python3 -m pip install --upgrade pip setuptools ansible
|
Теперь можем составить список того, что получилось.
1
| python3 -m pip freeze > requirements.txt
|
Можно просто дописать pip и setuptools в requirements.txt без указания версий (если их вообще нет в списке)
Пример requirements.txt
1
2
3
4
5
6
7
8
9
10
11
12
| ansible==3.4.0
ansible-base==2.10.11
cryptography==2.8
jinja2==2.11.3
netaddr==0.7.19
pbr==5.4.4
jmespath==0.9.5
ruamel.yaml==0.16.10
ruamel.yaml.clib==0.2.2
MarkupSafe==1.1.1
pip
setuptools
|
Имея список пакетов с зависимостями, мы можем их скачать даже без venv.
1
| python3 -m pip download --dest my-pip-packages -r requirements.txt
|
Для удобства, упакуем всё в архив.
1
| tar -cpvzf pips.tgz my-pip-packages requirements.txt
|
Устанавливаем в окружении без Интернета ¶
Python должен быть уже установлен заранее
Распакуем свой архив и установим всё что принесли. Pip и setuptools поставим отдельно в начале, а потом всё остальное.
Если команда выполняется не от имени суперпользователя, то нужно либо:
- Добавить
sudo
в начале - Добавить аргумент
--user
к pip-у для установки пакетов только для пользователя выполняющего команду
1
2
3
| tar -xpzvf pips.tgz
python3 -m pip install --upgrade --no-index --find-links python-packages pip setuptools
python3 -m pip install --upgrade --no-index --find-links my-pip-packages -r requirements.txt
|
Теперь можно запускать Ansible!
1
2
3
4
5
6
7
| root@289f34a67cbd:/host# ansible --version
ansible 2.10.11
config file = None
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/lib/python3.6/dist-packages/ansible
executable location = /usr/local/bin/ansible
python version = 3.6.9 (default, Jan 26 2021, 15:33:00) [GCC 8.4.0]
|
Локали ¶
Случалось так, что в сильно урезанном окружении, как, к примеру, Docker Ubuntu 18.04, утановка пакетов падает со следующей ошибкой.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| ERROR: Exception:
Traceback (most recent call last):
File "/usr/local/lib/python3.6/dist-packages/pip/_internal/cli/base_command.py", line 173, in _main
status = self.run(options, args)
File "/usr/local/lib/python3.6/dist-packages/pip/_internal/cli/req_command.py", line 203, in wrapper
return func(self, options, args)
File "/usr/local/lib/python3.6/dist-packages/pip/_internal/commands/install.py", line 316, in run
reqs, check_supported_wheels=not options.target_dir
...
File "/usr/local/lib/python3.6/dist-packages/pip/_internal/operations/prepare.py", line 249, in unpack_url
unpack_file(file.path, location, file.content_type)
File "/usr/local/lib/python3.6/dist-packages/pip/_internal/utils/unpacking.py", line 256, in unpack_file
untar_file(filename, location)
File "/usr/local/lib/python3.6/dist-packages/pip/_internal/utils/unpacking.py", line 226, in untar_file
with open(path, "wb") as destfp:
UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 117: ordinal not in range(128)
|
Решается установкой переменных окружения перед установкой пакетов.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| export LANGUAGE=""
export LANG="C.UTF-8"
export LC_CTYPE="C.UTF-8"
export LC_NUMERIC="C.UTF-8"
export LC_TIME="C.UTF-8"
export LC_COLLATE="C.UTF-8"
export LC_MONETARY="C.UTF-8"
export LC_MESSAGES="C.UTF-8"
export LC_PAPER="C.UTF-8"
export LC_NAME="C.UTF-8"
export LC_ADDRESS="C.UTF-8"
export LC_TELEPHONE="C.UTF-8"
export LC_MEASUREMENT="C.UTF-8"
export LC_IDENTIFICATION="C.UTF-8"
export LC_ALL="C.UTF-8"
|