Плейбук ансибл завершался с ошибкой

>>The module failed to execute correctly, you probably need to set the interpreter.\nSee stdout/stderr for the exact error
на целевом узле установлен Python 3.6.8, а ошибка связана с функциональностью, введенной в Python 3.7 и выше.Решение этой задачи осложнялось, так как обновить Python на CentOS 7 невозможно из-за EOL (End of Life) статуса.

Шаги для установки Python 3.8 из исходников:

Установите необходимые зависимости:

yum groupinstall "Development Tools"
yum install gcc openssl-devel bzip2-devel libffi-devel zlib-devel wget make

Скачайте исходный код Python 3.8:

wget https://www.python.org/ftp/python/3.8.10/Python-3.8.10.tgz

После того как файл скачан, распакуйте его:

tar -xvzf Python-3.8.10.tgz
cd Python-3.8.10

Теперь нужно настроить сборку с нужными параметрами. Запустите команду ./configure, чтобы подготовить исходный код Python для сборки:

 ./configure --enable-optimizations --prefix=/usr/local --enable-optimizations --prefix=/usr/local

--enable-optimizations включает дополнительные оптимизации для ускорения Python.
--prefix=/usr/local указывает, куда установить Python (по умолчанию это будет /usr/local/bin/python3.8)

После конфигурации можно начать процесс сборки:

make -j$(nproc)
make altinstall

После завершения установки, убедитесь, что Python 3.8 установлен корректно:

python3.8 --version

Чтобы сделать Python 3.8 доступным через команду python3.8, можно создать символическую ссылку:

ln -s /usr/local/bin/python3.8 /usr/bin/python3.8

Но в пайплайне вылезла ошибка

TASK [Gathering Facts] *********************************************************
fatal: [pop-demo]: FAILED! => {
"ansible_facts": {},
"changed": false,
"failed_modules": {
"ansible.legacy.setup": {
"failed": true,
"module_stderr": "Unauthorized access has denied!\nTraceback (most recent call last):\n File "", line 520, in _get_decompress_func\nModuleNotFoundError: No module named 'zlib'\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File "", line 568, in _get_data\n File "", line 523, in _get_decompress_func\nzipimport.ZipImportError: can't decompress data; zlib not available\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File "", line 107, in \n File "", line 99, in _ansiballz_main\n File "", line 44, in invoke_module\n File "", line 241, in load_module\n File "", line 709, in _get_module_code\n File "", line 570, in _get_data\nzipimport.ZipImportError: can't decompress data; zlib not available\n",
"module_stdout": "",
"msg": "MODULE FAILURE\nSee stdout/stderr for the exact error",
"rc": 1
}
}
}

я не стал пересобирать с модулем zlib, пошел другим путем.

Установка rh-python38

Поправим репозиторий

cat /etc/yum.repos.d/centos-sclo-rh.repo
[centos-sclo-rh]
name=CentOS-7 - SCLo rh
baseurl=http://vault.centos.org/centos/7/sclo/$basearch/rh/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo

Чистим кеш и ставим

sudo yum clean all
sudo yum makecache
sudo yum install rh-python38

Комментарии (15)


  1. SLASH_CyberPunk
    25.12.2024 12:49

    И у вас не будет python под root пользователем, т.к. /usr/local/bin не относится к PATH у root.

    Захотите переделать на root через /usr/bin и отвалится pip и необходимо будет очень много "приседаний" почти как у redhat разработчиков:

    * Mon Jun 26 2017 Michal Cyprian <mcyprian@redhat.com> - 3.6.1-9
    - Make pip and distutils in user environment install into separate location

    P.S. подобная статья на хабре уже есть для python3.10, которую так же взяли из ChatGPT...


    1. dinky Автор
      25.12.2024 12:49

      С статье сказано, как решить вопрос с /usr/bin.
      >>ссылку:sudo ln -s /usr/local/bin/python3.8 /usr/bin/python3.8sudo ln -s /usr/local/bin/pip3.8 /usr/bin/pip3.8
      pip ansible не нужен


      1. SLASH_CyberPunk
        25.12.2024 12:49

        Это не решение =))


        1. dinky Автор
          25.12.2024 12:49

          я не спорю, от centos 7 нужно уходить. Это вопрос времени. А пока - мой костыль.


    1. dinky Автор
      25.12.2024 12:49

      подобная статья на хабре уже есть для python3.10, которую так же взяли из ChatGPT

      Я не нашел. Поэтому написал свой велосипед.


  1. CrazyElf
    25.12.2024 12:49

    Поместите код в соответствующую разметку, тяжело без этого код на глаз воспринимать.


    1. dinky Автор
      25.12.2024 12:49

      Исправил. Так лучше?


      1. CrazyElf
        25.12.2024 12:49

        Вы использовали "цитату", а не "код". Так уже лучше, но могло быть ещё лучше )


        1. dinky Автор
          25.12.2024 12:49

          исправил, спасибо


          1. CrazyElf
            25.12.2024 12:49

            Вот теперь правильно, спасибо )


  1. mixsture
    25.12.2024 12:49

    Чтобы сделать Python 3.8 доступным через команду python (если вы не используете полную команду python3.8), можно создать символическую ссылку:
    sudo ln -s /usr/local/bin/python3.8 /usr/bin/python3.8
    sudo ln -s /usr/local/bin/pip3.8 /usr/bin/pip3.8

    И нет, это переносит между местами запуска для рута и обычного пользователя, а вот под описание "через команду python" не подходит.

    Беда чатжпт - что его нужно тщательно проверять, что требует ничуть не меньших знаний.


    1. dinky Автор
      25.12.2024 12:49

      сделал текст более человечным
      почему я сразу нормально понимаю chatGPT, wake up Neo, matrix has you :)


  1. mixsture
    25.12.2024 12:49

    Еще я бы предложил после этих действий прибраться за собой: удалить пакеты, нужные исключительно для разработки.
    И раз вы собираетесь поддерживать вышедший из техподдержки линукс - то рано или поздно не сможете через пакетный менеджер установить пакеты разработки, а значит число собираемых из исходников пакетов будет расти и будет напоминать целую экосистему вокруг требуемого пакета. Поэтому, имхо, собирать следует на отдельной машине статические версии (https://wiki.python.org/moin/BuildStatically), а уже потом их распространять на боевые. Тем более, что вы писали вначале про ансибл - наверно, собирались устанавливать это на большом числе машин - устанавливать уже собранный статический пакет намного проще.


    1. dinky Автор
      25.12.2024 12:49

      От centos 7 нужно уходить - это вопрос времени. А пока - мой костыль.
      В данной задаче я молодец пайплайн запустился. И я поделился решением.


  1. phaggi
    25.12.2024 12:49

    На мой взгляд, это совершенно бесполезная трата времени. Python, встроенный в систему, не нужно трогать вообще.

    Кроме того, у Python специально реализованы возможности создавать окружения и в них использовать любую нужную версию как Python так и другого ПО, причем совершенно не трогая другие версии. Python можно устанавливать на комп хоть все версии сразу в разные папки и они будут мирно сосуществовать. Просто активируй нужное окружение с нужной в твоем проекте версией, и радуйся.